资讯详情

第九讲 Linux I2C子系统及mma8653重力传感器驱动编写

2、I2C子系统

subsystem bus dev drv
platform bus_type platform_device platform_driver
I2C bus_type i2c_client i2c_driver
办法 特点 优缺点
把它放在相应的时间节点上IO口拉高/低 思路清晰,操作麻烦
配置寄存器 操作麻烦,可移植性差
内核密封上述方法,并将其安装成函数接口 操作简单,移植性好,初次接触难以理解
  • image-20220403104452284

image-20220403105257898

2.1、I2C总线(/driver/i2c/busses/i2c-nxp.c)

  • 功能:
    • 实现通信
    • 实现设备与驱动的分离(使用platform注册一个系统i2c子实现)

2.2、I2C核心层(/driver/i2c/i2c-core.c)

子系统的核心是管理适配器、设备和驱动。主要实现device和driver注册、匹配、回调和注销。

  • 注册了i2c总线,注册了dummy Driver

  • 提供了adapter、driver、i2c_board_info等待注册/注销方法

  • 提供通信方式(send/recv)

      • i2c_transfer()

        /* *传输数据 */int  i2c_transfer(struct  i2c_adapter  *adap,  struct  i2c_msg  *msgs,int  num);struct  i2c_msg  __u16 addr;  /* slave address */  __u16 flags;  /*写是0,读是1*/#define  I2C_M_TEN  0x0010  /*a ten bit chip address*/#define  I2C_M_RD  0x0001  /* read data,from slave to master */#define  I2C_M_NOSTA  0x4000#define  I2C_M_REV_DIR_ADDR  0x2000#define  I2C_M_IGNORE_NAK  0x1000#define I2C_M_NO_RD_ACK 0x0800#define I2C_M_RECV_LEN 0x0400 /*length will be first received byte*/	__u16 len; 				/* msg length */	__u8 *buf;  			/* pointer to msg data */};
      • 利用i2c_transfer只需填充一个i2c_msg即可:

        msg[0].addr = addr;			/*器件地址*/msg[0].flags = !I2C_M_RD; 	/*写标记*/msg[0].len = count;			/*buf大小*/msg[0].buf = &data; 		/*一般有两个或多个字节组成,第一个是写的地址,后面是写的数据*/
      • 利用i2c_transfer需填充两个i2c_msg:

        msg[0].addr = chip_addr;	/*器件地址*/msg[0].flags = !I2C_M_RD; 	/*写标记*/msg[0].len = count;			/*buf大小*/msg[0].buf = &addr;			/*器件单元地址*/msg[1].addr = chip_addr; 	/*器件地址*/msg[1].flags = I2C_M_RD; 	/*读标记*/msg[1].len = count;			/*buf大小*/msg[1].buf = &buf;			/*读取到的数据*/
      • int i2c_master_send(struct i2c_client *client, const char *buf, int count);
      • int i2c_master_recv(struct i2c_client *client, char *buf, int count);
      • s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
      • s32 i2c_sm

标签: 压阻式加速度传感器优缺点

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台