1 前言

  linux下开发i2c设备驱动,一般分为两个阶段,第一阶段是驱动实现,第二阶段是调试。驱动实现即是对i2c设备的正确访问,包括读、写、控制。而第二阶段,一般用于需要调整参数的i2c设备,如增益、亮度、灰度、补偿系数等;因为该类参数需与具体使用场合关联,需实时调整该类参数以满足最佳的状态何效果。对于这种场景,如果通过频繁修改驱动源码来调整参数,很显然不是理想的方式,工作繁琐且效率低下。此时,一般借助第三方i2c工具,通过命令终端调整参数,直至确认一个合适的范围或数值后再修改驱动源码的参数。第三方i2c 工具常用的就是i2ctools,功能强大、移植方便、使用简易,关于i2ctools使用,参考该文章

  海思(Hisilicon)SDK提供了一个i2c的读写工具,可以方便地通过命令终端读写i2c设备寄存器。该i2c工具虽然功能上不及i2ctools,但对于实时访问i2c设备寄存器足以胜任了。


2 海思i2c工具使用

  海思i2c 工具只提供两个命令,分别是读取数据i2c_read和写数据i2c_write


2.1 i2c_read

命令格式:

i2c_read <i2c_num> <device_addr> <reg_addr> <end_reg_addr>  
                   <reg_width> <data_width> <reg_step>  
  • i2c_num,i2c序号,只需填数字,如0、1、2
  • device_addr,设备地址
  • red_addr,待读设备起始寄存器地址
  • end_reg_addr,待读设备寄存器结束地址
  • reg_width,设备寄存器位宽,Byte(1)/Word(2)
  • data_width,设备数据位宽,Byte(1)/Word(2)
  • reg_step,连读标识,1表示连读,0表示非连读,默认为连读模式

2.1.1 实例

读单个寄存器

  • i2c总线序号:i2c-0
  • 设备地址:0x60
  • 起始寄存器:0x0
  • 结束寄存器:0x0
  • 寄存器位宽:1Byte
  • 数据位宽:1Byte
  • 连读标识:非连读
# i2c_read 0 0x60 0x0 0x0 0x1 0x1 0x0
*** Board tools : ver0.0.1_20121120 *** 
[debug]: {source/utils/cmdshell.c:167}cmdstr:i2c_read
i2c_num:0x0, dev_addr:0x61; reg_addr:0x 0; reg_addr_end:0x 0; reg_width: 1; data_width: 1; reg_step:0x 1. 

0x0 0xff
[END]

连读

  • i2c总线序号:i2c-0
  • 设备地址:0x60
  • 起始寄存器:0x0
  • 结束寄存器:0x5
  • 寄存器位宽:1Byte
  • 数据位宽:1Byte
  • 连读标识:连读
# i2c_read 0 0x60 0x0 0x5 0x1 0x1
*** Board tools : ver0.0.1_20121120 *** 
[debug]: {source/utils/cmdshell.c:167}cmdstr:i2c_read
i2c_num:0x0, dev_addr:0x61; reg_addr:0x 0; reg_addr_end:0x 5; reg_width: 1; data_width: 1; reg_step:0x 1. 

0x0 0xff
0x1 0x8
0x2 0x8
0x3 0x8
0x4 0x8
0x5 0x1f
[END]

传入错误设备地址

# i2c_read 0 0x10 0x0 0x0 0x1 0x1
*** Board tools : ver0.0.1_20121120 *** hi_i2c_wait_rxfifo_notempty->314: 
[debug]: {source/utils/cmdshell.c:167}
cmdstr:i2c_read
i2c_num:0x0, dev_addr:0abort! int_raw_status: 0x750!
x10; reg_addr:0x 0; reg_addr_end:0x 0; r
eg_width: 1; data_width: 1; reg_step:0x hi_i2c_abortprocess->86: 1. 

tx_abrt_src is 1.

CMD_I2C_READ error!

do errro
[END]

2.2 i2c_write

命令格式:

i2c_write <i2c_num> <device_addr> <reg_addr> <value> 
				     <reg_width> <data_width>
  • i2c_num,i2c序号,只需填数字,如0、1、2
  • device_addr,设备地址
  • red_addr,待写设备寄存器地址
  • value,待写数据值
  • reg_width,设备寄存器位宽,Byte(1)/Word(2)
  • data_width,设备数据位宽,Byte(1)/Word(2)

2.2.1 实例

  • i2c总线序号:i2c-0
  • 设备地址:0x60
  • 待写寄存器:0x0
  • 待写数据值:0x55
  • 寄存器位宽:1Byte
  • 数据位宽:1Byte
# i2c_write 0 0x61 0x0 0x55 0x1 x1
*** Board tools : ver0.0.1_20121120 *** 
[debug]: {source/utils/cmdshell.c:167}cmdstr:i2c_write
dev_addr:0x61; reg_addr:0x 0; reg_value:0x55; reg_width: 1; data_width: 1.
[END]

# i2c_read 0 0x60 0x0 0x0 0x1 0x1
*** Board tools : ver0.0.1_20121120 *** 
[debug]: {source/utils/cmdshell.c:167}cmdstr:i2c_read
i2c_num:0x0, dev_addr:0x60; reg_addr:0x 0; reg_addr_end:0x 0; reg_width: 1; data_width: 1; reg_step:0x 1. 

0x0 0x55
[END]
Logo

更多推荐