代销网站源码,wordpress loop count,分类目录 wordpress,全国建设网站图片1. Linux下LED驱动原理
与裸机区别在于#xff0c;编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写#xff0c;linux下需要经过MMU。
1.1 地址映射相关概念
1#xff09;MMU#xff08;Memory Manage Unit - 内存管理单元#xff09;#xff1a; …1. Linux下LED驱动原理
与裸机区别在于编写驱动要符合linux驱动框架规范。裸机直接对寄存器物理地址进行读写linux下需要经过MMU。
1.1 地址映射相关概念
1MMUMemory Manage Unit - 内存管理单元 ①完成虚拟空间到物理空间映射。地址映射 ②内存保护设置存储器访问权限设置虚拟存储空间缓冲特性。 2虚拟地址VA对于x位处理器虚拟地址范围为2^x Byte。比如32位处理器对应4GB虚拟地址范围。 我的板子上512MB的DDR3就是物理内存经过MMU映射到4GB的虚拟空间。linux内核启动后会初始化MMU此后CPU访问的都是虚拟地址。
1.2 物理内存和虚拟内存的转换函数
1ioremap用于获取指定物理地址空间对应的虚拟地址空间。
以对IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03寄存器操作为例
映射后对SW_MUX_GPIO1_IO03的操作就是对该寄存器的操作
#define SW_MUX_GPIO1_IO03_BASE (0X020E0068) 寄存器物理地址
static void __iomem* SW_MUX_GPIO1_IO03; 虚拟地址对应的指针
SW_MUX_GPIO1_IO03 ioremap(SW_MUX_GPIO1_IO03_BASE, 4); 进行转换由于6ULL一个寄存器4字节所以映射长度为42ioremap卸载驱动时释放ioremap做的映射。
iounmap(SW_MUX_GPIO1_IO03);1.3 I/O内存访问函数
I/O端口外部寄存器或内存映射到IO空间称为I/O端口。 I/O内存外部寄存器或内存映射到内存空间。ARM下只有I/O内存 在上面1.2节完成了物理地址和虚拟地址的映射但是不建议直接对映射后的地址进行读写使用以下函数进行 1读操作函数
--8-16-32bit 读操作函数addr为要读取的内存地址--
u8 readb(const volatile void __iomem *addr)
u16 readw(const volatile void __iomem *addr)
u32 readl(const volatile void __iomem *addr)2写操作函数
--8-16-32bit 写操作函数value为写入值addr为要写入的内存地址--
void writeb(u8 value, volatile void __iomem *addr)
void writew(u16 value, volatile void __iomem *addr)
void writel(u32 value, volatile void __iomem *addr)2. Linux下LED驱动流程
---初始化并注册驱动---
led_init内存映射初始化led时钟IO复用和属性LED初始状态注册字符设备驱动
module_init(led_init)---向led设备写入进行亮灭控制---
led_writeled_switch---关闭led设备注销驱动---
led_exit取消内存映射注销字符设备驱动
module_exit(led_exit)测试