Linux4个led灯循环点亮程序,linux驱动学习笔记---点亮一个led灯(三)

led硬件地址映射和操作

1.点亮s5pv210的led灯首先需要知道其所用引脚,以及引脚所对应的状态寄存器与数据寄存器

Linux4个led灯循环点亮程序,linux驱动学习笔记---点亮一个led灯(三)_第1张图片

d21133cb2ecf12b333ffabcf6ae53271.png

根据外围电路图可知两个灯所用的引脚分别为gpc0_3与gpc0_4,找到其引脚所对应的寄存器

Linux4个led灯循环点亮程序,linux驱动学习笔记---点亮一个led灯(三)_第2张图片

状态寄存器

Linux4个led灯循环点亮程序,linux驱动学习笔记---点亮一个led灯(三)_第3张图片

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);

//

你可能感兴趣的:(Linux4个led灯循环点亮程序,linux驱动学习笔记---点亮一个led灯(三))