http://blog.csdn.net/yongan1006/article/details/6729881
一、驱动设计的分层和分隔
分层设计可以提高代码的可重用性。它利用已有的代码,做一些重载或修改,就可以完成驱动程序设计。
除了分层的设计思想外,还有分隔。一般用在总线外设控制器上,这样驱动就分为了两部分,一部分写控制器驱动,一部分写外设驱动,互不干涉。
二、一些简述
输入设备驱动
分配和释放一个输入设备
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);