【Android源码 栏目提醒】:以下是网学会员为您推荐的Android源码 -在Android源码树中添加userspace I2C读写工具(i2c-util) - 软件工程,希望本篇文章对您学习有所帮助。
在
Android源码树中添加userspace I2C读写工具i2c-util 通过/dev/i2c-n节点用户可以在userspace直接访问板上的i2c外设寄存器主要是透过I2C_RDWR这个IO控制命令将i2c_msg数组传递给kernel去执行。
下面的代码可以完成这个功能 cpp view plaincopy 1. include 2. include 3. include 4. include 5. include 6. include 7. include 8. include 9. include 10. include 11. include 12. 13. / This is the structure as used in the I2C_RDWR ioctl call / 14. struct i2c_rdwr_ioctl_data 15. struct i2c_msg __user msgs / pointers to i2c_msgs / 16. __u32 nmsgs / number of i2c_msgs / 17. 18. 19. int i2c_read_regchar dev unsigned char buf unsigned slave_address unsigned reg_address int len 20. 21. struct i2c_rdwr_ioctl_data work_queue 22. unsigned char w_val reg_address 23. int ret 24. 25. int fd opendev O_RDWR 26. if fd 27. printfError on opening the device filen 28. return 0 29. 30. 31. work_queue.nmsgs 2 32. work_queue.msgs struct i2c_msgmallocwork_queue.nmsgs sizeofstruct 33. i2c_msg 34. if work_queue.msgs 35. printfMemory alloc errorn 36. closefd 37. return 0 38. 39. 40. ioctlfd I2C_TIMEOUT 2 41. ioctlfd I2C_RETRIES 1 42. 43. work_queue.msgs0.len 1 44. work_queue.msgs0.addr slave_address 45. work_queue.msgs0.buf w_val 46. 47. work_queue.msgs1.len len 48. work_queue.msgs1.flags I2C_M_RD 49. work_queue.msgs1.addr slave_address 50. work_queue.msgs1.buf buf 51. 52. ret ioctlfd I2C_RDWR unsigned long work_queue 53. if ret 0 54. printfError during I2C_RDWR ioctl with error code: dn ret 55. closefd 56. freework_queue.msgs 57. return 0 58. else 59. printfread salve:02x reg:02xn slave_address reg_address 60. closefd 61. freework_queue.msgs 62. return len 63. 64. 65. 66. int i2c_write_regchar dev unsigned char buf unsigned slave_address unsigned reg_address int len 67. 68. struct i2c_rdwr_ioctl_data work_queue 69. unsigned char w_val reg_address 70. unsigned char w_buflen1 71. int ret 72. 73. w_buf0 reg_address 74. 75. int fd opendev O_RDWR 76. if fd 77. printfError on opening the device filen 78. return 0 79. 80. 81. work_queue.nmsgs 1 82. work_queue.msgs struct i2c_msgmallocwork_queue.nmsgs sizeofstruct 83. i2c_msg 84. if work_queue.msgs 85. printfMemory alloc errorn 86. closefd 87. return 0 88. 89. 90. ioctlfd I2C_TIMEOUT 2 91. ioctlfd I2C_RETRIES 1 92. 93. work_queue.msgs0.len 1 len 94. work_queue.msgs0.addr slave_address 95. work_queue.msgs0.buf w_buf 96. 97. memcpyw_buf 1 buf len 98. 99. ret ioctlfd I2C_RDWR unsigned long work_queue 100. if ret 0 101. printfError during I2C_RDWR ioctl with error code: dn ret 102. closefd 103. freework_queue.msgs 104. return 0 105. else 106. printfwrite salve:02x reg:02xn slave_address reg_address 107. closefd 108. freework_queue.msgs 109. return len 110. 111. 112. 113. int mainint argc char argv 114. 115. unsigned int fd 116. unsigned int slave_address reg_address 117. unsigned r_w 118. unsigned w_val 119. unsigned char rw_val 120. 121. if argc 5 122. printfUsage:ns /dev/i2c-x start_addr reg_addr rw01 write_valn argv0 123. return 0 124. 125. 126. fd openargv1 O_RDWR 127. 128. if fd 129. printfError on opening the device file sn argv1 130. return 0 131. 132. 133. sscanfargv2 x slave_address 134. sscanfargv3 x ??_address 135. sscanfargv4 d r_w 136. 137. if r_w 0 138. i2c_read_regargv1 rw_val slave_address reg_address 1 139. printfRead s-x reg x read value:xn argv1 slave_address reg_address rw_val 140. else 141. if argc 6 142. printfUsage:ns /dev/i2c-x start_addr reg_addr rw01 write_valn argv0 143. return 0 144. 145. sscanfargv5 d w_val 146. if w_val 0xff 0 147. printfError on written value sn argv5 148. 149. rw_val unsigned charw_val 150. i2c_write_regargv1 rw_val slave_address reg_address 1 151. 152. 153. return 0 154. 在android/external/新建i2c-util目录上述源代码存入android/external/i2c-util/i2c-util.c编写对应的Android.mk: plain view plaincopy 1. LOCAL_PATH : call my-dir 2. include CLEAR_VARS 3. 4. LOCAL_MODULE_TAGS : optional 5. 6. LOCAL_MODULE : i2c-util 7. 8. LOCAL_SRC_FILES 9. i2c-util.c 10. 11. include BUILD_EXECUTABLE 编译Android后上述工具会位于/system/bin目录。
在电路板上使用它 plain view plaincopy 1. / i2c-rw /dev/i2c-2 0x38 0x1 0 2. read salve:38 reg:01 value:12 3. / 4. / i2c-rw /dev/i2c-2 0x38 0x2 0 5. read salve:38 reg:02 value:81