2.简单的平台设备

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;	       
   	}

platform_get_resource解析待整理

3.代码

pwm_buzzer平台设备驱动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值