一、驅動設計的分層和分隔
分層設計可以提高**的可重用性。它利用已有的**,做一些過載或修改,就可以完成驅動程式設計。
除了分層的設計思想外,還有分隔。一般用在匯流排外設控制器上,這樣驅動就分為了兩部分,一部分寫控制器驅動,一部分寫外設驅動,互不干涉。
二、一些簡述
輸入裝置驅動
分配和釋放乙個輸入裝置
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);
豐富linux驅動內容筆記(二)
一 驅動設計的分層和分隔 分層設計可以提高 的可重用性。它利用已有的 做一些過載或修改,就可以完成驅動程式設計。除了分層的設計思想外,還有分隔。一般用在匯流排外設控制器上,這樣驅動就分為了兩部分,一部分寫控制器驅動,一部分寫外設驅動,互不干涉。二 一些簡述 輸入裝置驅動 分配和釋放乙個輸入裝置 st...
Linux核心 驅動學習筆記 二
linux是如何管理記憶體的?今天系統的整理一下這個問題。在系統的初始化階段,核心根據檢測到的物理記憶體的大小,為每乙個頁面都建立乙個page結構,形成乙個page結構的陣列,並使乙個全域性量mem map指向這個陣列。同時又按需要將這些頁面拼合成許多記憶體頁面塊,再把塊組成管理區zone,分配和釋...
Linux驅動開發筆記(二)
linux驅動開發的基本框架 define led major 200 define led name led static int led open struct inode inode,struct file filp static int led release struct inode in...