9、linux物理地址到虚拟地址映射MMU
在单片机和裸机中操作硬件直接访问物理寄存器即可
例如 unsigned int *p = 0x12345678;
*p = 0x87654321;
但是在Linux上不行,在Linux上,如果要想操作硬件,需要先把物理地址转换为虚拟地址,因为Linux使能了MMU(物理地址转换为虚拟地址),所以我们在Linux上不能直接操作物理地址。
MMU的好处?
(1) 让虚拟地址成了可能
(2) 可以让系统更加安全,因为有了MMU,我们上层应用看到的内存都是虚拟内存,我们的应用就不能直接访问硬件,这样就保证了系统的安全。
MMU非常复杂**,我们如何完成物理地址到虚拟地址的转换?**
内核给我们提供了函数
ioremap,iounmap
ioremap
ioremap : 把物理地址转换成虚拟地址
static inline void __iomem *ioremap(unsigned long port, unsigned long size)
{
return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
}
port 映射物理地址的起始地址。
size : 映射多大的内存空间
返回值: 成功返回虚拟地址的首地址、 失败: 返回NULL
iounmap
iounmap: 释放掉ioremap映射的地址
static inline void iounmap(volatile void __iomem *addr)
{
IO_CONCAT(__IO_PREFIX,iounmap)(addr);
}
addr 要取消映射的虚拟地址的首地址
注意: 物理地址只能被映射一次,多次映射会失败
如何查看那些物理地址被映射过了?
cat /proc/iomem
10、LED驱动
•GPIO (General Purpose InputOutput Port)
– 通用输入输出口
– 单片机或处理器对外设进行操作的主要方式
– 通过设置GPIO的高电平或者低电平来实现
对外设的操作
– GPIO很多是复用的
•程序对寄存器操作即可实现对GPIO的操作
1、查看电路图、datasheet
编写IED驱动,主要是对GPIO的操作
在核心板连接到了GPL2_0
在datasheet中找到GPL2
GPL2_0的控制寄存器,主要是控制输入/输出(电平方向)
数据寄存器,写入0x1 为高电平、0为低电平 因为这里使用的是GPL2_0 第0位对应着GPL2_0 , 如果是2_1
就是对应着第1位 第1位为1 则为高电平、0位低电平
2、编写驱动程序
这里使用的是物理地址和虚拟地址映射的方式来操作GPIO
#include <linux/init.h>
#include <linux/module.h>
#