[作品] 【EVB-T335开发板试用体验】- 点亮一个LED的MISCDEV

[复制链接]

实习生

发表于 2017-4-17 06:20:35   607 查看 0 回复 显示全部楼层 倒序浏览
分享
因为我们最终的项目是使用I2C接口对温度传感器进行操作,那么我们需要在应用层与驱动之间搭起一个平台
可以自己构建一个一步一步创建,也可以使用linux 驱动已经封装好的结构体进行,比如hwmon,miscdevice+file_operations

我们今天就使用miscdevice 来进行驱动层的开发。


Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。正因为简单,所以它通常嵌套在platform 总线驱动中,配合总线驱动达到更复杂,多功能的效果。,
假如现在我们创建的次设备号是20,那么标志位偏移量就是1<<20,那么就会有上面的misc_minors[0] =misc_minors[0] | 1<<20;同样假如现在我们创建的次设备号是40,那么就会有mask = 1<<(40%32),即mask = 1<<8,就有misc_minors[1] = misc_minors[1] | 1<<8。下面这幅图是根据我所使用的内核版本,我使用的内核里面只定义了64个标志位,这里也就画了8个字节。但是不管有多少个字节吧,原理还是一样的。

可以看看/dev目录下的设备节点主设备是10,次设备号是42.这样的话,标志位就放在第二排了。






下面就是我们实际的一个驱动模块
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/fs.h>
  4. #include <linux/device.h>
  5. //#include <linux/leds.h>
  6. #include <linux/gpio.h>
  7. #include <linux/err.h>
  8. #include <linux/types.h>
  9. #include <asm/uaccess.h>
  10. #include <linux/miscdevice.h>
  11. #include <linux/gpio.h>

  12. #define 335X_GPIO(bank,gpio) (32*(bank)+(gpio)) //define gpio port number
  13. #define REV_DEV_MINOR 112

  14. char kbuf[20];

  15. static ssize_t fop_write(struct file *filp, const char __user *ubuf,
  16.                                                  size_t count, loff_t *ppos)
  17. {
  18.         if (copy_from_user(kbuf,ubuf,1)){
  19.                 printk("write is error \n");
  20.         }

  21.         switch (kbuf[0]){
  22.         case '1':
  23.                 gpio_set_value(<span style="line-height: 27.2px;">335X_GPIO</span>(3,4),1);
  24.                 break;

  25.         case '0':
  26.                 gpio_set_value(<span style="line-height: 27.2px;">335X_GPIO</span>(3,4),0);
  27.                 break;

  28.         default :
  29.                 break;
  30.         }

  31.         return 0;
  32. }

  33. int fop_open(struct inode *inode, struct file *filp)
  34. {
  35.         printk("success open the file \n");
  36.         return 0;
  37. }

  38. int fop_release(struct inode *inode, struct file *filp)
  39. {
  40.         printk("success close the file \n");
  41.         return 0;
  42. }

  43. static const struct file_operations rev_fops = {
  44.         .owner = THIS_MODULE,
  45.         .write = fop_write,
  46.         .open = fop_open,
  47.         .release = fop_release,
  48. };

  49. static struct miscdevice rev_dev = {
  50.         .minor = REV_DEV_MINOR,
  51.         .name = "rev_dev",
  52.         .fops = &rev_fops,
  53. };

  54. static int __init leds_init(void)
  55. {
  56.         int rc = -1;
  57.         rc = misc_register(&rev_dev);
  58.         if (rc){
  59.                         printk("misc rigester is error \n");
  60.         }

  61.         if(gpio_request(<span style="line-height: 27.2px;">335X_GPIO</span>(3,16),"rec_gpio")){
  62.                 printk("gpio_request is error \n");
  63.                 return -EINVAL;
  64.         }
  65.         gpio_direction_output(<span style="line-height: 27.2px;">335X_GPIO</span>(3,16),0);

  66.         return 0;
  67. }

  68. static void __exit leds_exit(void)
  69. {
  70.         printk(KERN_INFO "success fress \n");

  71.         gpio_free(AM335X_GPIO(3,16));
  72. }
  73. module_init(leds_init);
  74. module_exit(leds_exit);

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




高级模式
您需要登录后才可以回帖 登录 | 注册

专家问答 查看更多>>
关闭

站长推荐 上一条 /7 下一条

小黑屋|手机版|Archiver| 电子发烧友 ( 粤ICP备14022951号-2 )     

GMT+8, 2017-6-26 13:24 , Processed in 0.082377 second(s), 12 queries , Memcache On.

微信扫描
快速回复 返回顶部 返回列表
-

推荐专区

技术干货集中营

专家问答

用户帮助┃咨询与建议┃版主议事

我的提问

工程师杂谈

工程师创意

工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

单片机/MCU论坛

FPGA|CPLD|ASIC论坛

DSP论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

-

硬件设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PCB设计论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

-

综合技术与应用

电机控制

智能电网

光电及显示

参考设计中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

DFRobot专区

树莓派论坛

智能硬件论坛

开发快智能硬件开发平台

Intel物联网开发者专区

Waveshare

乐美客SBC专区

Arduino论坛

BeagleBone论坛

机器人论坛

创客神器NanoPi

小钢炮CANNON

比派科技banana pi专区

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

个人版区

阿东Verilog技术专版

直流马达驱动电路设计

LabVIEW英雄联盟

特权同学FPGA专区

-

厂商专区

灵动微电子 MM32

盈鹏飞嵌入式

TI论坛

TI Deyisupport社区

芯灵思嵌入式论坛

Tisan

米尔科技

庆科社区

WIZnet技术专区

Cypress技术论坛

飞凌嵌入式

Qualcomm技术论坛

英创嵌入式

机智云GoKit论坛

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

招聘┃求职发布区

电子展览展会专区