iTOP-4412¿ª·¢°åÈçºÎ¿ØÖÆLED·¢¹â¶þ¼«¹Ü£¿
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
:register device failed!\n");

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¡£
  • ÍúÍú×Éѯ
  • µãÕâÀï¸øÎÒ·¢ÏûÏ¢
  • µç»°×Éѯ

  • 01085270716
XML 地图