1.linux下LED灯驱动原理
1.1 地址映射
MMU:memory manage unit,内存管理单元
(1)完成虚拟空间到物理空间的映射;
(2)内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。
cpu直接访问的是虚拟地址而不是物理地址。
1.1.1 ioremap函数
ioremap函数用于获取指定物理地址空间对于的虚拟地址空间,定义在asm/io.h文件中。
#include <asm/io.h>
void __iomem *ioremap(resource_size_t phys_addr, size_t size, unsigned int mtype);
phys_addr:要映射的物理起始地址
size:要映射的内存空间大小
mtype:映射属性,通常使用MT_DEVICE(非缓存)
返回值:成功时返回映射的虚拟空间首地址
举例:
#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);
1.1.2 iounmap函数
卸载驱动时需要使用iounmap函数释放ioremap函数的映射。
void iounmap (volatile void __iomem *addr)
addr:要取消映射的虚拟地址空间首地址。
举例:
iounmap(SW_MUX_GPIO1_IO03);
1.2 I/O内存访问函数
使用ioremap函数将寄存器的物理地址映射到虚拟地址之后,可以使用特定的I/O内存访问函数进行读写操作。
1.2.1 读操作函数
u8 readb(const volatile void __iomem *addr);
u16 readw(const volatile void __iomem *addr);
u32 readl(const volatile void __iomem *addr);
readb,readw,readl这三个函数分别对应8bit,16bit,32bit读操作
addr:读取的内存地址
返回值:读取到的数据
1.2.2 写操作函数
void writeb(u8 value, volatile void __iomem *addr);
void writew(u16 value, volatile void __iomem *addr);
void writel(u32 value, volatile void __iomem *addr);
writeb,writew,writel三个函数分别对应8bit,16bit,32bit的写操作
value:写入的数值
addr:要写入的内存地址



被折叠的 条评论
为什么被折叠?



