Linux平台设备驱动

平台设备驱动是将硬件代码与驱动代码分离,设备信息包括硬件资源和软件信息。structplatform_device结构体描述平台设备,而structplatform_driver描述平台驱动。注册和注销设备及驱动分别由platform_device_register和platform_driver_register等函数处理。probe函数在设备和驱动匹配成功时执行,用于初始化设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux平台设备驱动

  • Fang XS.
  • 1452512966@qq.com
  • 如果有错误,希望被指出

平台设备驱动

  • 平台设备驱动是将硬件部分的代码与驱动部分的代码分开,注册到平台设备总线中。
平台设备
  • 平台设备的工作是为驱动程序提供设备信息,设备信息包括硬件信息和软件信息两部分。
  • 硬件部分包括寄存器,中断号,内存资源,IO等。
  • 软件部分包括以太网卡设备中的MAC地址、I2C设备中的设备地址、SPI设备的片选信号线等。
平台设备device.c
  • device.c首先实现struct platform_device结构体,注册平台设备。
  • 平台设备用struct platform_device结构体进行描述。
struct platform_device {
	const char *name;
	int id;
	bool id_auto;
	struct device dev;
	u32 num_resources;
	struct resource *resource;
	const struct platform_device_id *id_entry;
	char *driver_override; 
	struct mfd_cell *mfd_cell;
	struct pdev_archdata archdata;
};
  • 平台设备的硬件资源用struct resource进行描述。
  • 注册平台设备
/**
 * @param pdev 要注册的平台设备
 * @return 0:成功 负数:失败
 */
int platform_device_register(struct platform_device *pdev);
  • 注销平台设备
/**
 * @param pdev 要注销的平台设备
 * @return None
 */
void platform_device_unregister(struct platform_device *pdev);
设备树
  • 未使用设备树的平台总线驱动是device.c+driver.c
  • 其中device.c用来描述设备信息,driver.c用来描述设备的驱动。
  • 而设备树下的平台总线驱动是设备树+driver.c
  • 其中原来用于描述设备信息的device.c,使用设备树语法进行描述。
  • 也就是非设备树平台总线驱动是device.c+driver.c
  • 设备树下的平台总线驱动在设备树里添加相应节点,用driver.c来写驱动。
平台驱动
平台驱动driver.c
  • driver.c首先实现struct platform_driver结构体,注册平台驱动。
  • 内核中使用struct platform_driver结构体来描述平台驱动。
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;				
	const struct platform_device_id *id_table;	
	bool prevent_deferred_probe;
};
  • 注册平台驱动
/**
 * @param pdev 要注册的平台驱动
 * @return None
 */
int platform_driver_register(struct platform_driver *drv);
  • 注销平台驱动
/**
 * @param pdev 要注销的平台驱动
 * @return None
 */
void platform_driver_unregister(struct platform_driver *drv);
  • 内核提供的宏
/* include/linux/platform_device.h  */
/* module_platform_driver() - Helper macro for drivers that don't do
 * anything special in module init/exit.  This eliminates a lot of
 * boilerplate.  Each module may only use this macro once, and
 * calling it replaces module_init() and module_exit()
 */
#define module_platform_driver(__platform_driver) \
	module_driver(__platform_driver, platform_driver_register, \
			platform_driver_unregister)
  • 在平台设备,平台驱动加载的时候,没有先后顺序。
  • 平台设备与平台驱动匹配条件,满足一条即可
    • struct platform_driver::driver::namestruct platform_device::name相同
    • struct platform_driver::id_table::namestruct platform_device::name相同
    • id_table匹配优先级高于driver::nameid_table存在以id_table为准。
probe函数
  • struct platform_driver中的int (*probe)(struct platform_device *); 函数指针必须实现
  • probe函数执行的条件是平台设备和平台驱动匹配成功,或者设备树某节点compatible属性与平台驱动匹配成功
  • 当平台驱动与平台设备匹配成功,将自动执行probe函数,在probe函数中可以获取平台设备或设备树资源,再创建字符设备、杂项设备等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值