摘要:
平台设备驱动: 包含BUS(总线)、DEVICE、DRIVER。 DEVICE:硬件相关的代码 DRIVER:比较稳定的代码 BUS有一个driver链表和device链表。 ①把device放入bus的device链表中 ②从bus的drv链表中取出每一个drv,用bus的match函数判断drv 阅读全文
摘要:
以前写的一些输入设备的驱动都是采用字符设备处理的。问题由此而来,Linux开源社区的大神们看到了这大量输入设备如此分散不堪,有木有可以实现一种机制,可以对分散的、不同类别的输入设备进行统一的驱动,所以才出现了输入子系统。 输入子系统引入的好处: (1)统一了物理形态各异的相似的输入设备的处理功能。例 阅读全文
摘要:
在之前的定时器驱动程序中,我们发现在连续按下按键的时候,正常情况下应该是一次按下对应一次松开。而程序有时候会显示是两次按下,一次松开。这个问题是因为在按下的时候,因为是机械按键,所以电压信号会产生一定的波动,会让程序进行两次中断,如何解决这个问题呢? 我们可以在发生一次中断之后等待一段时间再去判断按 阅读全文
摘要:
目的:同一个时刻,只能有一个应用程序打开我们的驱动程序。 ①原子操作: v = ATOMIC_INIT( i ) 定义原子变量v并初始化为i atomic_read(v) 返回原子变量的值atomic_set(v,i) 设置原子变量的值 atomic_inc_and_test(v) 自加后和测试是否 阅读全文
摘要:
之前的按键方式: 查询: 极度占用CPU资源 中断: 在读的时候产生休眠,在没有信号的时候永远不会返回。 poll机制: 在中断的基础上加上超时时间。 异步通知就是通过信号来传送。 首先在应用程序中有一个信号处理函数,在应用程序接收到信号时会自动调用信号处理函数。 驱动程序为应用程序提供设置信号量的 阅读全文
摘要:
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出。 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键信息,则自己退出。 首先应用程序执行poll函数 kernel中的sys_poll do_sys_p 阅读全文
摘要:
轮询方式: 和led驱动不同的是在配置IO引脚的时候,把LED的输出引脚换成输入,在read函数中向外发送io的状态。必须由应用程序不断的来查询当前IO口的状态来判断。 中断方式: Makefile同led中的类似。 应用程序: sd 阅读全文
摘要:
首先贴上代码: 字符设备驱动代码: 模块的Makefile: 测试文件: 完 阅读全文
摘要:
应用程序通过open read write close 等函数来操作计算机硬件。类似是一个接口。 当应用程序调用这些接口程序时,计算机是如何进入内核的呢?这是经过了系统调用。 实际上当调用接口函数时,会引发一个swi异常(附带参数,软中断),通过这个异常就进入了内核空间。在内核空间的异常处理函数中就 阅读全文
摘要:
开发板 jz2440 下载uboot.bin 下载内核 下载文件系统 阅读全文
摘要:
busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行。而用户自己编写的程序如果需要动态链接库,还是依然需要有。 (从http://www.busybox.net/downloads/可以下载busybox工具) 如果是动态链接 阅读全文
摘要:
编译的内核可能会很大,故这里可以压缩一下。而在内核文件中需要解压,所以就会有一段自解压代码。 在uboot启动内核的时候,调用了函数: thekernel(0,MACH_ID,params_addr ) 0 存放在r0寄存器 MACH_ID 存放在r1 params_addr存放在r2 1. 首先处 阅读全文
摘要:
内核启动是需要必要的启动参数。不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数。 首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动。 分区: 每个硬盘上都有一个分区表。由于Flash中没有分区表,所以Flash的分区只能在源代码中定义,故 阅读全文
摘要:
-p1代表忽略第一层目录(patch文件中的)。 阅读全文
摘要:
假如: __main的链接地址是0x20000000。而因为它在前面,在启动的时候被拷贝到前面了,所以实际的地址是0x00000000. __main2的链接地址是0x20000010。实际地址是0x00000010. B指令是相对跳转。 也就是把pc加上两个链接地址之间的差值。 如果使用 在 __ 阅读全文