嵌入式linux平台裝置驅動(裝置驅動模型)開發之linux核心中的裝置__linux
來源:互聯網
上載者:User
linux核心中的裝置 對於掛接在具體匯流排上外部裝置都有一個struct device與之對應,比如平台裝置有platform_device與之對應,其中platform_device結構體如下: struct platform_device {
const char * name; //裝置名稱,要與driver的名字進行匹配,如果成功則進入驅動的探測函數
int id;
struct device dev;
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_archdataarchdata;
};
對於usb匯流排上的usb裝置用struct usb_device 來代表具體的usb裝置或則是記錄具體usb的相關資訊,其中usb_device的結構體如下: struct usb_device {
char path[SYSFS_PATH_MAX];
char busid[SYSFS_BUS_ID_SIZE];
uint32_t busnum;
uint32_t devnum;
uint32_t speed;
uint16_t idVendor;
uint16_t idProduct;
uint16_t bcdDevice;
uint8_t bDeviceClass;
uint8_t bDeviceSubClass;
uint8_t bDeviceProtocol;
uint8_t bConfigurationValue;
uint8_t bNumConfigurations;
uint8_t bNumInterfaces;
} __attribute__((packed));
linux系統中所代表的外部裝置的結構體變數時在系統的啟動階段或則動態註冊到相應的匯流排上去。並且註冊到裝置到相應的匯流排是通過調用device_add函數來實現的。所謂的註冊裝置匯流排是將裝置載入匯流排代表裝置的鏈表中區。 struct device { struct klist_node knode_bus; struct klist_node knode_driver; struct bus_type *bus; struct device_driver *driver; };
struct klist_node knode_bus; linux 核心通過該成員device載入他所在的鏈表裝置的鏈表成,即是把device 載入到klist_devices鏈表上去。
struct klist_node knode_driver; 即是把driver載入到klist_drivers中去
struct bus_type *bus; 表示裝置所掛載 的匯流排 struct device_driver *driver; 表示裝置所對應的裝置驅動
添加平台裝置到平台匯流排的相關函數以及周邊函數 extern int platform_device_register(struct platform_device *);
extern void platform_device_unregister(struct platform_device *);
extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
extern int platform_get_irq(struct platform_device *, unsigned int);
extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);
extern int platform_get_irq_byname(struct platform_device *, const char *);
extern int platform_add_devices(struct platform_device **, int);