目录
一、前言
前面用一个虚拟的chrdevbase设备做了一个字符设备的开发,现在编写一个真正的linux字符设备-led。重点即是linux下引脚控制驱动。在此先了解一下MMU(内存管理单元),
MMU的主要功能:
①、完成虚拟空间到物理空间的映射;
②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性;
linux内核启动后会初始化MMU,设置好内存映射,设置好后CPU访问的都是虚拟地址。获取实际硬件寄存器物理地址在linux里面对应的虚拟地址,进行操作。这里涉及到物理地址和虚拟地址之间的转换,需要用到两个函数:ioremap和iounmap
1.1、地址映射
1.1.1、ioremap
用于获取指定物理地址空间对应的虚拟地址空间。
#define ioremap(cookie,size) __arm_ioremap((cookie), (size),
MT_DEVICE)
/*
@Decription:获取指定物理地址对应的虚拟地址
@phys_addr:要映射的物理起始地址
@size:要映射的内存空间大小
@return:__iomem类型指针,指向映射后的虚拟空间首地址
*/
void __iomem * __arm_ioremap(phys_addr_t phys_addr, size_t size,
unsigned int mtype)
{
return arch_ioremap_caller(phys_addr, size, mtype,
__builtin_return_address(0));
}
示例如下:
有个寄存器SW_MUX_GPIO1_IO03_BASE物理地址为0x020E0068,获取对应的虚拟地址的方法如下:
//寄存器物理地址
#define SW_MUX_GPIO1_IO03_BASE 0x020E0068
//定义一个__iomem类型指针
static void __iomem* SW_MUX_GPIO1_IO03;
//通过ioremap获取对应的虚拟地址
SW_MUX_GPIO1_IO03 = ioremap(SW_MUX_GPIO1_IO03_BASE, 4);
1.1.2、iounmap
卸载驱动的时候释放ioremap函数所做的映射。
/*
@Decription:释放映射后的地址
@addr:要取消映射的虚拟空间起始地址
*/
void iounmap (volatile void __iomem *addr)

最低0.47元/天 解锁文章
1176

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



