一、驅動設計的分層和分隔
分層設計可以提高代碼的可重用性。它利用已有的代碼,做一些重載或修改,就可以完成驅動程式設計。
除了分層的設計思想外,還有分隔。一般用在匯流排外設控制器上,這樣驅動就分為了兩部分,一部分寫控制器驅動,一部分寫外設驅動,互不干涉。
二、一些簡述
輸入裝置驅動
分配和釋放一個輸入裝置
struct input_dev *input_allocate_device(void);
void input_free_device(struct input_dev *dev);
註冊/登出輸入裝置
int __must_check input_register_device(struct input_dev *);
void input_unregister_device(struct input_dev *);
報告輸入事件可用的介面
報告指定type和code的輸入事件
void input_event(struct input_dev *dev,unsigned int type,unsigned int code,int value);
報告索引值
void input_report_key(struct input_dev *dev,unsigned int code,int value);
報告相對座標
void input_report_rel(struct input_dev *dev,unsigned int code,int value);
報告絕對座標
void input_report_abs(struct input_dev *dev,unsigned int code,int value);
報告同步事件
void input_sync(struct input_dev *dev)
spi驅動
spi_master結構體用來描述一個SPI主機控制器驅動
struct spi_master{
struct device dev;
s16 bus_num;
u16 num_chipselect;
int (*setup)(struct spi_device *spi);
int (*transfer)(*transfer)(struct spi_device *spi,struct spi_message *mesg);
void (*cleanup)(struct spi_device *spi);
};
分配、登出和註冊SPI主機
struct spi_master *spi_alloc_master(struct device *host,unsigned size);
int spi_register_master(struct spi_master *master);
void spi_unregister_master(struct spi_master *master);
spi_driver結構體用來描述一個SPI外設驅動,可以認為是spi_master的client驅動
struct spi_driver{
int (*probe)(struct spi_device *spi);
int (*remove)(struct spi_device *spi);
void (*shutdown)(struct spi_device *spi);
int (*suspend)(struct spi_device *spi,pm_message_t mesg);
int (*resume)(struct spi_device *spi);
struct device_driverdriver;
};
一次完整的SPI傳輸可能不只一次spi_transfer,這些spi_transfer是通過spi_message組織在一起。
spi_message_init(struct spi_message *message)可以初始化spi_message
添加spi_transfer到spi_message隊列
void spi_message_add_tail(struct spi_transfer *t,struct spi_message *m);
同步與非同步傳輸
int spi_sync(struct spi_device *spi,struct spi_message *message);
int spi_async(struct spi_device *spi,struct spi_message *message);
三、misc,sysfs裝置驅動
miscdevice共用一個主裝置號MISC_MAJOR(10),但次裝置號不同。miscdevice本質上仍然屬於字元裝置。但寫驅動時不必再申請cdev結構。
註冊和登出混雜裝置
int misc_register(struct miscdevice *misc);
int misc_deregister(struct miscdevice *misc);
一些裝置驅動以sysfs結點的形式存在,其本身並沒有對應的/dev結點。此種類型的裝置驅動結構體
struct sysdev_driver{
struct list_head entry;
int (*add)(struct sys_device *);
int (*remove)(struct sys_device*);
int (*shutdown)(struct sys_device *);
int (*suspend)(struct sys_device *,pm_message_t state);
int (*resume)(struct sys_device *);
};
註冊和登出裝置驅動
int sysdev_driver_register(struct sysdev_class *,struct sysdev_driver *);
int sysdev_driver_unregister(struct sysdev_class *,struct sysdev_driver *);
建立和移除sysfs結點
int sysdev_create_file(struct sys_device *,struct sysdev_attribute *);
void sysdev_remove_file(struct sys_device *,struct sysdev_attribute *);
linux裝置驅動的韌體
申請韌體
int request_firmware(const struct firmware **fw,const char *name,struct device *device);
void release_firmware(const struct firmware *fw);