当前位置:   article > 正文

嵌入式Linux-IMX6ULL-Linux字符设备驱动开发学习总结

嵌入式Linux-IMX6ULL-Linux字符设备驱动开发学习总结

1.首先需要创建加载驱动模块函数主要用到

        module_init(xxx_init); //注册模块加载函数

        module_exit(xxx_exit); //注册模块卸载函数

那么就需要创建一个xxx_init函数、一个xxx_exit函数如下所示

  1. /* 驱动入口函数 */
  2. static int __init xxx_init(void)
  3. {
  4. /* 入口函数具体内容 */
  5. return 0;
  6. }
  7. /* 驱动出口函数 */
  8. static void __exit xxx_exit(void)
  9. {
  10. /* 出口函数具体内容 */
  11. }
  12. /* 将上面两个函数指定为驱动的入口和出口函数 */
  13. module_init(xxx_init);
  14. module_exit(xxx_exit);

其中加载驱动模块可以是用insmod xx.ko modprobe.ko 建议使用modprobe不会存在依赖问题,因为命令可以自动分析依赖,自动加载。而卸载模块可以是rmmod xx.ko modprobe -r xx.ko这里建议使用rmmod因为后一个有依赖卸载,本来只要卸载一个驱动,结果把依赖关系的驱动都卸载了就得不偿失了。

2.创建注册和注销函数

        static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)
 

  1. static struct file_operations test_fops; //设备驱动操作函数注册结构体
  2. /* 驱动入口函数 */
  3. static int __init xxx_init(void)
  4. {
  5. /* 入口函数具体内容 */
  6. int retvalue = 0;
  7. /* 注册字符设备驱动 */
  8. retvalue = register_chrdev(200, "chrtest", &test_fops);
  9. if(retvalue < 0){
  10. /* 字符设备注册失败,自行处理 */
  11. }
  12. return 0;
  13. }
  14. /* 驱动出口函数 */
  15. static void __exit xxx_exit(void)
  16. {
  17. /* 出口函数具体内容 */
  18. /* 注销字符设备驱动 */
  19. unregister_chrdev(200, "chrtest")
  20. }
  21. /* 将上面两个函数指定为驱动的入口和出口函数 */
  22. module_init(xxx_init);
  23. module_exit(xxx_exit);

        注册号了后可以在 cat /proc/devices  文件中看到对于的文件和设备号

3.实现设备具体的操作函数一般就是open、release、read、write
        open

  1. /* 打开设备 */
  2. static int chrtest_open(struct inode *inode, struct file *filp)
  3. {
  4. /* 用户实现具体功能 */
  5. return 0;
  6. }

        release

  1. /* 关闭/释放设备 */
  2. static int chrtest_release(struct inode *inode, struct file *filp)
  3. {
  4. /* 用户实现具体功能 */
  5. return 0;
  6. }

        read

  1. /* 从设备读取 */
  2. static ssize_t chrtest_read(struct file *filp, char __user *buf,
  3. size_t cnt, loff_t *offt)
  4. {
  5. /* 用户实现具体功能 */
  6. return 0;
  7. }

        write

  1. /* 向设备写数据 */
  2. static ssize_t chrtest_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
  3. {
  4. /* 用户实现具体功能 */
  5. return 0;
  6. }

        最后添加到注册结构体中注册

  1. static struct file_operations test_fops = {
  2. .owner = THIS_MODULE,
  3. .open = chrtest_open,
  4. .read = chrtest_read,
  5. .write = chrtest_write,
  6. .release = chrtest_release,
  7. };

4.最后添加license和作者信息,license必须要加的不然会编译报错,作者信息自由选择可加可不加

  1. MODULE_LICENSE() //添加模块 LICENSE 信息
  2. MODULE_AUTHOR() //添加模块作者信息

Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。主设备号0~4095

Linux推荐用动态分配设备号,这样方便管理。

以上就是字符设备驱动的开发模板了。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/205759
推荐阅读
相关标签
  

闽ICP备14008679号