心得
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了心得相关的知识,希望对你有一定的参考价值。
本章中主要学到控制发光二极管,在本章会完成一个真正意义上的 Linux 驱动。该Linux驱动用来控制开发版上的4个LED 小灯。也就是说通过向Linux 驱动发送数据可以控制LED小灯的开关。
编写LED驱动 :
1、使用cdev_init函数初始化cdev , 描述设备文件
struct cdev{
struct kobject kobj; //封装设备文件的对象
struct module *owner; //指向内核模块的指针
const struct file_operations *ops; //指向file_operations结构体的指针
struct list_head list; //指向上一个和下一个cdev结构体的指针
dev_t dev; // 表示设备号,int类型,前12位主设备号,后20位次设备号
unsigned int count; //请求的连接设备编号范围(最大值),在建立多个设备文件时使用
}
void cdev_init(struct cdev *cdev,const struct file_operations *fops)
{
memset(cdev,0,sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj,&ktype_cdev_default);
cdev->ops = fops;
}
2、指定设备号用1个int类型表示,前12位表示主设备号,后20位表示次设备号
int dev_number=MKDEV(major,minor); //major表示主设备号,minor表示次设备号
int major=MAJOR(dev_number);
int minor=MAJOR(dev_number);
3、使用cdev_add函数将字符设备添加到内核中的字符设备数组中
int cdev_add(struct cdev *p,dev_t dev,unsigned count)
{
p->dec=dev;
p->count-count;
return kobj_map(cdev_map,dev,count,NULL,exact_match,exact_lock,p);
}
4、使用class_create 宏创建struct class
struct class *leds_class = NULL;
leds_class=class_create(THIS_MODULE,"dev_name");
5、使用device_create函数创建设备文件
device_create函数的原型如下:struct device *device_create(struct class *class,struct device *parent,dev_t devt,void *drvdata,const chahr*fmt,...)
leds_init函数是LED驱动的初始化函数:
static in leds_init(void)
{
int ret;
ret=leds_create_device();// 创建设备文件
printk(DEVICE_NAME"\tinintialized\n");
}
module_init(leds_init);
6、卸载设备文件
static void leds_destroy_device(void)
{
device_destroy(leds_class,dev_number);//移除通过device_create函数建立的字符设备
if(leds_calss)//销毁struct class
class_destroy(leds_class);
unregister_chrdev_region(dec_number,DEVICE_NUMBER);//注销字符设备区域
return;
}
static void leds_exit(void)
{
leds_destroy_device();//卸载LED驱动的设备文件
printk(DEVICE_NAME"\texit!\n");
}
module_exit(leds_exit);
7、分配寄存器
leds_init_gpm函数初始化寄存器
在leds_init函数中调用leds_init_gpm函数完成寄存器的初始化
static int leds_init(void)
{
int ret;
ret=leds_create_device();
leds_init_gpm(0xE);//初始化寄存器
printk(DEVICE_NAME"tinitialized\n");
return ret;
}
8、控制LED
两种方式:通过字符串控制(使用file_operations.write函数)
AND 通过I/O命令控制LED(使用file_operations.ioctl函数)
测试LED驱动
最后进行测试led驱动,方法有一下几种:
1.编写测试 f/0 控制命令的通用程序
2.使用 NDK 测试 LED 驱动
3.使用 Java 测试 LED 驱动
LED驱动的移植
LED 驱动最简单的移植就是将其 在不同 Lim版本下进行编译。
以上是关于心得的主要内容,如果未能解决你的问题,请参考以下文章