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 ...
随机推荐
- centos7删除自带openjdk
一些开发版的centos会自带jdk,我们一般用自己的jdk,把自带的删除.先看看有没有安装java -version [root@java-test-01 ~]# java -version ope ...
- 代码质量管理工具 sonar 配置
代码检查工具有很多findBugs等等 sonar配置: 1.下载sonar 5.5, 解压,运行 sonarqube-5.5\bin\windows-x86-64\StartSonar.bat , ...
- [转载]Java数组扩容算法及Java对它的应用
原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...
- QuickSort 快速排序 基于伪代码实现
本文原创,转载请注明地址 http://www.cnblogs.com/baokang/p/4737492.html 伪代码 quicksort(A, lo, hi) if lo < hi p ...
- word20161211
H.323 half-duplex / 半双工 handle count / 句柄数 handshaking / 握手 Hardware Compatibility List, HCL / 硬件兼容性 ...
- 交叉编译fftw
交叉编译 fftw 使用的源码是 fftw-3.2.2-arm.tar.gz 新塘平台arm ./configure --prefix=/usr/local/fftw_arm --host=arm-l ...
- dex文件格式二
一. dex文件头 (1) magic value 在DexFile.c dexFileParse函数中 会先检查magic opt 啥是magic opt呢? 我们刚刚从cache目录拷贝出来的 ...
- EXCEL科学计数法转为文本格式
1.单元格格式-->特殊-->邮政编码 2.分列:选中数据-菜单栏“数据”-“分列”-下一步-下一步-选中文本-确定即可3.公式TEXT:如果数据在A列 =TEXT(A1,,0) 向下复制 ...
- OOCSS的概念和思路
<概念> <思路> 面向对象的CSS有两个原则: 独立的结构和样式 独立的容器和内容 以下几点是创建OOCSS的关键部分: 创建一个组件库 独立的容器和内容,并且避免样式来依赖 ...
- c# 创建xml
<?xml version="1.0" encoding="UTF-8"?> <swUpgrade xmlns="http://ww ...