现在的位置: 首页 > 综合 > 正文

丰富linux驱动内容笔记(二)

2013年09月20日 ⁄ 综合 ⁄ 共 2751字 ⁄ 字号 评论关闭

 

一、驱动设计的分层和分隔

分层设计可以提高代码的可重用性。它利用已有的代码,做一些重载或修改,就可以完成驱动程序设计。

除了分层的设计思想外,还有分隔。一般用在总线外设控制器上,这样驱动就分为了两部分,一部分写控制器驱动,一部分写外设驱动,互不干涉。

二、一些简述

输入设备驱动

分配和释放一个输入设备

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

 

抱歉!评论已关闭.