linux驱动开发之内核对硬件初始化的方式

编写驱动的套路
0, 实例化全局的设备对象
1, 申请主设备号
2, 自动创建设备节点
3, 初始化硬件:ioremap(phys_addr_t offset, unsigned long size)
4,实现 file_operation

看底板原理图:知道想要LED1亮,需要在GPC0_3提供一个高电平。
linux驱动开发之内核对硬件初始化的方式
GPC0_3在系统芯片电路中可以找到,
linux驱动开发之内核对硬件初始化的方式
查看相关数据手册S5PV210_UM_REV1.1.pdf(链接:https://pan.baidu.com/s/1o9PQpaa 密码:nj6z)
linux驱动开发之内核对硬件初始化的方式
linux驱动开发之内核对硬件初始化的方式
找到GPC0_CON控制寄存器和GPC0_DAT
这里写的内核代码中,不能直接对寄存器复制。
因为内核空间全部是虚拟地址,即虚拟空间。
这里通过MMU将一个物理地址转换成虚拟地址。
为什么需要虚拟地址—-一开始是可以直接使用物理地址的,但是运行内存有限,程序员每次写代码都需要考虑这个问题,才有了后来的MMU,就可以虚拟出4G空间。
我们操作虚拟地址,内核会给我们提供ioremap()这个函数,这个函数会把内存地址映射出来。

需要(1)
// 3, 初始化硬件—–一般在创建设备节点之后
//参数1—物理地址
//参数2–映射的长度
//返回值–映射之后的虚拟地址
gpc0_conf = ioremap(0xE0200060, 8);//这个需要操作两个寄存器GPC0CON和GPC0DAT,每个是4个字节
//数据寄存器
gpc0_data = gpc0_conf + 1;
//如果要配置输出
*gpc0_conf &= ~(0xff<<12); //清零
*gpc0_conf |= (0x11<<12); //置一
*gpc0_cof &= (0x03<<3);//亮灯

需要(2)
去除映射
iounmap(gpc0_conf);

开发板型号:S5PV210
执行程序后,可以看到开发板上面的2个灯亮起来,问题是这个程序不能真正控制LED灯,需要应用程序的操作。