嵌入式linux学习笔记--LED驱动 (用到主设备号 和 次设备号)

2019-07-13 08:15发布

////////////////////////////
在open函数中对硬件进行初始化,在write函数中对硬件进行赋值操作
//////////////////////////////
手动创建设备节点文件
1.驱动程序中可以自动分配 或者 手动指定主设备号
2.应用程序打开设备文件,则需要创建设备节点文件
a.手动创建 mknod /dev/xxx c 231 0(前提是已经查看了设备文件的主设备号,)
b.mdev根据系统信息自动创建设备文件


如何自动创建设备节点文件:
1.定义
static struct class *firstdrv_class;
static struct class *firstdrv_class_dev;//这个是创建一个设备,可用数组创建多个
2.启动程序入口函数中,注册完字符设备驱动后创建类 在 /cd /sys/class目录下
3.创建类之后创建设备:主设备号,次设备号,设备名称。设备名称也就是设备文件的名称
4.启动程序出口删除设备(设备文件),销毁类
///////////////////////////////////////////////
上面的这些函数会在/sys目录下创建相关文件,这些文件将被mdev(从linux2.6.35版本开始使用udev)
用来自动创建设备节点文件。在/sys/class/firstdrv/xyz/下生成dev文件,该文件包含驱动的主设备号和次设备号。
用命令 #cat dev  输出:252 0  分别是主设备号和次设备号 




unsigned long copy_from_user(void *to,const void __user*from,unsigned long n)
{
might_sleep(); 
if (access_ok(VERIFY_READ, from, n))
n = __copy_from_user(to, from, n);
else
memset(to, 0, n);
return n;
}




使用次设备号,
在open函数中获得次设备号 : int minor = MINOR(inode->i_rdev);
在write函数中获得次设备号: int minor = MINOR(file->f_dentry->d_inode->i_rdev)


主设备号,次设备号和设备文件是怎么样的关系?
1. 应用程序使用的是设备文件(设备节点文件),而内核和驱动使用的是设备号,
其中内核只使用主设备号,次设备号留给驱动使用。
2. 每个设备文件都关联了一个主设备号和次设备号。譬如/dev/leds对应主次设备号为252,0
/dev/led1对应主次设备号为252,1;这个对应关系是在驱动程序初始化时建立的,如下:(实际是由mdev函数实现的)
for(minor = 1;minor <4;minor++)
{
leds_class_devs[minor] = clasee_device_create(leds,NULL,MKDEV(major,minor),NULL,"led%d",minor)
//这里""是通配符的使用;; MDKEV将主设备号major和次设备号minor转换成dev_t类型,
//该变量将会和设备文件ledn(n=s,1,2,3,4)关联起来
}


3.当应用程序打开某个设备文件时,内核会根据主设备号找到对应的驱动程序,调用对应的驱动程序,
程序驱动会根据次设备号进行具体的操作。


...............................
如果设备无法打开,需要确认以下三点:
./ledtest /leds on 输出 can't open /dev/leds!
1 查看驱动模块是否已经加载    输入命令
#lsmod
2 查看系统设备是否有该设备   输入命令
#cat /proc/devices
没有找到设备led_drv
3 查看是否已经生产设备节点  输入命令
#ls /dev/led* -l                         正常应该输入下图所示