文章目录
1.平台设备介绍
集成在片上系统(soc)中的设备,从资源(resource)角度统一起来抽象为平台设备
1.1 平台设备优点
实现了硬件信息和驱动的分离,在硬件出现变动的时候,驱动程序可以少改甚至不改
1.2 linux设备模型
为了管理各种复杂多样的设备, 而提出的框架模型,它是采用了面向对象的方式,进行分类分层。
结构 | 描述 |
---|---|
Kobject | 用kobject构成对象的基础( 就像基类作为模型中的最原始的数据元,其它结构都集成于它) |
device | 描述对象的属性 |
driver | 控制对象的行为 |
bus | 把device driver连接起来的通讯渠道 |
//设备继承框图
kobject
|
|
|------------------------------------------------------------------------|
| | |
struct device struct cdev struct block_device
struct kobject kobj; struct kobject kobj; |
struct bus_type * bus; struct file_operations *ops; |
struct device_driver *driver; dev_t dev; | |
| | |
| ------------------------ |
| | | | | ----------
| led key touchscreen tty | |
| | RamDisk IDE
| uart
|
|
|
struct platform_device
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
|
|
|
|
------------------------
| | | |
i2c spi usb lcd
1.3 对外统一界面/sys
//---设备间层次关系直观反映出来 sysfs ( sysfs文件系统存在于内存中,是一个虚拟文件系统,其提供了kobject对象层次的视图)
/sys
|--block //包含所有的块设备,进入到block目录下,会发现下面全是link文件,link到sys/device/目录下的一些设备
|--device //包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构
|--bus //包含系统中所有的总线类型
|--class //系统中的设备类型
|--module
|--dev
|--block
|--char
2. 字符设备改造为平台设备
以pwm蜂鸣器为例,将其改造为平台设备。
2.1 相关结构体
2.1.1 平台设备结构体
/*平台设备结构体*/
// include\linux\platform_device.h
struct platform_device {
const char *name; //设备名称
int id; //设备id,用于给插入给该总线并且具有相同name的设备编号,如果只有一个设备的话填-1
bool id_auto;
struct device dev; //内嵌的device
u32 num_resources; //设备使用各类资源的数量
struct resource *resource; //设备使用的资源
const struct platform_device_id *id_entry;
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
platform_device内嵌的device结构体待整理
2.1.2 平台设备驱动结构体
/*平台设备驱动结构体*/
// include\linux\platform_device.h
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver; //内嵌的device_driver
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};
platform_driver内嵌的device_driver结构体 待整理
2.1.3 资源结构体
/*资源结构体*/
// include\linux\ioport.h
struct resource {
resource_size_t start; //资源开始位置
resource_size_t end; //资源结束位置
const char *name;
unsigned long flags; //资源的类型
// IORESOURCE_MEM (内存地址)
// IORESOURCE_IRQ (中断)
// IORESOURCE_IO
// IORESOURCE_DMA 等
struct resource *parent, *sibling, *child;
};
2.2 改造为平台设备
2.2.1 平台设备的入口
static const struct of_device_id machled[] = {
{ .compatible = "pwm0,buzzer"}, //必须和设备树里的设备名字一样
{},
};
MODULE_DEVICE_TABLE(of, machled);
struct platform_driver buzzer_platform_driver = {
.driver = {
.name = "pwm_beep",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(machled),
},
.probe = buzzer_probe, //动态探测并初始化
.remove = buzzer_remove, //移除
};
module_platform_driver(buzzer_platform_driver); //平台设备入口声明
2.2.2 从设备树中提取硬件资源
//从设备树提取硬件信息
//用于保存从设备树提取的硬件资源
struct resource *buzzer_res_con = NULL;
struct resource *buzzer_res_pwm = NULL;
buzzer_res_con =platform_get_resource(pdev,IORESOURCE_MEM,0);
if(buzzer_res_con ==NULL){
printk("platform_get_resource buzzer_res_con error\n");
return -1;
}
buzzer_res_pwm =platform_get_resource(pdev,IORESOURCE_MEM,1);
if(buzzer_res_con ==NULL){
printk("platform_get_resource buzzer_res_pwm error\n");
return -1;
}