首先声明一下工作环境,Beaglebone Black(以下简称BBB)运行:ti-sdk-
am335x-evm-08的linux-3.14.26。虚拟机是ubuntu12.04 假定工作环
境都已经搭建完成。我们需要做的是编写一个LED驱动。并写一个简单的
APP去测试驱动工作状况。
Linux设备分为三类:
1 字符设备
2 块设备
3 网络设备
LED明显归属于第一类,字符设备。接下来先从加载驱动的首先执行的init函数讲解,讲解将主要解释重要函数。完整代码在最后面给出。
/*************************************************
*MAJOR提取主设备号,如果不为零,即手动定义了,那么使用*register_chrdev_region进行注册,第一参数是设备号,在这里只需要注
*册一个设备号,因此第二个参数为1,第三个参数就是起一个名字。如果没有手动
*定义。那么使用alloc_chrdev_region分配。一般推荐使用手动分配,这样
*代码可移植性高。
************************************************/
if(MAJOR(dev->devt))
ok = register_chrdev_region(dev->devt, 1, dev->name);
} else {
ok = alloc_chrdev_region(&dev->devt, MINOR(dev->devt), 1, dev->name);
}
/********************************************************
*创建设备类,创建成功后可以在sysfs/class/见到dev->name名字的文件夹
*设备类创建成功后,使用device_create创建设备节点。创建成功后我们就能
*在/dev下找到我们的dev->name名称的LED设备。这样就不需要再使用mknod
*手动创建了。
********************************************************/
dev->dev_class = class_create(THIS_MODULE, dev->name);
dev->device = device_create(dev->dev_class, NULL, dev->devt, dev, dev->name);
/******************************************************
*dev->dev是struct cdev类型,它代表了一个字符设备。首先我们使用
*cdev_init进行初始化,并把dev->fop我们提供的调用函数与字符设备
*关联起来。接下来利用cdev_add加入系统中。在cdev_add中将会将设备加入
*kobject结构里进行管理,并调用kobject_get()增加引用计数。想了解这
*部分内容的可看设备模型。这样系统调用就可以找到我们提供的dev->fop操作
*函数了。
******************************************************/
cdev_init(&dev->dev, &dev->fop);
ok = cdev_add(&dev->dev, dev->devt, 1);
exit()函数则执行与init相反的的工作,注意销毁顺序最好与init的相反。
接下来的要探讨open函数。在open函数里我们进行对LED的GPIO管脚注册初始化。
//