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

2021-06-07 09:22:30 字數 3385 閱讀 5529

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

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

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

二、一些簡述

輸入裝置驅動

分配和釋放乙個輸入裝置

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...