日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

LED驅(qū)動(dòng)(輪詢方式)在FL2440的開(kāi)發(fā)(2.6.33.7內(nèi)核)

 lchjczw 2012-04-10
一、開(kāi)發(fā)環(huán)境
    主   機(jī):fedora 14 (2.6.33.7)
    開(kāi)發(fā)板:FL2440(nandflash:K9F1G08 128m)
    編譯器:arm-linux-gcc 4.3.2
 
二、原理分析
    1.  硬件原理圖分析。由原理圖得知LED電路是共陽(yáng)極的,LED0、LED1、LED2、LED3分別由2440的GPB5、GPB6、GPB8、GPB10口控制的,當(dāng)GPB5、GPB6、GPB8、GPB10輸出低電平時(shí),相應(yīng)的LED便發(fā)亮,反之,LED則熄滅。
 
三、實(shí)現(xiàn)步驟
    1. 去掉內(nèi)核已有的LED驅(qū)動(dòng)設(shè)置,因?yàn)镮O口與mini2440開(kāi)發(fā)板的不一致,根本就不能控制板上的LED。
  1. #gedit arch/arm/plat-s3c24xx/common-smdk.c
  1. /* LED devices */
  2. /*
  3. static struct s3c24xx_led_platdata smdk_pdata_led4 = {
  4.     .gpio = S3C2410_GPF4,
  5.     .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
  6.     .name = "led4",
  7.     .def_trigger = "timer",
  8. };

  9. static struct s3c24xx_led_platdata smdk_pdata_led5 = {
  10.     .gpio = S3C2410_GPF5,
  11.     .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
  12.     .name = "led5",
  13.     .def_trigger = "nand-disk",
  14. };

  15. static struct s3c24xx_led_platdata smdk_pdata_led6 = {
  16.     .gpio = S3C2410_GPF6,
  17.     .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
  18.     .name = "led6",
  19. };

  20. static struct s3c24xx_led_platdata smdk_pdata_led7 = {
  21.     .gpio = S3C2410_GPF7,
  22.     .flags = S3C24XX_LEDF_ACTLOW | S3C24XX_LEDF_TRISTATE,
  23.     .name = "led7",
  24. };

  25. static struct platform_device smdk_led4 = {
  26.     .name = "s3c24xx_led",
  27.     .id = 0,
  28.     .dev = {
  29.         .platform_data = &smdk_pdata_led4,
  30.     },
  31. };

  32. static struct platform_device smdk_led5 = {
  33.     .name = "s3c24xx_led",
  34.     .id = 1,
  35.     .dev = {
  36.         .platform_data = &smdk_pdata_led5,
  37.     },
  38. };

  39. static struct platform_device smdk_led6 = {
  40.     .name = "s3c24xx_led",
  41.     .id = 2,
  42.     .dev = {
  43.         .platform_data = &smdk_pdata_led6,
  44.     },
  45. };

  46. static struct platform_device smdk_led7 = {
  47.     .name = "s3c24xx_led",
  48.     .id = 3,
  49.     .dev = {
  50.         .platform_data = &smdk_pdata_led7,
  51.     },
  52. };*/
  1. static struct platform_device __initdata *smdk_devs[] = {
  2.     &s3c_device_nand,
  3.     /*&smdk_led4,
  4.     &smdk_led5,
  5.     &smdk_led6,
  6.     &smdk_led7,*/
  7. };
  1. void __init smdk_machine_init(void)
  2. {
  3.     /* Configure the LEDs (even if we have no LED support)*/
  4.     /*
  5.     s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
  6.     s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
  7.     s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);
  8.     s3c2410_gpio_cfgpin(S3C2410_GPF7, S3C2410_GPF7_OUTP);

  9.     s3c2410_gpio_setpin(S3C2410_GPF4, 1);
  10.     s3c2410_gpio_setpin(S3C2410_GPF5, 1);
  11.     s3c2410_gpio_setpin(S3C2410_GPF6, 1);
  12.     s3c2410_gpio_setpin(S3C2410_GPF7, 1);*/

  13.     if (machine_is_smdk2443())
  14.         smdk_nand_info.twrph0 = 50;

  15.     s3c_device_nand.dev.platform_data = &smdk_nand_info;

  16.     platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));

  17.     s3c_pm_init();
  18. }

    2. 編寫適合fl2440開(kāi)發(fā)板的LED驅(qū)動(dòng),代碼如下,文件名稱:fl2440_leds.c

  1. /*
  2.  *==============================================
  3.  *Name : fl2440_leds.c
  4.  *Author : y.q.yang
  5.  *Date : 17/2/2011
  6.  *Copyright : GPL
  7.  *Description : fl2440 leds driver
  8.  *==============================================
  9.  */

  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/init.h>
  13. #include <linux/errno.h>
  14. #include <linux/fs.h>
  15. //#include <linux/sched.h>
  16. //#include <linux/poll.h>    //poll要用到的頭文件

  17. #include <mach/hardware.h>
  18. #include <mach/regs-gpio.h>
  19. #include <mach/gpio-fns.h>
  20. #include <mach/gpio-nrs.h>

  21. #define DEVICER_NAME    "fl2440_leds"
  22. #define DEVICER_MAJOR    231
  23. #define LED_ON            0
  24. #define LED_OFF            1
  25. #define LED_COUNT        4

  26. #define S3C2410_GPIONO(bank,offset) ((bank) + (offset))
  27. #define S3C2410_GPIO_BANKB (32*1)
  28. #define S3C2410_GPB5 S3C2410_GPIONO(S3C2410_GPIO_BANKB, 5)
  29. #define S3C2410_GPB6 S3C2410_GPIONO(S3C2410_GPIO_BANKB, 6)
  30. #define S3C2410_GPB8 S3C2410_GPIONO(S3C2410_GPIO_BANKB, 8)
  31. #define S3C2410_GPB10 S3C2410_GPIONO(S3C2410_GPIO_BANKB, 10)

  32. #define S3C2410_GPB5_OUTP    (0x01 << 10)
  33. #define S3C2410_GPB6_OUTP    (0x01 << 12)
  34. #define S3C2410_GPB8_OUTP    (0x01 << 16)
  35. #define S3C2410_GPB10_OUTP    (0x01 << 20)


  36. //硬件設(shè)備資源結(jié)構(gòu)體
  37. struct led_desc
  38. {
  39.     int pin;            //對(duì)應(yīng)的IO引腳
  40.     int pin_setting;    //引腳配置
  41. };

  42. static struct led_desc led_configs[] =
  43. {
  44.     {S3C2410_GPB5,S3C2410_GPB5_OUTP},
  45.     {S3C2410_GPB6,S3C2410_GPB6_OUTP},
  46.     {S3C2410_GPB8,S3C2410_GPB8_OUTP},
  47.     {S3C2410_GPB10,S3C2410_GPB10_OUTP},
  48. };

  49. static int leds_open(struct inode *inode, struct file *filp)
  50. {
  51.     return 0;
  52. }

  53. static int leds_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
  54. {
  55.     if(arg<0 || arg>3)
  56.     {
  57.         return -EINVAL;
  58.     }
  59.     
  60.     switch(cmd)
  61.     {
  62.         case LED_ON:
  63.             s3c2410_gpio_setpin(led_configs[arg].pin,~(LED_ON));
  64.             break;
  65.             
  66.         case LED_OFF:
  67.             s3c2410_gpio_setpin(led_configs[arg].pin,~(LED_OFF));
  68.             break;
  69.             
  70.         default:
  71.             return -EINVAL;
  72.     }
  73.     return 0;
  74. }

  75. struct file_operations leds_fops =
  76. {
  77.     .owner = THIS_MODULE,
  78.     .open = leds_open,
  79.     .ioctl = leds_ioctl,
  80. };

  81. static int __init led_init(void)
  82. {
  83.     int i,ret;
  84.     
  85.     for(i=0; i<LED_COUNT; i++)
  86.     {
  87.         s3c2410_gpio_cfgpin(led_configs[i].pin, led_configs[i].pin_setting);
  88.         s3c2410_gpio_setpin(led_configs[i].pin,~(LED_OFF));
  89.     }
  90.     
  91.     ret = register_chrdev(DEVICER_MAJOR, DEVICER_NAME, &leds_fops);
  92.     
  93.     if(ret < 0)
  94.     {
  95.         printk(DEVICER_NAME "register failed\n");
  96.         return ret;
  97.     }
  98.     
  99.     return ret;
  100. }

  101. static void __exit led_exit(void)
  102. {
  103.     unregister_chrdev(DEVICER_MAJOR, DEVICER_NAME);
  104. }

  105. module_init(led_init);
  106. module_exit(led_exit);

  107. MODULE_LICENSE("GPL");
  108. MODULE_AUTHOR("y.q.yang");
  109. MODULE_DESCRIPTION("FL2440 led driver");

    3. 把LED驅(qū)動(dòng)代碼部署到內(nèi)核中去

  1. #cp -f fl2440_leds.c /linux-2.6.33.7/drivers/char //把驅(qū)動(dòng)源碼復(fù)制到內(nèi)核驅(qū)動(dòng)的字符設(shè)備下
  2. #vim /linux-2.6.33.7/drivers/char/Kconfig //添加LED設(shè)備配置
  3. config FL2440_LEDS
  4.     tristate "FL2440 Leds Device"
  5.     depends on ARCH_S3C2440
  6.     default y
  7.     ---help---
  8.       FL2440 User Leds

  9. #gedit /linux-2.6.33.7/drivers/char/Makefile //添加LED設(shè)備配置
  10. obj-$(CONFIG_FL2440_LEDS) += fl2440_leds.o

    4. 配置內(nèi)核,選擇LED設(shè)備選項(xiàng)

  1. #make menuconfig
  2. Device Drivers --->
  3.     Character devices --->
  4.         <*> FL2440 Leds Device (NEW)

    5. 編譯內(nèi)核并下載到開(kāi)發(fā)板上,查看已加載的設(shè)備:#cat /proc/devices,可以看到fl2440_leds的主設(shè)備號(hào)為231

  1. [root@yyq2440 /]# cat /proc/devices
  1. 90 mtd
  2.  99 ppdev
  3. 116 alsa
  4. 128 ptm
  5. 136 pts
  6. 180 usb
  7. 188 ttyUSB
  8. 189 usb_device
  9. 204 s3c2410_serial
  10. 231 fl2440_leds
  11. 232 fl2440_buttons
  12. 254 rtc

  13. Block devices:
  14.   1 ramdisk
  15. 259 blkext

四、測(cè)試驅(qū)動(dòng)

    1. 編寫應(yīng)用程序測(cè)試LED驅(qū)動(dòng),文件名:leds_test.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fcntl.h>
  4. #include <sys/ioctl.h>

  5. int main(int argc, char **argv)
  6. {
  7.     int turn, index, fd;

  8.     //檢測(cè)輸入的參數(shù)合法性
  9.     if(argc != 3 || sscanf(argv[2], "%d", &index) != 1 || index < 1 || index > 4)
  10.     {
  11.         printf("Usage: leds_test on|off 1|2|3|4\n");
  12.         exit(1);
  13.     }

  14.     if(strcmp(argv[1], "on") == 0)
  15.     {
  16.         turn = 1;
  17.     }
  18.     else if(strcmp(argv[1], "off") == 0)
  19.     {
  20.         turn = 0;
  21.     }
  22.     else
  23.     {
  24.         printf("Usage: leds_test on|off 1|2|3|4\n");
  25.         exit(1);
  26.     }

  27.     //打開(kāi)LED設(shè)備
  28.     fd = open("/dev/fl2440_leds", 0);

  29.     if(fd < 0)
  30.     {
  31.         printf("Open Led Device Faild!\n");
  32.         exit(1);
  33.     }

  34.     //IO控制
  35.     ioctl(fd, turn, index - 1);

  36.     //關(guān)閉LED設(shè)備
  37.     close(fd);

  38.     return 0;
  39. }

    2. 在開(kāi)發(fā)主機(jī)上交叉編譯測(cè)試應(yīng)用程序,并復(fù)制到文件系統(tǒng)的/usr/sbin目錄下,然后重新編譯文件系統(tǒng)下載到開(kāi)發(fā)板上

  1. #arm-linux-gcc -o leds_test leds_test.c

    3. 在開(kāi)發(fā)板上的文件系統(tǒng)中創(chuàng)建一個(gè)LED設(shè)備的節(jié)點(diǎn),然后運(yùn)行測(cè)試程序,效果圖如下,觀測(cè)開(kāi)發(fā)板上的LED燈,可以看到每一步的操作對(duì)應(yīng)的LED會(huì)點(diǎn)亮或者熄滅

  1. [root@yyq2440 /]# mknod /dev/fl2440_leds c 231 0
  2. [root@yyq2440 /]# leds_test --help
  3. Usage: leds_test on|off 1|2|3|4

  4. [root@yyq2440 /]# leds_test on 1
  5. [root@yyq2440 /]# leds_test on 2
  6. [root@yyq2440 /]# leds_test on 3
  7. [root@yyq2440 /]# leds_test on 4
  8. [root@yyq2440 /]# leds_test on 4
  9. [root@yyq2440 /]# leds_test on 3
  10. [root@yyq2440 /]# leds_test on 2
  11. [root@yyq2440 /]# leds_test on 1

五、存在問(wèn)題。

    當(dāng)執(zhí)行#leds_test off *(*表示LED的序號(hào)1~4)的時(shí)候,序號(hào)比*大的Led也會(huì)一起滅掉。原因暫時(shí)還沒(méi)找到。

 

2011-02-17

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多