linux设备驱动
http://blog.csdn.net/bob_fly1984/article/details/8820670
struct ov5640_data {
struct ov5640_platform_data chip;
bool use_smbus;
/*
* Lock protects against activities from other Linux tasks,
* but not from changes by other I2C masters.
*/
struct mutex lock;
struct bin_attribute bin;
u8 *writebuf;
unsigned write_max;
unsigned num_addresses;
/*
* Some chips tie up multiple I2C addresses; dummy devices reserve
* them for us, and we'll use them with SMBus calls.
*/
struct i2c_client *client[];
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static struct ov5640_platform_data ov5640_chip_info;
static struct i2c_board_info ov5640_i2c_board_info __initdata ={
.type = CONFIG_OV5640_TYPE,
.addr = CONFIG_OV5640_DEVICE_ADDR,
};
static void __init i2c_board_init(void)
{
int i;
for (i = 0; i < sizeof(ov5640_list) / sizeof(struct ov5640_info); i++) {
if (strcmp(ov5640_i2c_board_info.type, ov5640_list[i].name) == 0) {
ov5640_chip_info.byte_len = ov5640_list[i].byte_len;
ov5640_chip_info.page_size = ov5640_list[i].page_size;
ov5640_chip_info.flags = ov5640_list[i].flags;
ov5640_i2c_board_info.platform_data = &ov5640_chip_info;
break;
}
}
i2c_register_board_info(CONFIG_OV5640_I2C_BUS_NUM, &ov5640_i2c_board_info, 1);
}
这一堆是一个从设备client dev的注册
一个从设备的属性,注册通过
i2c_register_board_info(int busnum, struct i2c_board_info const *info, unsigned n);
struct i2c_board_info {
char type[I2C_NAME_SIZE];/×相当于设备名用于区分×/
unsigned short flags;
unsigned short addr;
void *platform_data;
struct dev_archdata *archdata;
struct device_node *of_node;
struct acpi_dev_node acpi_node;
int irq;
};
自定义一个结构体
struct ov5640_info {
char *name;
unsigned int byte_len; /* size (sum of all addr) */
unsigned short page_size; /* for writes */
unsigned char flags;
};
定义一个结构体数组
static const struct ov5640_info ov5640_list[] = {
{ "OV5640", 128 / 8, 1, ov5640_FLAG_TAKE8ADDR },
{ NULL, 0, 0, 0 } /* END OF LIST */
};
相当于busnum,几路i2c
定义一个结构体存储用户数据
struct at24_platform_data {
u32 byte_len; /* size (sum of all addr) */
u16 page_size; /* for writes */
u8 flags;
#define AT24_FLAG_ADDR16 0x80 /* address pointer is 16 bit */
#define AT24_FLAG_READONLY 0x40 /* sysfs-entry will be read-only */
#define AT24_FLAG_IRUGO 0x20 /* sysfs-entry will be world-readable */
#define AT24_FLAG_TAKE8ADDR 0x10 /* take always 8 addresses (24c00) */
void (*setup)(struct memory_accessor *, void *context);
void *context;
};
static struct ov5640_platform_data ov5640_chip_info;
static struct i2c_board_info ov5640_i2c_board_info __initdata ={
.type = CONFIG_OV5640_TYPE,
.addr = CONFIG_OV5640_DEVICE_ADDR,
};
static void __init i2c_board_init(void)
{
int i;
for (i = 0; i < sizeof(ov5640_list) / sizeof(struct ov5640_info); i++) {
if (strcmp(ov5640_i2c_board_info.type, ov5640_list[i].name) == 0) {
ov5640_chip_info.byte_len = ov5640_list[i].byte_len;
ov5640_chip_info.page_size = ov5640_list[i].page_size;
ov5640_chip_info.flags = ov5640_list[i].flags;
ov5640_i2c_board_info.platform_data = &ov5640_chip_info;
break;
}
}
i2c_register_board_info(CONFIG_OV5640_I2C_BUS_NUM, &ov5640_i2c_board_info, 1);
}
将定义的platform_data注册进去
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static const struct i2c_device_id ov5640_ids[] = {
{ "OV5640", 0 },
};
MODULE_DEVICE_TABLE(i2c, ov5640_ids);
static struct i2c_driver ov5640_driver = {
.driver = {
.name = "OV5640",
.owner = THIS_MODULE,
},
.probe = ov5640_probe,
.remove = __devexit_p(ov5640_remove),
.id_table = ov5640_ids,
};
i2c_driver模型
struct i2c_driver {
unsigned int class;
/* Notifies the driver that a new bus has appeared. You should avoid
* using this, it will be removed in a near future.
*/
int (*attach_adapter)(struct i2c_adapter *) __deprecated;
/* Standard driver model interfaces */
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
int (*remove)(struct i2c_client *);
/* driver model interfaces that don't relate to enumeration */
void (*shutdown)(struct i2c_client *);
int (*suspend)(struct i2c_client *, pm_message_t mesg);
int (*resume)(struct i2c_client *);
/* Alert callback, for example for the SMBus alert protocol.
* The format and meaning of the data value depends on the protocol.
* For the SMBus alert protocol, there is a single bit of data passed
* as the alert response's low bit ("event flag").
*/
void (*alert)(struct i2c_client *, unsigned int data);
/* a ioctl like command that can be used to perform specific functions
* with the device.
*/
int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
struct device_driver driver;
const struct i2c_device_id *id_table;
/* Device detection callback for automatic device creation */
int (*detect)(struct i2c_client *, struct i2c_board_info *);
const unsigned short *address_list;
struct list_head clients;
};
struct i2c_client {
unsigned short flags; /* div., see below */
unsigned short addr; /* chip address - NOTE: 7bit */
/* addresses are stored in the */
/* _LOWER_ 7 bits */
char name[I2C_NAME_SIZE];
struct i2c_adapter *adapter; /* the adapter we sit on */
struct device dev; /* the device structure */
int irq; /* irq issued by device */
struct list_head detected;
};
static int __init ov5640_init(void)
{
io_limit = rounddown_pow_of_two(io_limit);
return i2c_add_driver(&ov5640_driver);
}
module_init(ov5640_init);
static void __exit ov5640_exit(void)
{
i2c_del_driver(&ov5640_driver);
}
module_exit(ov5640_exit);
/* eeprom device private list */
linux设备驱动的更多相关文章
- 浅谈Android系统移植、Linux设备驱动
一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...
- linux设备驱动概述,王明学learn
linux设备驱动学习-1 本章节主要学习有操作系统的设备驱动和无操作系统设备驱动的区别,以及对操作系统和设备驱动关系的认识. 一.设备驱动的作用 对设备驱动最通俗的解释就是“驱使硬件设备行动” .设 ...
- Linux设备驱动工程师之路——内核链表的使用【转】
本文转载自:http://blog.csdn.net/forever_key/article/details/6798685 Linux设备驱动工程师之路——内核链表的使用 K-Style 转载请注明 ...
- linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-119723.html linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟 xxxxxxxxxx ...
- linux设备驱动归纳总结(十二):简单的数码相框【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-116926.html linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
- linux设备驱动归纳总结(十):1.udev&misc【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...
- linux设备驱动归纳总结(九):1.platform总线的设备和驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-111745.html linux设备驱动归纳总结(九):1.platform总线的设备和驱动 xxxx ...
- linux设备驱动归纳总结(八):4.总线热插拔【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110774.html linux设备驱动归纳总结(八):4.总线热插拔 xxxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-110738.html linux设备驱动归纳总结(八):3.设备管理的分层与面向对象思想 xxxxxx ...
随机推荐
- NGUI 学习笔记
1.NGUI中UI的深度关系(新版NGUI 3.9): 在同一个Panel中,不管同不同Altas,各个UI的顺序受Depth影响 在不同Panel中,UI的顺序受Panel的Depth影响 例如Pa ...
- NOSDK--SDK一键打包及统一接入的实现(前言)
前言 一,一键打包的实现 1.1 shell脚本执行流程介绍 1.2 自动刷新mk文件的脚本介绍 1.3 编译及拷贝资源的脚本介绍 1.4 打包及签名的脚本介绍 1.5 mac下的脚本环境配置及脚本的 ...
- URL传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64_encode
很多时候,我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样, 对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlenc ...
- java后端制作MD5加密
由于一次业务的需要,我制作了一次密码的修改子业务. 当用户忘记密码的情况下,我需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密码.让用户再去修改 ...
- jquery--常用的函数2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MATLAB的SAVE命令动态批量保存TXT文件
1.使用save(): for i=1:6 str=[num2str(i),’.txt’]; m=[1 2; 3 4]; save(str,’m’,’-ascii’);%注意m的单引号,一定记得加上, ...
- Mac键盘图标与对应快捷按键标志汇总
Mac键盘图标与对应快捷按键 ⌘--Command () win键 ⌃ --Control ctrl键 ⌥--Option (alt) ⇧--Shift ⇪--Caps Lock fn--功能键就是 ...
- eclipse安装genymotion插件
1.打开eclipse,在界面上点击"Help"按钮,在弹出来的下拉菜单中选择"Install New Software..."选项.系统弹出"Ins ...
- sql server中将一个字段根据某个字符拆分成多个字段显示
sql server 数据库中某张表(Person)的数据信息是: ID Address 1 平山花园-4单元-12幢-203 2 香山花园-3单元-22幢-304 现在有需求是,将地址信息显示形式改 ...
- MVC+Easeyui dialog的小问题
今天在尝试 MVC+Easyui的练习中遇到的一些,小问题. 在.net MVC 中 在_layout.cshtml中设置Easyui 环境 ,在传到子页中,发现$("#dlg" ...