豐富linux驅動內容筆記(二)

來源:互聯網
上載者:User

 

一、驅動設計的分層和分隔

分層設計可以提高代碼的可重用性。它利用已有的代碼,做一些重載或修改,就可以完成驅動程式設計。

除了分層的設計思想外,還有分隔。一般用在匯流排外設控制器上,這樣驅動就分為了兩部分,一部分寫控制器驅動,一部分寫外設驅動,互不干涉。

二、一些簡述

輸入裝置驅動

分配和釋放一個輸入裝置

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.