嵌入式驱动基础

 

嵌入式Linux驱动基础

 

嵌入式驱动开发作为嵌入式开发的主要环节, 有太多东西可讲了. 在此只是将这几天匆忙查看的资料做一个总结, 以作备忘.
其中必有许多错漏之处, 留待以后深入学习在补充了.

什么是驱动

 

驱动是用来衔接软件和硬件的程序, 在嵌入式开发中, 开发人员就可以通过驱动来操作硬件, 也就将软件工程师和硬件工程师的工作隔离开来了.

Linux的驱动

 

在Linux下, 驱动被看作文件(Linux有种说法: 一切皆是文件)
Linux下要将一个驱动载入内核可以采用模块加载的方法(这种方法可以很好的控制内核大小, 随时可以将不用的驱动卸载掉).

驱动的类型与主设备号, 从设备号

 

驱动分为三类: 字符类型(键盘, 鼠标以单个字符传输的设备), 块类型(可以进行块传输 存储器等), 网络类型(需要联网的设备)
确定了类型后, 需要再给不同的设备分配一个主设备号, 而享有同一个主设备号的
驱动需要实现的功能大多是结构体file_operations的成员(这个结构体的成员基本上都是指针函数)
ps: 似乎有些设备(例如USB需要用到更多功能, 应该有在别的结构体中

驱动与应用程序

 

由于驱动是作为内核模块被加载的, 也就是说驱动模块是工作在内核态. 因此它是不能被工作在用户态的应用程序访问到的.
因此, 应用程序要访问驱动就需要通过file_operations结构体来进行访问
ps: 似乎也有一些特别的函数如copy_from_user等可以将应用程序的数据引进内核模块中, 不知道这两种有何区别?

file_operations

 

应用程序需要file_operations来调用驱动中实现好的函数, 那这个file_operations是从何而来的呢?
file_operations是在驱动模块的代码中定义的, 定义之后需要注册. 注册可以有两种方式. 区别在于是否自动创建节点
节点这个概念我也不是很理解, 应用程序应该是通过打开节点来获得注册过的file_operations的地址的(这个地址可能也不是实际的地址,
中间过程应该有一步地址映射的过程

驱动模块的初始化和注销

 

如果在终端是执行 insmod modname //加载模块
这时就会执行驱动模块的初始化函数: module_init(function) 其中function是真正的初始化函数
同理, 在注销模块的时候也会执行注销函数module_exit(function)
file_operations结构体的注册就是在初始化函数中进行(有时候还要对中断, 系统资源的进行注册)
注销函数需要与初始化函数相对称, 注册了什么就需要注销什么. 申请了什么就需要释放什么

应用程序是如何通过file_operations结构体访问驱动函数的

 

这部分我也不是很理解, 我估计这不是一种直接的访问. 而是通过函数间的参数传递最终传进驱动模块中
有可能之前提到的可以使用户态的应用程序直接访问内核态的驱动模块的函数就是用于此. 但没在代码上得到确认

总结

 

好久没写博文了, 写一篇来充实下博客. 我知道东拼西凑的东西多半是有些错漏的, 各位看客有怪模怪
ps: 有大牛感觉看不下去的话请尽情鞭挞吧, 给我个进步的机会~~
posted on 2012-05-01 23:32  at2021  阅读(347)  评论(0编辑  收藏  举报