openwrt字符设备驱动开的概述

本此博文的主要目标在于:
对linux内核,驱动有初步的认识
文档上笔者给的建议是对linux内核不太了解的可以看看国嵌的linux视频,有很大的帮助(看来又有一个目标了啊)
1.应用程序、库、内核、驱动程序的关系,下面用一张图片来稍作说明:
1).应用程序使用库提供的open函数打开代表LED的设备文件
2).库根据open函数传入的参数执行SWI指令,该指令会引起CPU的异常,进入内核。
3).内核的一场处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库,进而返回给应用程序
4).应用程序得到文件句柄以后,使用库提供的write或者ioct函数发出控制指令。
5).库根据write和ioct函数传入的参数执行“SWI”指令,这条指令会引起CPU异常,进入内核
6).内核的异常处理函数贵根据这些参数调用驱动程序的相关函数,点亮LED
库(比如 glibc)给应用程序提供的open read write ioctl mmap等接口的函数被称为系统调用,他们都是设置好相关的寄存器后,执行某条指令引发异常进入系统内核。除系统调用接口外,裤还提供其他函数,比如字符串处理函数(strcpy strcmp等)、输入/输出函数,数学库,还有应用程序的启动代码等

在异常处理函数函数中,内核会根据传入的参数执行各种动作,比如根据设备文件名找到对应的驱动程序,调用驱动程序的相关函数等。一般来说,当应用程序调用open,read,write,ioctl,mmap等函数以后,将会使用驱动程序的open,read,write,ioctl,mmap函数来执行相关的操作,比如初始化,读写等。实际上,内核和驱动程序之间并没有界限,因为驱动程序最终是要编进内核里的:这个是通过静态连接和动态的加载。

与应用程序不同,驱动程序从不主动运行,他是被动的;根据应用程序的要求初始化,根据应用程序的要求进行读写。驱动程序加载进内核时,只是告诉内核“我在这里,我能做这些工作”,只用于这些工作是何时开始的,取决于应用程序。当然,这不是绝对的,不如用户完全可以写一个系统时钟触发的驱动程序,让他自动点亮LED。

在LInux系统中,应用程序运行于“用户空间”,拥有MMU 的系统能够限制应用程序的权限(比如将他限制于某个内存块当中),这个可以避免应用程序的错误是整个系统崩溃。而驱动程序运行于“内核空间”,它是系统信任的一部分,驱动程序的错误有可能导致整个系统的崩溃


2.Linux驱动程序的分类

Linux的外设可以分为3类:字符设备,块设备和网络接口。

字符设备是能够像字节流(比如文件)一样被访问的设备,就是说对他的读写是以字节为单位的,比如串口在经行数据收发的时候就是一个字节一个字节进行的,我们可以在程序内部使用缓冲区来存放数据以提高效率,但是串口本身没有这个要求。字符设备的驱动程序中实现了open,close,read,write等系统调用,应用程序可以通过设备文件(比如/dev/ttySCA0等)来访问字符设备。

块设备上的数据是以快的形式存放的,比如NAND Flash上的数据就是以页为单位存放的。块设备驱动程序向用户层提供的接口与字符设备一样,应用程序也可以通过相应的设备文件(比如/dev/mtblock0,/dev/hda1等)来调用open,close,read,write等系统调用,与块设备传输任意数据。对用户而言,字符设备与块设备的访问方式没有差别。但是块设备驱动程序的特别之处如下。

1).操作硬件接口的实现方式不一样

块设备驱动程序先将用户发来的数据组织成块,再写入设备;或从设备中读出若干块的数据,再从中挑出用户需要的数据。

2).数据块上的数据可以有一定的格式。

通常在块设备中按照一定的格式存放数据,不同的文件系统给类型就是用来定义这些文件系统类型的。内核中,文件系统的层次位于块设备驱动程序上面,这意味着块设备驱动程序除了向用户层提供提供与字符设备一样的接口外,还要向内核其他部件提供一些接口,这些接口用户是看不到的,这些接口是使得可以在块设备上存放文件系统,挂载块设备。


3).网络接口同时具有字符设备,块设备的部分特点,无法将他归入这两类当中:如果说要他是字符设备,他的输入/输出却是有结构的,成块的(报文,包,帧);如果说他是块设备,他的“块”有不是固定大小的,大到数百甚至数千字节,小到几字节。

unix式的操作系统访问网络接口的方法是给他们分配一个唯一的名字(比如 eth0)但是这个名字在文件系统中(比如/dev 目录下)不存在对应的节点项。应用程序,内核和网络驱动程序件的通信完全不同于字符设备,块设备,库’内核提供了一套和数据包传输相关的函数,而不是open,read,和write。


3.简单的记录一下驱动程序的开发步骤:

Linux内核就是各种驱动组成的,内核源码中大约有85%是由各种驱动程序的代码







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植WiFi驱动是将适用于特定硬件平台的驱动程序适配到OpenWrt操作系统上的过程。在移植过程中,我们需要了解特定的硬件平台和所需的驱动程序。 首先,我们需要确定所使用的硬件平台的型号和制造商。这可以通过查询设备的规格和型号来得到。了解硬件平台的具体信息对于寻找并移植相应的驱动程序至关重要。 接下来,我们需要找到与所使用硬件平台兼容的驱动程序。OpenWrt社区提供了大量的驱动程序,可以从OpenWrt的官方网站或各种发者社区中获取。可以通过查看类似硬件平台的设备的驱动程序,或者通过与其他发者交流来找到合适的驱动程序。 一旦找到兼容的驱动程序,就需要将其移植到OpenWrt操作系统中。这个过程涉及分析驱动程序的源代码,并进行适当的修改以适应OpenWrt的内核和环境。这可能涉及到处理与OpenWrt不兼容的底层接口、库和头文件等问题。 在移植过程中,可能会遇到一些问题,例如编译错误、依赖项缺失等。解决这些问题通常需要深入了解驱动程序的源代码,以及OpenWrt操作系统的配置和编译流程。这可能需要花费一些时间和精力来解决。 当驱动程序成功移植到OpenWrt操作系统后,我们就可以在该系统上使用相应的WiFi功能。我们需要根据OpenWrt的指南进行一些配置,并确保驱动程序正确加载和使用。 总结来说,移植WiFi驱动是一个复杂的过程,需要对硬件平台和驱动程序的工作原理有深入的理解。只有在成功移植并正确配置驱动程序后,我们才能在OpenWrt操作系统中使用WiFi功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值