[国嵌攻略][111][硬件访问技术]
硬件访问实质
驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的的,因此我们讨论如何访问硬件,就成了如何访问这些寄存器。
访问流程
1.地址映射
在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或RAM地址都是物理地址,无法直接使用。因此我们读写寄存器的第一步就是将它的物理地址映射为虚拟地址。
1.1.动态映射
所谓动态映射是指在驱动程序中采用ioremap函数将物理地址映射为虚拟地址。
原型:void *ioremap(physaddr, size)
参数:
physaddr:待映射的物理地址
size:映射的区域长度
返回值:映射后的虚拟地址
1.2.静态映射
所谓静态映射是指Linux系统根据用户事先指定的映射关系,在内核启动时自动地将物理地址映射为虚拟地址。
映射关系:
在静态映射中,用户通过map_desc结构来指明物理地址与虚拟地址的映射关系。
struct map_desc{
unsigned long virtual; //映射后的物理地址
unsigned long pfn; //物理地址所在的页帧号
unsigned long long; //映射长度
unsigned int type; //映射的设备类型
}
pfn:利用__phys_to_pfn(物理地址)可以计算物理地址所在的物理页帧号
2.寄存器读写
在完成地址映射后,就可以读写寄存器了,Linux内核提供了一系列函数,来读写寄存器。
unsigned ioread8(void *addr)
unsigned ioread16(void *addr)
unsigned ioread32(void *addr)
unsigned readb(address)
unsigned readw(address)
unsigned readl(address)
void iowrite8(u8 value, void *addr)
void iowrite16(u16 value, void *addr)
void iowrite32(u32 value, void *addr)
void writeb(unsigned value, address)
void writew(unsigned value, address)
void writel(unsigned value, address)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术