led硬件地址映射和操作
1.点亮s5pv210的led灯首先需要知道其所用引脚,以及引脚所对应的状态寄存器与数据寄存器
根据外围电路图可知两个灯所用的引脚分别为gpc0_3与gpc0_4,找到其引脚所对应的寄存器
状态寄存器
5位的数据寄存器
在驱动模块加载中做地址映射,映射的地址为8个字节64位(包括状态寄存器与数据寄存器)
gpc0con + 1(一个寄存器为4个字节32位,表示指向下一个寄存器0xE0200064)
// 3,实现驱动模块加载/卸载入口函数
static int led_drv_init(void)
{
printk("--------^_* %s-------\n", __FUNCTION__);
int ret;
// 申请主设备号, 默认次设备号为0
// 参数1---指定的主设备号--就是一个整数,选255以上
//参数2--设备的描述--自定义的字符串
//参数3--设备驱动的文件操作对象
//返回值: 错误为负数,正确为0
ret = register_chrdev(led_major, led_name, &led_fops);
if(ret < 0)
{
printk("register_chrdev error\n");
return ret;
}
// 自动创建设备节点
//创建设备文件所属类别
//参数1--拥有者--当前模块
//参数2--类别的名字--自定义
//返回值---返回一个指针
led_cls = class_create(THIS_MODULE, "led_cls");
//创建设备文件
//参数1--所属类别
//参数2--当前创建的设备文件的父类是谁--一般NULL
//参数3--关联的设备号
//参数4--当前设备文件的私有数据--一般NULL
//参数5/6--设定设备文件的名字
device_create(led_cls, NULL, MKDEV(led_major, 0), NULL, "led0"); // led0
//参数1--硬件的物理地址
//参数2--映射的地址长度
//返回值---映射之后的虚拟地址
gpc0con = ioremap(0xE0200060, 8);
gpc0dat = gpc0con + 1;
return 0;
}
在卸载的函数中 去映射
static void led_drv_exit(void)
{
printk("--------^_* %s-------\n", __FUNCTION__);
//去映射
//参数1---映射之后的虚拟地址
iounmap(gpc0con);
//