zoukankan      html  css  js  c++  java
  • 第一个字符设备驱动程序

    在编译模块之前首先要:配置并编译内核

    板子中烧写的内核是打过补丁的linux-2.6.22.6,在编译驱动程序时,要在Makefile里指定使用的linux源码路径,也就是说驱动程序的编译依赖于内核源码,具体为啥不是很懂。

    现在暂时理解为:既然驱动程序要编译为内核的一个可加载的模块,那模块总得知道它自己要加载到的是什么东西吧。

    1、在si里面建立一个打过补丁的linux-2.6.22.6工程,里面有很多现成的驱动程序和函数原型可以参考。

    2、新建一个.c文件,这个文件不用加入内核工程

    3、按最简单的字符设备框架完成函数:xxx_init()  xxx_open()  xxx_write()  xxx_exit(),定义一个file_operations结构体,完成xxx_init xxx_exit函数的修饰:module_init(first_drv_init);module_exit(first_drv_exit);

      再加一个MODULE_LICENSE("GPL");

      在linux中执行命令insmod xxx.ko时,会调用xxx_init()函数向内核注册驱动程序。第一个参数是主设备号,如果不为0,字符驱动的主设备号就等于指定的主设备号;如果等于0,表示驱动程序的设备号由内核分配。

      使用cat /proc/devices命令可以看当前内核装载了哪些驱动程序,主设备号是多少。

      现在知道了驱动程序的主设备号。

      再使用mknod /dev/xxx c <主设备号> <次设备号>命令,可以创建设备文件。这样应用程序就可以使用open()、write()函数,通过搜索文件的主设备号,来最终调用驱动程序里实现的函数(xxx_read、xxx_write)了。

      

    完成驱动程序的.c文件编写以后,需要修改Makefile:1、修改内核源码的路径  2、修改目标文件的名字xxx.ko

    将两个文件上传服务器make一下就行了。

    再执行命令insmod xxx.ko加载内核模块,执行cat /proc/devices查看主设备号,执行mknod /dev/xxx c <主设备号> <次设备号>创建设备文件

    第一个驱动程序的问题:每次都要cat /proc/devices查看主设备号,再用mknod创建设备文件之后,应用程序才能用open函数打开这个设备文件,去调用驱动程序里的函数,非常麻烦。

  • 相关阅读:
    hdu5834 Magic boy Bi Luo with his excited tree 【树形dp】
    POJ2152 Fire 【树形dp】
    POJ1848 Tree 【树形dp】
    hdu3586 Information Disturbing 【树形dp】
    BZOJ4557 [JLoi2016]侦察守卫 【树形dp】
    BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】
    BZOJ1487 [HNOI2009]无归岛 【仙人掌dp】
    BZOJ4002 [JLOI2015]有意义的字符串 【数学 + 矩乘】
    洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
    3-3 银行业务队列简单模拟
  • 原文地址:https://www.cnblogs.com/physworld/p/14806777.html
Copyright © 2011-2022 走看看