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

培训网站制作专门做旅游攻略的网站有哪些

培训网站制作,专门做旅游攻略的网站有哪些,9e做网站,wordpress私信插件本章导读 I2C总线仅仅使用SCL、SDA两根信号线就实现了设备之间的数据交互#xff0c;极大地简化对硬件资源和PCB板布线空间的占用。因此#xff0c;I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。 Linux定义了系统的I2C驱动体系结构#xff0c;在L… 本章导读 I2C总线仅仅使用SCL、SDA两根信号线就实现了设备之间的数据交互极大地简化对硬件资源和PCB板布线空间的占用。因此I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。 Linux定义了系统的I2C驱动体系结构在Linux系统中I2C驱动由3部分组成即I2C核心、I2C总线驱动和I2C设备驱动。这3部分相互协作形成了非常通用、可适应性很强的I2C框架。    本章第1节将对Linux I2C体系结构进行分析讲明3个组成部分各自的功能及相互联系。第2节将对Linux I2C核心进行分析解释i2c-core.c文件的功能和主要函数的实现。第3、4节将分别详细介绍I2C总线驱动和I2C设备驱动的编写方法给出可供参考的设计模板。第5、6节将以第3、4节给出的设计模板为基础讲解S3C2410 ARM处理器I2C总线驱动及挂接在上的SAA7113H视频模拟/数字转换芯片设备驱动的编写方法。 15.1 Linux I2C体系结构 Linux的I2C体系结构分为3个组成部分 ?  I2C核心 I2C 核心提供了I2C总线驱动和设备驱动的注册、注销方法I2C通信方法即“algorithm”笔者认为直译为“运算方法”并不合适为免引起误解 下文将直接使用“algorithm”上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。 ?  I2C总线驱动 I2C总线驱动是对I2C硬件体系结构中适配器端的实现适配器可由CPU控制甚至直接集成在CPU内部。 I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。 经由I2C总线驱动的代码我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期以及以从设备方式被读写、产生ACK等。 ?  I2C设备驱动 I2C设备驱动是对I2C硬件体系结构中设备端的实现设备一般挂接在受CPU控制的I2C适配器上通过I2C适配器与CPU交换数据。 I2C设备驱动主要包含了数据结构i2c_driver和i2c_client我们需要根据具体设备实现其中的成员函数。 图15.1 Linux I2C体系结构 在Linux 2.6内核中所有的I2C设备都被在sysfs文件系统中显示存在于/sys/bus/i2c/目录以适配器地址和芯片地址的形式列出如 $ tree /sys/bus/i2c/ /sys/bus/i2c/ |-- devices |   |-- 0-0048 - ../../../devices/legacy/i2c-0/0-0048 |   |-- 0-0049 - ../../../devices/legacy/i2c-0/0-0049 |   |-- 0-004a - ../../../devices/legacy/i2c-0/0-004a |   |-- 0-004b - ../../../devices/legacy/i2c-0/0-004b |   |-- 0-004c - ../../../devices/legacy/i2c-0/0-004c |   |-- 0-004d - ../../../devices/legacy/i2c-0/0-004d |   |-- 0-004e - ../../../devices/legacy/i2c-0/0-004e |   -- 0-004f - ../../../devices/legacy/i2c-0/0-004f -- drivers     |-- i2c_adapter     -- lm75         |-- 0-0048 - ../../../../devices/legacy/i2c-0/0-0048         |-- 0-0049 - ../../../../devices/legacy/i2c-0/0-0049         |-- 0-004a - ../../../../devices/legacy/i2c-0/0-004a         |-- 0-004b - ../../../../devices/legacy/i2c-0/0-004b         |-- 0-004c - ../../../../devices/legacy/i2c-0/0-004c         |-- 0-004d - ../../../../devices/legacy/i2c-0/0-004d         |-- 0-004e - ../../../../devices/legacy/i2c-0/0-004e         -- 0-004f - ../../../../devices/legacy/i2c-0/0-004f 在Linux内核源代码中的drivers目录下包含一个 i2c目录而在i2c目录下又包含如下文件和文件夹 ?  i2c-core.c 这个文件实现了I2C核心的功能以及/proc/bus/i2c*接口。 ?  i2c-dev.c 实现了I2C适配器设备文件的功能每一个I2C适配器都被分配一个设备。通过适配器访问设备时的主设备号都为89次设备号为0255。应用程序通过 “i2c-%d” (i2c-0, i2c-1, ..., i2c-10, ...)文件名并使用文件操作接口open()、write()、read()、ioctl()和close()等来访问这个设备。 i2c-dev.c并没有针对特定的设备而设计只是提供了通用的read()、write()和ioctl()等接口应用层可以借用这些接口访问挂接在适配器上的I2C设备的存储空间或寄存器并控制I2C设备的工作方式。 ?  chips文件夹 这个目录中包含了一些特定的I2C设备驱动如Dallas公司的DS1337实时钟芯片、EPSON公司的RTC8564实时钟芯片和I2C接口的EEPROM驱动等。 ?  busses文件夹 这个文件中包含了一些I2C总线的驱动如S3C2410的I2C控制器驱动为i2c-s3c2410.c。 ?  algos文件夹 实现了一些I2C总线适配器的algorithm。 此外内核中的i2c.h这个头文件对i2c_driver、i2c_client、i2c_adapter和i2c_algorithm这4个数据结构进行了定义。理解这4个结构体的作用十分关键代码清单15.1、15.2、15.3、15.4分别给出了它们的定义。 代码清单15.1 i2c_adapter结构体 1  struct i2c_adapter { 2   struct module *owner;/*所属模块*/ 3  unsigned int id;   /*algorithm的类型定义于i2c-id.h以I2C_ALGO_开始*/ 4  unsigned int class; 5  struct i2c_algorithm *algo;/*总线通信方法结构体指针 */ 6  void *algo_data; /* algorithm数据 */ 7  int (*client_register)(struct i2c_client *);  /*client注册时调用*/ 8  int (*client_unregister)(struct i2c_client *); /*client注销时调用*/ 9  struct semaphore bus_lock;    /*控制并发访问的自旋锁*/ 10 struct semaphore clist_lock; 11 int timeout; 12 int retries;    /*重试次数*/ 13 struct device dev;  /* 适配器设备 */ 14 struct class_device class_dev; /* 类设备 */ 15 int nr; 16 struct list_head clients;  /* client链表头*/ 17 struct list_head list; 18 char name[I2C_NAME_SIZE];  /*适配器名称*/ 19 struct completion dev_released;    /*用于同步*/ 20 struct completion class_dev_released; 21}; 代码清单15.2 i2c_algorithm结构体 1  struct i2c_algorithm { 2   int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs, 3                      int num);  /*i2c传输函数指针*/ 4   int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,   /*smbus传输函数指针*/ 5                      unsigned short flags, char read_write, 6                      u8 command, int size, union i2c_smbus_data * data); 7   int (*slave_send)(struct i2c_adapter *,char*,int);/*当i2c适配器为slave时发送函数*/ 8   int (*slave_recv)(struct i2c_adapter *,char*,int); /*当i2c适配器为slave时接收函数*/ 9   int (*algo_control)(struct i2c_adapter *, unsigned int, unsigned long); /*类似ioctl*/ 10  u32 (*functionality) (struct i2c_adapter *);/*返回适配器支持的功能*/ 11 }; 上述代码第4行对应为SMBus传输函数指针SMBus大部分基于I2C总线规范SMBus不需增加额外引脚。与I2C总线相比SMBus增加了一些新的功能特性在访问时序也有一定的差异。 代码清单15.3 i2c_driver结构体 1  struct i2c_driver { 2   int id; 3   unsigned int class; 4   int (*attach_adapter)(struct i2c_adapter *); /*依附i2c_adapter函数指针 */ 5   int (*detach_adapter)(struct i2c_adapter *); /*脱离i2c_adapter函数指针*/ 6   int (*detach_client)(struct i2c_client *);  /*i2c client脱离函数指针*/ 7   int (*command)(struct i2c_client *client,unsigned int cmd, void *arg); /*类似ioctl*/ 8   struct device_driver driver;    /*设备驱动结构体*/ 9   struct list_head list;         /*链表头*/ 10 }; 代码清单15.4 i2c_client结构体 1  struct i2c_client { 2   unsigned int flags;  /* 标志 */ 3   unsigned short addr;     /* 低7位为芯片地址 */ 4   struct i2c_adapter *adapter; /*依附的i2c_adapter*/ 5   struct i2c_driver *driver;    /*依附的i2c_driver */ 6   int usage_count;     /* 访问计数  */ 7   struct device dev;     /* 设备结构体 */ 8   struct list_head list;       /* 链表头 */ 9   char name[I2C_NAME_SIZE]; /* 设备名称 */ 10  struct completion released;   /* 用于同步 */ 11 }; 下面分析一下i2c_driver、i2c_client、i2c_adapter和i2c_algorithm这4个数据结构的作用及其盘根错节的关系。 ?  i2c_adapter与i2c_algorithm i2c_adapter 对应于物理上的一个适配器而i2c_algorithm对应一套通信方法。一个I2C适配器需要i2c_algorithm中提供的通信函数来控制适配器上产生特定的访问周期。缺少i2c_algorithm的i2c_adapter什么也做不了因此i2c_adapter中包含其使用的 i2c_algorithm的指针。 i2c_algorithm中的关键函数master_xfer()用于产生I2C访问周期需要的信号以i2c_msg即I2C消息为单位。i2c_msg结构体也非常关键代码清单15.5给出了它的定义。 代码清单15.5 i2c_msg结构体 1 struct i2c_msg { 2  __u16 addr; /* 设备地址*/ 3   __u16 flags; /* 标志 */  4   __u16 len;  /* 消息长度*/ 5   __u8 *buf;  /* 消息数据*/ 6 }; ?  i2c_driver与i2c_client i2c_driver对应一套驱动方法是纯粹的用于辅助作用的数据结构它不对应于任何的物理实体。i2c_client对应于真实的物理设备每个I2C设备都需要一个i2c_client来描述。i2c_client一般被包含在i2c字符设备的私有信息结构体中。 i2c_driver 与i2c_client发生关联的时刻在i2c_driver的attach_adapter()函数被运行时。attach_adapter()会探测物理设备当确定一个client存在时把该client使用的i2c_client数据结构的adapter指针指向对应的i2c_adapterdriver指针指向该i2c_driver并会调用i2c_adapter的client_register()函数。相反的过程发生在 i2c_driver 的detach_client()函数被调用的时候。 ?  i2c_adpater与i2c_client i2c_adpater 与i2c_client的关系与I2C硬件体系中适配器和设备的关系一致即i2c_client依附于i2c_adpater。由于一个适配器上可以连接多个I2C设备所以一个i2c_adpater也可以被多个i2c_client依附i2c_adpater中包括依附于它的i2c_client 的链表。 假设I2C总线适配器xxx上有两个使用相同驱动程序的yyy I2C设备在打开该I2C总线的设备结点后相关数据结构之间的逻辑组织关系将如图15.2所示。 图15.2 I2C驱动各数据结构关系
http://www.huolong8.cn/news/442318/

相关文章:

  • 酷黑网站个人备案域名可以做哪些网站
  • 湘潭网站优化公司个人网站开发 怎么赚钱吗
  • 哪些网站是django做的wordpress架设专题类网站
  • 全球购物官方网站有哪些网站建设基本流程图
  • 国外idc网站高级软件开发培训
  • 工业设计网站导航设计公司网站 唐山
  • wordpress如何制作表单苏州百度seo关键词优化
  • 吉安做网站网络推广方案策划书
  • php网站开发最低配置ps做的网站
  • 网站建设公司有哪些主要内容组成石景山区网站建设
  • 鹰潭网站开发电脑网页版qq登录入口
  • 网站制作设计正规公司景观平台设计
  • wordpress网站演示青岛seo网络优化公司
  • 天津企朋做网站的公司合肥网
  • 做公司网站注意什么类似于淘宝的网站建设方案
  • 电商购物网站长沙官网网站制作公司
  • 电子配件 技术支持 东莞网站建设软件开发公司有哪些部门
  • 珠海汽车网站建设软件开发项目管理核心
  • 创建站点是什么意思包装设计十大网站
  • 青岛网站建设 大公司想做网站选什么专业
  • 邯郸网站建设行情开通微信公众号流程需要什么
  • 网站开发的试用期条款创意产品设计说明范文
  • 网站开发应用到的技术名词wordpress 注册字段
  • 江苏华江建设集团网站潍坊做网站的公司
  • 网站关键词格式威海好的网站建设公司
  • 一个企业做网站的意义惠州企业自助建站
  • 购物网站图片的放大怎么做的西安域名注册
  • 适合做手机主页的网站静态网站设计怎么做
  • 资源网官网网站推广优化建设方案
  • 自适应网站案例源码网络舆情应对措施