当前位置: 首页 > news >正文

网站开发的技术路线新媒体运营怎么自学

网站开发的技术路线,新媒体运营怎么自学,商城网站要怎样设计,用家庭宽带做网站kernel中的I2C驱动框架,笼统的概括,可以分为三个部分:core、adapter、client。其中core负责维护i2c_bus,匹配已经存在的adapter/driver/client;adapter负责master控制器,提供通信API;client_dev…

kernel中的I2C驱动框架,笼统的概括,可以分为三个部分:core、adapter、client。其中core负责维护i2c_bus,匹配已经存在的adapter/driver/client;adapter负责master控制器,提供通信API;client_device描述从设备的属性;client_driver即从设备的驱动。

一个平台上需要支持I2C,必须先要实现I2C adapter驱动。而基于这个平台的开发者,一般只需要实现I2C框架的从设备,也就是client device和client device。

adapter驱动
adapter驱动属于平台代码,它负责对I2C控制器进行操作。一般我们也实现一个platform_driver,在probe函数中注册adapter。先关的API:

struct i2c_adapter; //adapter结构体
struct i2c_algorithm;//I2C算法结构体i2c_add_numbered_adapter(...)
of_i2c_register_devices(...)

其中的关键就是我们需要自己实现一个algorithm结构体的master_xfer和functionality回调。他们会被core使用来发送数据。

adapter中我们会注册相关的中断函数,并且在xfer回调中根据传入的struct i2c_msg参数来启动传输数据。并在xfer中等待一帧数据传输完毕才返回,并且设置一个wait queue来做等待超时情况的处理。

i2c device驱动
I2C子系统上的逻辑设备仍然是由client driver本身或由平台相关的代码静态地创建的。
有两种方法创建I2C逻辑设备, 一是直接调用i2c_new_device()创建, 这种方式需要提供struct i2c_adapter作为参数。所以这种方式必须在i2c_adapter设备加载来才能使用,一般是在client driver代码中来创建,而非平台代码。一些第三方提供的client driver会使用这种方式。
另外一种方式就是在平台初始化时静态登记,调用i2c_register_board_info预先登记设备信息, 但真正不创建设备。往后当有对应bus号的adapter注册时,由core负责创建这些设备。

其实我们更可能用的一种方式是dts配置的方法。上一节中提到一个API叫做of_i2c_register_devices,其实它就是解析dts节点来创建client设备的。根据它的实现,其实它其中也是调用了i2c_new_device()函数的,所以of_i2c_register_devices只能在i2c_add_numbered_adapter之后被调用使用。

client驱动主要围绕着struct i2c_driver、struct i2c_client结构, 前者对外提供诸如设备枚举、电源管理等回调,后者由core在probe时提供给driver,描述了关联的设备的诸如名称、地址、IRQ等操作从设备的必要信息。驱动完成设备枚举后,拿到设备对应的i2c_client和i2c_adapter结构, 就可以调用core的API访问从设备了。

int i2c_master_send(const struct i2c_client *client, const char *buf, int count);
int i2c_master_recv(const struct i2c_client *client, char *buf, int count);
// 这2个是基本的传输函数,用于在一个传输周期内(START-STOP)传输slave地址+RW+一段数据。
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);
// 更加强大并通用的传输函数, 可以由多个struct i2c_msg拼凑出复杂的传输. 其中的i2c_msg定义如下:
struct i2c_msg {__u16 addr; /* slave address            */__u16 flags;
#define I2C_M_TEN       0x0010  /* this is a ten bit chip address */
#define I2C_M_RD        0x0001  /* read data, from slave to master */
#define I2C_M_NOSTART       0x4000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR  0x2000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK    0x1000  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK     0x0800  /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN      0x0400  /* length will be first received byte */__u16 len;      /* msg length               */__u8 *buf;      /* pointer to msg data          */
};
// i2c_transfer顺序处理*msgs指向的所有的i2c_msg, 每个i2c_msg执行前都会发START状态,
// 当最后一个i2c_msg执行完成后会发STOP状态.
s32 i2c_smbus_read_byte(const struct i2c_client *client);
s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value);
s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command);
s32 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value);
s32 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command);
s32 i2c_smbus_write_word_data(const struct i2c_client *client, u8 command, u16 value);
s32 i2c_smbus_read_word_swapped(const struct i2c_client *client, u8 command);
s32 i2c_smbus_write_word_swapped(const struct i2c_client *client, u8 command, u16 value);
s32 i2c_smbus_read_block_data(const struct i2c_client *client, u8 command, u8 *values);
s32 i2c_smbus_write_block_data(const struct i2c_client *client, u8 command, u8 length, const u8 *values);
s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command, u8 length, u8 *values);
s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command, u8 length, const u8 *values);
// 这些是smbus协议的常用函数, 方便兼容smbus协议的client使用.
// smbus协议是i2c协议的一个子集, 常见的i2c slave器件的寄存器读写都符合smbus协议,
// 这样的话直接使用这些函数会比使用i2c_transfer方便很多.

smbus协议请参考内核文档android/kernel/Documentation/i2c/smbus-protocol
关于I2C框架的使用, 内核有相关的文档:
android/kernel/Documentation/i2c

gpio模拟I2C控制器
上面介绍的adapter一般都是I2C控制器驱动,但是假如平台上的控制器不够用,我们可以使用gpio来模拟I2C的两线协议来发送数据。

内核中已经有了完整的一套机制,他被叫做bitbing。它主要包括两个内核代码文件i2c-gpio.c和i2c-algo-bit.c。详细内容自阅。

http://www.wooajung.com/news/34394.html

相关文章:

  • 有什么好的网站长尾关键词挖掘熊猫
  • 企业网站建站意义广告联盟赚钱app
  • 网站做跳转网络优化有前途吗
  • 如何查看网站外链网络工程师培训一般多少钱
  • 饰品企业网站建设网站整站优化推广方案
  • 做网站要多长时间互联网营销渠道有哪些
  • 陕西网站建设维护关于友谊的连接
  • 做网站的专业叫什么软件杭州seo教程
  • 做cpa必须要有网站吗百度公司官网
  • 深圳全网站建设公司百度网站排名怎么提高
  • 成都捕鱼网站建设杭州seo平台
  • java做的大型网站seo怎么发文章 seo发布工具
  • 孝感房产网站建设专业网站建设公司
  • 中国建设会计协会网站首页百度热议怎么上首页
  • 聊城做移动网站服务移动端seo关键词优化
  • 做亚马逊有什么网站可以借鉴移动广告联盟
  • 如何建立网站快捷方式到桌面优化建站
  • 好网站开发培训线上it培训机构
  • 网站源码怎么预览网址大全qq浏览器
  • 用php做的网站论文bing搜索引擎入口
  • flask做的网站如何上传文件搜索引擎优化英文简称
  • 曲阳有没有做网站里推广优化seo
  • win7 建网站sem竞价托管公司
  • dz论坛网站模板下载移动建站优化
  • 韩国化妆品网站模板网站友情链接查询
  • 安康市城乡建设规划局网站seo网站优化网站编辑招聘
  • 哪里有网站制作建设站长统计工具
  • 做外贸批发有哪些网站有哪些百度推广客服电话人工服务
  • 做现货黄金看什么网站seo引擎优化培训
  • 漯河网站建设漯河南昌seo顾问