天嵌 ARM开发社区

 找回密码
 注册
查看: 2012|回复: 7

arm开发板的linux下led驱动问题,求大神看看!!!!!

[复制链接]
xmkk 发表于 2013-11-14 00:01:58 | 显示全部楼层 |阅读模式
写了一个TQ2440的led驱动,四个led灯与引脚GPB5~GPB8连接,引脚输出低电平是点亮led灯;
想用led_driv_open函数配置引脚为输出并设初始值为低电平,但是只能将GPB5对应的led灯点亮,求大神看看
这是驱动代码,测试程序代码在下面
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/fs.h>
  4. #include <linux/init.h>
  5. #include <linux/delay.h>
  6. #include <asm/uaccess.h>
  7. #include <asm/irq.h>
  8. #include <asm/io.h>
  9. #include <linux/device.h>       //for udev
  10. #include <mach/regs-gpio.h>  //gpio

  11. MODULE_LICENSE("GPL");               

  12. static struct class *led_driv_class;                //定义一个类

  13. static unsigned int led_table[]=
  14. {
  15.         S3C2410_GPB5,
  16.         S3C2410_GPB6,
  17.         S3C2410_GPB7,
  18.         S3C2410_GPB8
  19. };

  20. static int led_driv_open(struct inode *inode,struct file *file)
  21. {
  22.         int i;
  23.        
  24.         //配置GPB5,6,7,8为输出,且输出0,低电平
  25.         for(i=0; i<4; i++)
  26.         {
  27.                 s3c2410_gpio_cfgpin(led_table[i], S3C2410_GPB5_OUTP);
  28.                 s3c2410_gpio_setpin(led_table[i], 0);
  29.         }
  30.        
  31.         return 0;
  32. }

  33. static int led_driv_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)
  34. {
  35.         int val,i;

  36.         copy_from_user(&val, buf, count);    //从用户空间拷贝数据
  37.         if(val==1)
  38.         {
  39.                 //点灯
  40.                 for(i=0;i<4;i++)
  41.                 {
  42.                         s3c2410_gpio_setpin(led_table[i], 0);
  43.                 }
  44.         }
  45.         else
  46.         {
  47.                 //灭灯
  48.                 for(i=0;i<4;i++)
  49.                 {
  50.                         s3c2410_gpio_setpin(led_table[i], 1);
  51.                 }
  52.         }
  53.        
  54.         return 0;
  55. }

  56. static struct file_operations led_driv_fops={
  57.         .owner = THIS_MODULE,
  58.         .open = led_driv_open,
  59.         .write = led_driv_write,
  60. };

  61. int major;

  62. static int __init led_driv_init(void)
  63. {

  64.     printk("<1>\n     Hello,Led drive!\n");
  65.     major=register_chrdev(0, "led_dev", &led_driv_fops);
  66.        
  67.     //新建类
  68.     led_driv_class = class_create(THIS_MODULE, "led_dev");
  69.     if(IS_ERR(led_driv_class))
  70.                 return PTR_ERR(led_driv_class);
  71.     //创建设备
  72.    device_create(led_driv_class,NULL,MKDEV(major, 0),NULL,"led_dev");

  73.     return 0;
  74. }

  75. static void __exit led_driv_exit(void)
  76. {
  77.     printk("<1>\n     Exit!\n");
  78.     //删除设备结点
  79.     device_destroy(led_driv_class,MKDEV(major, 0));
  80.     class_destroy(led_driv_class);
  81.        
  82.     unregister_chrdev(major, "led_dev");
  83. }                                    

  84. module_init(led_driv_init);
  85. module_exit(led_driv_exit);

  86. MODULE_LICENSE("GPL");
复制代码



测试程序代码
  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/stat.h>
  4. #include<fcntl.h>
  5. int main()
  6. {
  7.         int fd,val;

  8.         if((fd=open("/dev/led_dev",O_RDWR))<0)
  9.         {
  10.                  printf("open device failed");
  11.         }
  12.         printf("type 1 to turn on the led,0 to turn of it!");
  13.         scanf("%d",&val);
  14.         write(fd,&val,4);

  15.         return 0;
  16. }
复制代码



TQ-ZQL 发表于 2013-11-14 09:28:35 | 显示全部楼层
              s3c2410_gpio_cfgpin(led_table[i], S3C2410_GPB5_OUTP);
这句有问题吧
回复 支持 1 反对 0

使用道具 举报

 楼主| xmkk 发表于 2013-11-14 10:23:39 | 显示全部楼层
TQ-ZQL 发表于 2013-11-14 09:28
s3c2410_gpio_cfgpin(led_table, S3C2410_GPB5_OUTP);
这句有问题吧

是哎,不应该是S3C2410_GPB5_OUTP,多谢了!
眺望,永恒 发表于 2013-11-17 09:59:23 | 显示全部楼层
xmkk 发表于 2013-11-14 10:23
是哎,不应该是S3C2410_GPB5_OUTP,多谢了!

你好,我想问一下,像在linux下的这些例如设置GPIO口电平,读取GPIO的这些函数应该去哪里找,我会读取裸机程序时的高低电平,但不懂在linux下怎么读,这些函数式哪里来的,我如果要学这方面应该看什么书呢,谢谢了。
眺望,永恒 发表于 2013-11-17 09:59:44 | 显示全部楼层
TQ-ZQL 发表于 2013-11-14 09:28
s3c2410_gpio_cfgpin(led_table, S3C2410_GPB5_OUTP);
这句有问题吧

你好,我想问一下,像在linux下的这些例如设置GPIO口电平,读取GPIO的这些函数应该去哪里找,我会读取裸机程序时的高低电平,但不懂在linux下怎么读,这些函数式哪里来的,我如果要学这方面应该看什么书呢,谢谢了。
 楼主| xmkk 发表于 2013-11-17 10:43:02 | 显示全部楼层
眺望,永恒 发表于 2013-11-17 09:59
你好,我想问一下,像在linux下的这些例如设置GPIO口电平,读取GPIO的这些函数应该去哪里找,我会读取裸 ...

看看这篇博客吧 http://blog.csdn.net/xie376450483/article/details/5727374
眺望,永恒 发表于 2013-11-17 13:18:11 | 显示全部楼层
xmkk 发表于 2013-11-17 10:43
看看这篇博客吧 http://blog.csdn.net/xie376450483/article/details/5727374

我想问一下有不有这方面的书籍呢,感觉还是不太懂
 楼主| xmkk 发表于 2013-11-18 09:37:47 | 显示全部楼层
眺望,永恒 发表于 2013-11-17 13:18
我想问一下有不有这方面的书籍呢,感觉还是不太懂

这我就不知道了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-28 13:26 , Processed in 1.019466 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表