嵌入式 Linux 如果有现成的驱动,应用程序是怎么调用这些驱动模块的?

回答·25
最热
最新
  • 驱动以字符设备的形式存在,应用程序中直接对字符设备进行读写打开关闭操作。
  • 永远记住一句话,linux 下一切皆文件,所以驱动也是一个设备文件,这个设备文件,会有一个设备节点,比如 sensor 驱动,会对应一个 video0/1 的设备节点,操作它就和操作普通文件一样,open 打开,获取文件描述符,然后你想干啥,就干啥
  • 可以通过.h 或者一些接口文件以及 lib 库的方式进行调用,一般都会提供 bsp 文件包
  • insmod 安装驱动,然后在应用源码文件里包含进来,调用宏注册,使用接口等。
  • 分动态加载和静态加载 驱动的动态加载指的是利用了 linux 的 module 特性,可以在系统启动后通过 insmod 或 modprobe 命令挂载.ko 内核目标文件,对模块进行加载,成功后可通过 mknod 指令进行挂载节点,在不需要的时候可通过 rmmod 命令来卸载模块。   操作方法: 在驱动文件 mydrv.c 和 makefile 目录下执行 make 编译出 mydrv.ko 文件,然后复制到目标板,执行 insmod 命令加载驱动,然后就可以在应用层调用了,不使用可以使用 rmmod 命令卸载驱动模块。 2. 静态加载   驱动的静态加载指的是直接把驱动程序编译进内核,在系统启动后可直接调用,不需要任何加载卸载命令。   操作方法: 将驱动文件驱 mydrv.c 复制到目标板内核源码树 drivers/char(假设是字符型驱动)下。 在 char 目录的 Kconfig 文件中添加新源代码对应项目的编译配置选项
  • 首先,设备驱动使用 register_chrdev()函数在内核中注册一个设备节点,同时将初始化的 file_operation 结构体注册进去,内核会维护一个 file_operation 结构体集合,注册一个 file_operation 结构体并且返回设备号,在这里将设备号和结构体相关联。 然后使用上面的设备号在/dev 目录下创建新的设备文件 DEVICE_NAME(可以通过 udev 实现)。 最后,用户打开/dev/DEVICE_NAME 设备产生系统调用 ->系统找到设备节点对应的设备号 ->通过设备号找到内核维护的 file_operation 结构体集合中对应的结构体 ->由于初始化时指定了.open = basic_open,调用 basic_open 函数
  • 系统调用,netlink,ioctl,read write,sysfs,/proc,mmap,………
  • 驱动是内核层,应用程序是应用层。应用层通过调用接口函数来调用内核层驱动硬件。我是这样理解的,请指正。
  • 这是一个长久的误解,虽然听起来有点咬文嚼字,应用程序永远使用的是设备而不是驱动,驱动只负责加载设备,而设备会被抽象成文件系统下的文件,因此操作设备就是文件读写,好了自己琢磨吧大家都挺忙的。
  • 驱动对上提供的系统调用接口呗。