CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
12
返回列表 发新帖
楼主: 简单侶途 

五种方法点亮LED,入门驱动程序,更新完毕

[复制链接]
 楼主| 发表于 2015-11-12 09:14:52 | 显示全部楼层
满月 发表于 2015-11-11 20:32
666666 有深度!

你的支持,我进步的动力
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-12 09:14:47 | 显示全部楼层
满月 发表于 2015-11-11 20:32
666666 有深度!

你的支持,我进步的动力
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-13 15:51:34 | 显示全部楼层
本帖最后由 简单侶途  于 2015-11-13 16:09 编辑

期待大家的不断改进我的代码!!{:soso_e100:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-13 15:58:01 | 显示全部楼层
满月 发表于 2015-11-11 20:32
666666 有深度!

多谢支持,希望你也来共享点资源啊,求学艰苦!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-13 16:07:16 | 显示全部楼层
本帖最后由 简单侶途  于 2015-11-13 16:12 编辑

第五个程序目的是控制不同的LED实现方法是利用程序里面申请主设备号:
major = register_chrdev(0, "led", &leddrv_fops);
利用自动分配申请的major主设备号,接着利用major下自我分配利用的次设备号实现匹配同一类的不同minor,系统自动分配完major后,默认分配次设备号minor = 0,接着我们就在minor那里作文章了,minor使用范围是0~255
这个minor就可以让我们识别同一类设备类下的不同led设备节点
下图所示:242为major,242后面的0,1,2就是minor了

1.驱动程序部分:
  1. #include<linux/fs.h>
  2. #include<linux/module.h>
  3. #include<linux/errno.h>
  4. #include<linux/kernel.h>
  5. #include<linux/init.h>
  6. #include<linux/cdev.h>
  7. #include<linux/uaccess.h>
  8. #include<linux/device.h>
  9. #include<linux/types.h>
  10. #include <asm/gpio.h>
  11. #include <linux/gpio.h>
  12. #include <plat/sys_config.h>
  13. #include <linux/delay.h>
  14. #include <asm/irq.h>
  15. #include <asm/io.h>

  16. #include <linux/moduleparam.h>
  17. #include <linux/poll.h>
  18. #include <linux/sched.h>
  19. #include <linux/spinlock.h>
  20. #include <linux/slab.h>
  21. #include <linux/ipmi.h>
  22. #include <linux/mutex.h>
  23. #include <linux/compat.h>


  24. /*两种方法寻找GPIO寄存器地址*/
  25. //#define PIO_BASE   0x01C20800
  26. #define PH_BASE   (PIO_BASE + 7*0x24)

  27. #define PH_CFG2   (PH_BASE + 0x08)
  28. #define PH_DAT    (PH_BASE + 0x10)

  29. //#define PH_BASE  (PIO_BASE + 0xFC)
  30. //#define PH_CFG2  (PIO_BASE + 0x104)
  31. //#define PH_DAT   (PIO_BASE + 0X10C)

  32. static volatile unsigned int *ph_cfg2;
  33. static volatile unsigned int *ph_dat;

  34. //设备类
  35. static struct class *leddrv_class;
  36. //分配 cdev
  37. static struct class_device *leddrv_class_dev[3];
  38. //主设备号
  39. static int major;

  40. static int led_open(struct inode *inode, struct file *file)
  41. {
  42.         /*bit20[18:16],bit21[22:20]
  43.          *open the roange_led and blue_led GPIO output
  44.          *Output is 001
  45.          */

  46.         *ph_cfg2 &= ~((7<<16) | (7<<20));//清零000,这个步骤很重要,注释掉可以看下效果如何blue_led不能控制了
  47.         *ph_cfg2 |= ((1<<16) | (1<<20));//设置001
  48.         return 0;
  49. }


  50. static ssize_t led_write (struct file *file,char __user *buf,
  51.                                                   size_t count,loff_t *f_pos)
  52. {
  53.         int val;
  54.         int minor = MINOR(file->f_dentry->d_inode->i_rdev);

  55.         /*1.从用户空间读取数据到内核空间*/
  56.         copy_from_user(&val,buf,4);

  57.         /*2.判断传入值val,进行GPIO电平控制*/
  58.         switch (minor){
  59.         case 0:        /*/dev/leds*/
  60.         {
  61.                 if(val == 1)
  62.                         *ph_dat |= ((1<<20) | (1<<21));               
  63.                 else
  64.                         *ph_dat &= ~((1<<20) | (1<<21));
  65.         }
  66.         break;
  67.         case 1:/*/dev/led1*/
  68.         {
  69.                 if(val == 1)
  70.             *ph_dat |= (1<<20);
  71.             else
  72.             *ph_dat &= ~(1<<20);
  73.         }
  74.         break;
  75.         case 2: /*/dev/led2*/
  76.         {
  77.                 if(val == 1)
  78.             *ph_dat |=  (1<<21);
  79.         else
  80.             *ph_dat &=  ~(1<<21);
  81.         }
  82.         break;
  83.         }
  84.         return 0;
  85. }

  86. //分配驱动操作
  87. static struct file_operations leddrv_fops = {

  88.         .owner   =    THIS_MODULE,
  89.         .open         =    led_open,
  90.         .write   =    led_write,
  91. };

  92. static int  led_init(void)
  93. {        
  94.         int minor = 0;
  95.         
  96.         ph_cfg2 = ioremap(PH_CFG2, 4);
  97.         ph_dat  = ioremap(PH_DAT, 4);
  98.         
  99.          major = register_chrdev(0, "led", &leddrv_fops);
  100.         leddrv_class = class_create(THIS_MODULE, "led");
  101.         leddrv_class_dev[0] = device_create(leddrv_class, NULL, MKDEV(major, 0), NULL, "led0"); /* /dev/ledwht */
  102.         
  103.         for(minor=1;minor<3;minor ++)
  104.                 leddrv_class_dev[minor] = device_create(leddrv_class, NULL, MKDEV(major, minor), NULL,
  105.         return 0;
  106. }

  107. static void led_exit(void)
  108. {
  109.         int minor;
  110.         
  111.         unregister_chrdev(major,"led");
  112.         /*2.删除设备节点*/
  113.         for(minor = 0; minor<3; minor++)
  114.                 device_destroy(leddrv_class, MKDEV(major, minor));
  115.         class_destroy(leddrv_class);
  116.         iounmap(ph_cfg2);
  117.         iounmap(ph_dat);
  118. }

  119. module_init(led_init);
  120. module_exit(led_exit);
  121. MODULE_LICENSE("GPL");
复制代码
2.应用程序部分:
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>

  5. /*  测试方法
  6. *  /led_test on
  7. *  /led_test off
  8. */

  9. int main(int argc, char *argv[])
  10. {
  11.         int fd;
  12.         int val = 1;
  13.         char* filename;

  14.         if (argc != 3) {
  15.         printf("usage:\n%s </dev/led?> <on|off>\n", argv[0]);
  16.         return 0;
  17.         }
  18.         filename = argv[1];

  19.         fd = open(filename, O_RDWR);
  20.         if (fd < 0) {
  21.          printf("open led failed.\n");
  22.          return 0;
  23.     }  
  24.         if (strcmp(argv[2], "on") == 0) {
  25.         //开灯
  26.                 val = 1;
  27.         }
  28.         else if (strcmp(argv[2], "off") == 0) {
  29.         //关灯
  30.                 val = 0;
  31.         }

  32.         write(fd, &val, 4);
  33.         return 0;
  34. }
复制代码
3.show图ing
操作步骤如下
LED操作显示





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2015-11-17 16:07:41 | 显示全部楼层
赞认真学习的态度
回复 支持 反对

使用道具 举报

发表于 2016-4-14 15:53:44 | 显示全部楼层
楼主 我编译bin2fex fex2bin的时候为什么报错呢
/opt/sunxi-tools/fel.c:1328: undefined reference to `libusb_strerror'
提示这个未定义 我下载的官网文件啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-20 21:14 , Processed in 0.025038 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部