I2cObj.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import re
  4. import string
  5. import xml.dom.minidom
  6. import ConfigParser
  7. from ModuleObj import ModuleObj
  8. #from utility import util
  9. from utility.util import sorted_key
  10. from data.I2cData import I2cData
  11. from data.I2cData import BusData
  12. import ChipObj
  13. class I2cObj(ModuleObj):
  14. _busList = []
  15. _bBusEnable = True
  16. def __init__(self):
  17. ModuleObj.__init__(self, 'cust_i2c.h', 'cust_i2c.dtsi')
  18. #self.__busList = []
  19. #self.__bBusEnable = True
  20. def get_cfgInfo(self):
  21. cp = ConfigParser.ConfigParser(allow_no_value=True)
  22. cp.read(ModuleObj.get_figPath())
  23. I2cData._i2c_count = string.atoi(cp.get('I2C', 'I2C_COUNT'))
  24. I2cData._channel_count = string.atoi(cp.get('I2C', 'CHANNEL_COUNT'))
  25. if cp.has_option('Chip Type', 'I2C_BUS'):
  26. flag = cp.get('Chip Type', 'I2C_BUS')
  27. if flag == '0':
  28. self._bBusEnable = False
  29. if cp.has_option('Chip Type', 'I2C_BUS'):
  30. flag = cp.get('Chip Type', 'I2C_BUS')
  31. if flag == '0':
  32. self._bBusEnable = False
  33. def read(self, node):
  34. nodes = node.childNodes
  35. for node in nodes:
  36. if node.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
  37. if cmp(node.nodeName, 'count') == 0:
  38. self.__count = node.childNodes[0].nodeValue
  39. continue
  40. if node.nodeName.find('bus') != -1:
  41. speedNode = node.getElementsByTagName('speed_kbps')
  42. enableNode = node.getElementsByTagName('pullPushEn')
  43. data = BusData()
  44. if len(speedNode):
  45. data.set_speed(speedNode[0].childNodes[0].nodeValue)
  46. if len(enableNode):
  47. data.set_enable(enableNode[0].childNodes[0].nodeValue)
  48. self._busList.append(data)
  49. #I2cData._busList.append(data)
  50. elif node.nodeName.find('device') != -1:
  51. nameNode = node.getElementsByTagName('varName')
  52. channelNode = node.getElementsByTagName('channel')
  53. addrNode = node.getElementsByTagName('address')
  54. data = I2cData()
  55. if len(nameNode):
  56. data.set_varName(nameNode[0].childNodes[0].nodeValue)
  57. if len(channelNode):
  58. data.set_channel(channelNode[0].childNodes[0].nodeValue)
  59. if len(addrNode):
  60. data.set_address(addrNode[0].childNodes[0].nodeValue)
  61. ModuleObj.set_data(self, node.nodeName, data)
  62. return True
  63. def parse(self, node):
  64. self.get_cfgInfo()
  65. self.read(node)
  66. def gen_files(self):
  67. ModuleObj.gen_files(self)
  68. def gen_spec(self, para):
  69. ModuleObj.gen_spec(self, para)
  70. def fill_hFile(self):
  71. gen_str = ''
  72. for i in range(0, I2cData._channel_count):
  73. gen_str += '''#define I2C_CHANNEL_%d\t\t\t%d\n''' %(i, i)
  74. gen_str += '''\n'''
  75. #sorted_lst = sorted(ModuleObj.get_data(self).keys(), key=compare)
  76. for key in sorted_key(ModuleObj.get_data(self).keys()):
  77. value = ModuleObj.get_data(self)[key]
  78. temp = ''
  79. if value.get_address().strip() == '':
  80. temp = 'TRUE'
  81. else:
  82. temp = 'FALSE'
  83. gen_str += '''#define I2C_%s_AUTO_DETECT\t\t\t%s\n''' %(value.get_varName(), temp)
  84. gen_str += '''#define I2C_%s_CHANNEL\t\t\t%s\n''' %(value.get_varName(), value.get_channel())
  85. gen_str += '''#define I2C_%s_SLAVE_7_BIT_ADDR\t\t%s\n''' %(value.get_varName(), value.get_address().upper())
  86. gen_str += '''\n'''
  87. return gen_str
  88. def fill_dtsiFile(self):
  89. gen_str = ''
  90. for i in range(0, I2cData._channel_count):
  91. if i >= len(self._busList):
  92. break;
  93. gen_str += '''&i2c%d {\n''' %(i)
  94. gen_str += '''\t#address-cells = <1>;\n'''
  95. gen_str += '''\t#size-cells = <0>;\n'''
  96. if self._bBusEnable:
  97. gen_str += '''\tclock-frequency = <%d>;\n''' %(string.atoi(self._busList[i].get_speed()) * 1000)
  98. temp_str = ''
  99. if cmp(self._busList[i].get_enable(), 'false') == 0:
  100. temp_str = 'use-open-drain'
  101. elif cmp(self._busList[i].get_enable(), 'true') == 0:
  102. temp_str = 'use-push-pull'
  103. gen_str += '''\tmediatek,%s;\n''' %(temp_str)
  104. for key in sorted_key(ModuleObj.get_data(self).keys()):
  105. value = ModuleObj.get_data(self)[key]
  106. channel = 'I2C_CHANNEL_%d' %(i)
  107. if cmp(value.get_channel(), channel) == 0 and cmp(value.get_varName(), 'NC') != 0 and value.get_address().strip() != '':
  108. gen_str += '''\t%s@%s {\n''' %(value.get_varName().lower(), value.get_address()[2:].lower())
  109. gen_str += '''\t\tcompatible = \"mediatek,%s\";\n''' %(value.get_varName().lower())
  110. gen_str += '''\t\treg = <%s>;\n''' %(value.get_address().lower())
  111. gen_str += '''\t\tstatus = \"okay\";\n'''
  112. gen_str += '''\t};\n\n'''
  113. gen_str += '''};\n\n'''
  114. return gen_str
  115. class I2cObj_MT6759(I2cObj):
  116. def __init__(self):
  117. I2cObj.__init__(self)
  118. def parse(self, node):
  119. I2cObj.parse(self, node)
  120. def gen_files(self):
  121. I2cObj.gen_files(self)
  122. def gen_spec(self, para):
  123. I2cObj.gen_spec(self, para)
  124. def fill_dtsiFile(self):
  125. gen_str = ''
  126. for i in range(0, I2cData._channel_count):
  127. if i >= len(self._busList):
  128. break;
  129. gen_str += '''&i2c%d {\n''' %(i)
  130. gen_str += '''\t#address-cells = <1>;\n'''
  131. gen_str += '''\t#size-cells = <0>;\n'''
  132. if self._bBusEnable:
  133. gen_str += '''\tclock-frequency = <%d>;\n''' %(string.atoi(self._busList[i].get_speed()) * 1000)
  134. temp_str = ''
  135. if cmp(self._busList[i].get_enable(), 'false') == 0:
  136. temp_str = 'use-open-drain'
  137. elif cmp(self._busList[i].get_enable(), 'true') == 0:
  138. temp_str = 'use-push-pull'
  139. gen_str += '''\tmediatek,%s;\n''' %(temp_str)
  140. for key in sorted_key(ModuleObj.get_data(self).keys()):
  141. value = ModuleObj.get_data(self)[key]
  142. channel = 'I2C_CHANNEL_%d' %(i)
  143. if cmp(value.get_channel(), channel) == 0 and cmp(value.get_varName(), 'NC') != 0 and value.get_address().strip() != '':
  144. gen_str += '''\t%s_mtk:%s@%s {\n''' %(value.get_varName().lower(), value.get_varName().lower(), value.get_address()[2:].lower())
  145. gen_str += '''\t\tcompatible = \"mediatek,%s\";\n''' %(value.get_varName().lower())
  146. gen_str += '''\t\treg = <%s>;\n''' %(value.get_address().lower())
  147. gen_str += '''\t\tstatus = \"okay\";\n'''
  148. gen_str += '''\t};\n\n'''
  149. gen_str += '''};\n\n'''
  150. return gen_str
  151. class I2cObj_MT6775(I2cObj):
  152. def __init__(self):
  153. I2cObj.__init__(self)
  154. def fill_dtsiFile(self):
  155. gen_str = ''
  156. for i in range(0, I2cData._channel_count):
  157. if i >= len(self._busList):
  158. break;
  159. gen_str += '''&i2c%d {\n''' %(i)
  160. gen_str += '''\t#address-cells = <1>;\n'''
  161. gen_str += '''\t#size-cells = <0>;\n'''
  162. if self._bBusEnable:
  163. gen_str += '''\tclock-frequency = <%d>;\n''' %(string.atoi(self._busList[i].get_speed()) * 1000)
  164. temp_str = ''
  165. if cmp(self._busList[i].get_enable(), 'false') == 0:
  166. temp_str = 'use-open-drain'
  167. elif cmp(self._busList[i].get_enable(), 'true') == 0:
  168. temp_str = 'use-push-pull'
  169. gen_str += '''\tmediatek,%s;\n''' %(temp_str)
  170. for key in sorted_key(ModuleObj.get_data(self).keys()):
  171. value = ModuleObj.get_data(self)[key]
  172. channel = 'I2C_CHANNEL_%d' %(i)
  173. if cmp(value.get_channel(), channel) == 0 and cmp(value.get_varName(), 'NC') != 0 and value.get_address().strip() != '':
  174. gen_str += '''\t%s_mtk:%s@%s {\n''' %(value.get_varName().lower(), value.get_varName().lower(), value.get_address()[2:].lower())
  175. if re.match(r'^RT[\d]+$', value.get_varName()):
  176. gen_str += '''\t\tcompatible = \"richtek,%s\";\n''' %(value.get_varName().lower())
  177. else:
  178. gen_str += '''\t\tcompatible = \"mediatek,%s\";\n''' %(value.get_varName().lower())
  179. gen_str += '''\t\treg = <%s>;\n''' %(value.get_address().lower())
  180. gen_str += '''\t\tstatus = \"okay\";\n'''
  181. gen_str += '''\t};\n\n'''
  182. gen_str += '''};\n\n'''
  183. return gen_str