LINUX驱动开发学习笔记3:LED驱动开发实验

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:要写入的内存地址 

学习于正点原子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值