目录
编写probe函数思路
- 从 device.c里面获得硬件资源
- 注册 杂项 / 字符 设备,完善 file_operation 结构体,并生成设备节点
获得硬件资源
有两种方法
- 直接获取
- 函数获取
直接获取
- 先看probe函数,这个函数有一个参数 struct platform_device *pdev
- 当匹配成功后就会调用probe这个函数,就会将device里定义的platform_device结构体当作参数来传递进来
- 这个结构体里又定义了硬件资源,就是寄存器地址什么的,可以直接拿到
- 例如在probe里输出 pdev->resource[0].name 就可以输出该寄存器的名字了
- 例如在probe里输出 pdev->resource[0].start 就可以输出该寄存器的起始地址了
- 但这个方法不安全,不推荐
函数获取
可以利用函数来将硬件资源单独复制出来一份
extern struct resource *platform_get_resource(struct platform_device *,unsigned int,unsigned int);
参数
- 第一个:probe的参数pdev
- 第二个:访问硬件资源的类型,就是硬件资源的flags
- 第三个:访问该类型的第几个硬件资源
获取步骤
- 先定义一个resource结构体变量指针
- 使用函数,返回值赋值给前面定义的resource结构体变量指针
- 判断返回值是不是空
- 然后打印
直接获取和函数获取例子
struct resource *beep_mem;
int beep_probe(struct platform_device *pdev)
{
printk("beep_probe\n");
//方法1
//printk("%s\n",pdev->resource[0].name);
//方法2
beep_mem = platform_get_resource(pdev,IORESOURCE_MEM,0);
if (beep_mem == NULL)
{
printk("platform_get_resource error\n");
return -EBUSY;
}
printk("start 0x%x\n",beep_mem->start);
printk("end 0x%x\n",beep_mem->end);