在裸奔代码中,如果要控制gpio,直接控制gpio寄存器地址即可;
在linux系统中,所有操作的地址都是虚拟地址,都是由linux内核去管理,所以需要将物理地址转换成内核可识别的虚拟地址。
1、ioremap 和 iounmap
// 功能:将物理地址映射为虚拟地址
// 参数1:需要映射的物理地址
// 参数2:需要映射的地址长度
// 返回值:映射后的虚拟地址(例:void*reg_base = ioremap(0x12345678, 4);)
void *ioremap(cookie, size);
// 功能:取消映射
// 参数:需要取消的虚拟地址
void iounmap(cookie);
2、虚拟地址操作
// 功能:将虚拟地址中的值读出来
// 参数:需要读取的虚拟地址
__raw_readl(addr); 等同于 readl(addr);
// 功能:将数据写入虚拟地址
// 参数1:数据
// 参数2:需要写入的虚拟地址
__raw_writel(data, addr); 等同于 writel(data, addr);
// 从虚拟地址读取4个字节数据
unsigned int readl(unsigned int addr);
// 往虚拟地址写入4个字节数据
void writel(unsigned int data, unsigned int addr);
// 从虚拟地址读取2个字节数据
unsigned short readw(unsigned int addr);
// 往虚拟地址写入2个字节数据
void writew(unsigned short data, unsigned int addr);
// 从虚拟地址读取1个字节数据
unsigned char readb(unsigned int addr);
// 往虚拟地址写入1个字节数据
void writeb(unsigned char data, unsigned int addr);
void led_on(void) { void *reg_base; unsigned int temp; reg_base = ioremap(0x12345678, 4); temp = __raw_readl(reg_base); temp &= ~(0xff<<12); temp |= (0x11<<12); __raw_writel(temp, reg_base); }