• 第一个字符设备驱动程序


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

    板子中烧写的内核是打过补丁的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函数打开这个设备文件,去调用驱动程序里的函数,非常麻烦。

  • 相关阅读:
    ByteArrayInputStream&ByteArrayOutputStream源码分析
    常用FastJSON的SerializerFeature特性及日期转换格式
    SpringAware
    Zuul(SpringCloud学习笔记一)
    RabbitMQ和SpringBoot的简单整合列子
    Cngigure和BUS实现远端配置
    vagrant安装homestead环境使用总结
    sublime安装插件
    vagrant配置(假设已经安装好了vagrant并且下载好了box)
    linux php安装配置oci8模块
  • 原文地址:https://www.cnblogs.com/physworld/p/14806777.html
Copyright © 2020-2023  润新知