乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       lchjczw 2012-04-10
      一、開發(fā)環(huán)境
          主   機:fedora 14 (2.6.33.7)
          開發(fā)板:FL2440(nandflash:K9F1G08 128m)
          編譯器:arm-linux-gcc 4.3.2
       
      二、原理分析
          1.  硬件原理圖分析。由原理圖得知LED電路是共陽極的,LED0、LED1、LED2、LED3分別由2440的GPB5、GPB6、GPB8、GPB10口控制的,當GPB5、GPB6、GPB8、GPB10輸出低電平時,相應(yīng)的LED便發(fā)亮,反之,LED則熄滅。
       
      三、實現(xiàn)步驟
          1. 去掉內(nèi)核已有的LED驅(qū)動設(shè)置,因為IO口與mini2440開發(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開發(fā)板的LED驅(qū)動,代碼如下,文件名稱: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;            //對應(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ū)動代碼部署到內(nèi)核中去

      1. #cp -f fl2440_leds.c /linux-2.6.33.7/drivers/char //把驅(qū)動源碼復(fù)制到內(nèi)核驅(qū)動的字符設(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è)備選項

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

          5. 編譯內(nèi)核并下載到開發(fā)板上,查看已加載的設(shè)備:#cat /proc/devices,可以看到fl2440_leds的主設(shè)備號為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

      四、測試驅(qū)動

          1. 編寫應(yīng)用程序測試LED驅(qū)動,文件名: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.     //檢測輸入的參數(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.     //打開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. 在開發(fā)主機上交叉編譯測試應(yīng)用程序,并復(fù)制到文件系統(tǒng)的/usr/sbin目錄下,然后重新編譯文件系統(tǒng)下載到開發(fā)板上

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

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

      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

      五、存在問題。

          當執(zhí)行#leds_test off *(*表示LED的序號1~4)的時候,序號比*大的Led也會一起滅掉。原因暫時還沒找到。

       

      2011-02-17

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多