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 ...
随机推荐
- 《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)
在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量 ...
- Shell入门教程:Shell的基本结构
shell程序的基本组成结构 shell结构大体是由设定变量.内置命令.shell的语法结构.函数组成. 使用实例说明:test.sh #!/bin/bash #说明使用/bin/bash作为这个脚本 ...
- JDK source 之 LinkedHashMap原理浅谈
注:本文参考JDK1.7.0_45源码. LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的 ...
- MySQL 事物控制和锁定语句
一.MySQL支持对MyISAM和MEMORY存储引擎的表进行表级锁定,对InnoDB存储引擎的表进行行集锁定.默认情况下是自动获得. 二.LOCK TABLES 可以用于锁定当前线程获得的表,如果表 ...
- and or bool and a or b 原理解释
python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值. or也是从左到有计算表达式,返回第一个为真的值. 代码如下: IDLE 1.2.4>&g ...
- proj.4投影变换图示
- __new__方法
__new__:创建对象时调用,返回当前对象的一个实例__init__:创建完对象后调用,对当前对象的实例的一些初始化,无返回值 案例一: >>> class A(object): ...
- win7 去快捷箭头
去掉快捷方式箭头.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows ...
- ABAP 上传文件到内表
http://www.cnblogs.com/jiangzhengjun/p/4265642.html http://www.xuebuyuan.com/1233478.html
- GIT学习
git init git add . git commit -m "" git status git diff 工作区->版本库->暂存区stage.master分支. ...