iTOP-4412¿ª·¢°åÈçºÎ¿ØÖÆLED·¢¹â¶þ¼«¹Ü£¿
2014-06-12
2014-06-12
iTOP-4412¾«Ó¢°æÉÏÌṩÁËÁ½¸öLED·¢¹â¶þ¼«¹Ü£¬ÔÀíͼÈçÏÂËùʾ£º

´ÓÉÏÃæµÄÔÀíͼ¿ÉÒÔ¿´µ½Á½¸öLEDµÄÒ»¶ËÁ¬½Óµ½µçÔ´VSYSÉÏ£¬ÁíÒ»¶Ëͨ¹ýÈý¼«¹Ü½ÓµØ£¬Í¨¹ý¿ØÖÆÈý¼«¹ÜµÄ»ù¼«£¬¿ÉÒÔµãÁÁ»ò¹Ø±ÕLED¡£Á½¸öÈý¼«¹ÜµÄ»ù¼«·Ö±ðͨ¹ýµ×°åÁ¬½Óµ½ºËÐİåÉÏExynos 4412µÄGPIO GPL2_0ºÍGPK1_1ÉÏ¡£
ÉÏÒ»Õ½ÚÒѾ½²¹ýiTOP-4412¿ª·¢°åÖÐGPIOµÄÇý¶¯£¬LEDµÄÇý¶¯ÀïÃæ½«»áÓõ½ÉÏÒ»Õ½ڽéÉܵö²Ù×÷GPIOµÄº¯Êý¡£
LEDÇý¶¯µÄÈë¿Úº¯ÊýÊÇleds_init£¬ÆäʵÏÖÈçÏ£º
static int __init leds_init(void)
{
return platform_driver_register(&leds_driver);
}
¸Ãº¯Êý»áµ÷ÓÃÄں˺¯Êýplatform_driver_registerÏòÄÚºË×¢²áÒ»¸öÓ²¼þÉ豸£¬Õâ¸öº¯ÊýµÄ²ÎÊýÊÇÒ»¸öplatform_driver½á¹¹£¬leds_driver¶¨ÒåÈçÏ£º
static struct platform_driver leds_driver = {
.probe = leds_probe,
.remove = leds_remove,
.suspend = leds_suspend,
.resume = leds_resume,
.driver = {
.name = DRIVER_NAME,
.owner = THIS_MODULE,
},
};
Äں˵÷ÓÃplatform_driver_register×¢²áÓ²¼þÉ豸µÄʱºò£¬×îÖÕ»áµ÷Óõ½platform_driver½á¹¹ÀïÃæµÄprobe̽²âº¯Êý£¬iTOP-4412¿ª·¢°åµÄLEDÇý¶¯Àï̽²âº¯ÊýÊÇleds_probe£¬¶¨ÒåÈçÏ£º
static int leds_probe(struct platform_device *pdev)
int ret, i;
char *banner = "leds Initialize\n";
printk(banner);
for(i=0; i< LED_NUM; i++ )
{
ret = gpio_request(led_gpios[i], "LED");
if (ret) {
printk("%s: request GPIO %d for LED failed, ret = %d\n", DRIVER_NAME,
led_gpios[i], ret);
return ret;
}
s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);
gpio_set_value(led_gpios[i], 1);
}
ret = misc_register(&leds_dev);
if(ret<0)
{
printk("leds
goto exit;
}
return 0;
exit:
misc_deregister(&leds_dev);
return ret;
}
ÔÚÕâ¸öº¯ÊýÀï»áʹÓÃGPIOµÄ²Ù×÷º¯ÊýÀ´ÅäÖÃLEDµÄÁ½¸öGPIOÒý½ÅµÄ¹¦ÄÜΪÊä³ö£¬Ä¬ÈÏÊä³ö¸ßµçƽ¡£¿ØÖÆLEDµÄÁ½¸öGPIOµÄ¶¨ÒåÔÚÊý×éled_gpiosÖУ¬ÈçÏ£º
static int led_gpios[] = {
EXYNOS4_GPL2(0),
EXYNOS4_GPK1(1),
};
½Óׯص½LEDµÄ̽²âº¯ÊýÍùÏ¿´£¬½Ó×Å»áµ÷ÓÃmisc_registerÏòÄÚºË×¢²á×Ö·ûÉ豸¡£misc_registerº¯Êý´«µÝµÄ²ÎÊýÀàÐÍÊÇmiscdevice£¬miscdevice±»³Æ×÷ÔÓÏîÉ豸£¬Ç¶ÈëʽϵͳÖÐÓõñȽ϶àµÄÒ»ÖÖÉ豸Çý¶¯¡£ÔÚLinuxÄں˵Äinclude/linuxĿ¼ÏÂÓÐMiscdevice.hÎļþ£¬Òª°Ñ×Ô¼º¶¨ÒåµÄmisc device´ÓÉ豸ºÅ¶¨ÒåÔÚÕâÀï¡£ÆäʵÊÇÒòΪÕâЩ×Ö·ûÉ豸²»·ûºÏÔ¤ÏÈÈ·¶¨µÄ×Ö·ûÉ豸·¶³ë£¬ËùÓÐÕâЩÉ豸²ÉÓÃÖ÷±àºÅ10 £¬Ò»Æð¹éÓÚmisc device£¬Æäʵmisc_register¾ÍÊÇÓÃÖ÷±êºÅ10µ÷ÓÃregister_chrdev()µÄ¡£iTOP-4412¿ª·¢°åµÄLEDÇý¶¯ÀïmiscdeviceµÄ½á¹¹¶¨ÒåÈçÏ£º
static struct miscdevice leds_dev = {
.minor = MISC_DYNAMIC_MINOR,
.fops = &leds_ops,
.name = "leds",
};
´ÓÉÏÃæµÄ¶¨Òå¿ÉÒÔ¿´µ½minor´ÎÉ豸ºÅ¶¨Òå³ÉÁËMISC_DYNAMIC_MINOR£¬ÔÚmisc×ÓϵͳÀïÈç¹û´ËÉ豸ºÅ¶¨Òå³ÉMISC_DYNAMIC_MINOR£¬ÄÇôÔÚÇý¶¯×¢²áµÄʱºò£¬Äں˻ᶯ̬µÄΪÕâ¸öÉ豸·ÖÅä×ÓÉ豸ºÅ¡£LEDÇý¶¯»áÔÚ/devu¼Ï´´½¨É豸½Úµãleds¡£
Çý¶¯ÀïÃæÌṩÁËÉ豸ÎļþµÄ¼¸¸ö²Ù×÷º¯Êýopen,release,ioctl£¬ÉϲãÓ¦ÓÃÊ×Ïȵ÷ÓÃopenº¯Êý´ò¿ªledsÉ豸£¬È»ºóµ÷ÓÃioctlÀ´ÉèÖÃledµÄÁÁÃð¡£leds_ioctlº¯ÊýµÄʵÏÖÈçÏÂËùʾ£º
long leds_ioctl(struct file *filp,unsigned int cmd,unsigned long arg)
{
printk("debug: leds_ioctl cmd is %d\n" , cmd);
switch(cmd)
{
case 0:
case 1:
if (arg > LED_NUM) {
return -EINVAL;
}
gpio_set_value(led_gpios[arg], cmd);
break;
default:
return -EINVAL;
}
return 0;
}
ͨ¹ýÉÏÃæµÄ´úÂ룬¿ÉÒÔÖªµÀÉϲãÓ¦ÓÃʹÓÃioctl£¬ÐèÒª´«µÝÁ½¸ö²ÎÊýcmdºÍarg£¬cmdÊÇledµÄ״̬£¨0ÊÇÃð£¬1ÊÇÁÁ£©£¬argÊÇ´ú±í²Ù×÷Äĸöled¡£