EintObj.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import re
  4. import os
  5. import string
  6. import ConfigParser
  7. import xml.dom.minidom
  8. from data.EintData import EintData
  9. from data.GpioData import GpioData
  10. from utility.util import log
  11. from utility.util import LogLevel
  12. from utility.util import compare
  13. from obj.ModuleObj import ModuleObj
  14. from obj.GpioObj import GpioObj
  15. class EintObj(ModuleObj):
  16. def __init__(self, gpio_obj):
  17. ModuleObj.__init__(self, 'cust_eint.h', 'cust_eint.dtsi')
  18. self.__gpio_obj = gpio_obj
  19. self.__count = 0
  20. self.__map_count = 0
  21. def set_gpioObj(self, gpio_obj):
  22. self.__gpio_obj = gpio_obj
  23. def read(self, node):
  24. nodes = node.childNodes
  25. for node in nodes:
  26. if node.nodeType == xml.dom.Node.ELEMENT_NODE:
  27. if cmp(node.nodeName, 'count') == 0:
  28. self.__count = node.childNodes[0].nodeValue
  29. continue
  30. varNode = node.getElementsByTagName('varName')
  31. detNode = node.getElementsByTagName('debounce_time')
  32. polNode = node.getElementsByTagName('polarity')
  33. senNode = node.getElementsByTagName('sensitive_level')
  34. deeNode = node.getElementsByTagName('debounce_en')
  35. data = EintData()
  36. if len(varNode):
  37. data.set_varName(varNode[0].childNodes[0].nodeValue)
  38. if len(detNode):
  39. data.set_debounceTime(detNode[0].childNodes[0].nodeValue)
  40. if len(polNode):
  41. data.set_polarity(polNode[0].childNodes[0].nodeValue)
  42. if len(senNode):
  43. data.set_sensitiveLevel(senNode[0].childNodes[0].nodeValue)
  44. if len(deeNode):
  45. data.set_debounceEnable(deeNode[0].childNodes[0].nodeValue)
  46. ModuleObj.set_data(self, node.nodeName, data)
  47. return True
  48. def parse(self, node):
  49. self.get_cfgInfo()
  50. self.read(node)
  51. def gen_files(self):
  52. ModuleObj.gen_files(self)
  53. def gen_spec(self, para):
  54. ModuleObj.gen_spec(self, para)
  55. def get_cfgInfo(self):
  56. cp = ConfigParser.ConfigParser(allow_no_value=True)
  57. cp.read(ModuleObj.get_figPath())
  58. ops = cp.options('GPIO')
  59. map = {}
  60. mode_map = {}
  61. for op in ops:
  62. value = cp.get('GPIO', op)
  63. list = re.split(r' +|\t+', value)
  64. map[string.atoi(re.findall(r'\d+', op)[0])] = string.atoi(list[len(list)-2])
  65. mode_map[op] = list[0:len(list)-2]
  66. EintData.set_mapTable(map)
  67. EintData.set_modeMap(mode_map)
  68. if cp.has_option('EINT', 'EINT_MAP_COUNT'):
  69. self.__map_count = string.atoi(cp.get('EINT', 'EINT_MAP_COUNT'))
  70. if cp.has_option('EINT', 'INTERNAL_EINT'):
  71. info = cp.get('EINT', 'INTERNAL_EINT')
  72. str_list = info.split(':')
  73. for item in str_list:
  74. sub_list = item.split('/')
  75. EintData._int_eint[sub_list[0]] = sub_list[1]
  76. if cp.has_option('EINT', 'BUILTIN_EINT'):
  77. info = cp.get('EINT', 'BUILTIN_EINT')
  78. str_list = info.split(':')
  79. for builtin_item in str_list:
  80. builtin_list = builtin_item.split('/')
  81. #EintData._builtin_map[builtin_list[0]] = builtin_list[1]
  82. temp = 'BUILTIN_%s' %(builtin_list[0])
  83. if cp.has_option('EINT', temp):
  84. info = cp.get('EINT', temp)
  85. str_list = info.split(':')
  86. temp_map = {}
  87. for item in str_list:
  88. sub_list = item.split('/')
  89. temp_map[sub_list[0]] = sub_list[1] + ':' + builtin_list[1]
  90. EintData._builtin_map[builtin_list[0]] = temp_map
  91. EintData._builtin_eint_count += len(temp_map)
  92. self.__gpio_obj.set_eint_map_table(EintData._map_table)
  93. #def compare(self, value):
  94. #return string.atoi(value[4:])
  95. def fill_hFile(self):
  96. gen_str = ''
  97. gen_str += '''#ifdef __cplusplus\n'''
  98. gen_str += '''extern \"C\" {\n'''
  99. gen_str += '''#endif\n'''
  100. gen_str += '''#define CUST_EINTF_TRIGGER_RISING\t\t\t1\n'''
  101. gen_str += '''#define CUST_EINTF_TRIGGER_FALLING\t\t\t2\n'''
  102. gen_str += '''#define CUST_EINTF_TRIGGER_HIGH\t\t\t4\n'''
  103. gen_str += '''#define CUST_EINTF_TRIGGER_LOW\t\t\t8\n'''
  104. gen_str += '''#define CUST_EINT_DEBOUNCE_DISABLE\t\t\t0\n'''
  105. gen_str += '''#define CUST_EINT_DEBOUNCE_ENABLE\t\t\t1\n'''
  106. gen_str += '''\n\n'''
  107. sorted_list = sorted(ModuleObj.get_data(self).keys(), key=compare)
  108. for key in sorted_list:
  109. value = ModuleObj.get_data(self)[key]
  110. gen_str += '''#define CUST_EINT_%s_NUM\t\t\t%s\n''' %(value.get_varName().upper(), key[4:])
  111. gen_str += '''#define CUST_EINT_%s_DEBOUNCE_CN\t\t%s\n''' %(value.get_varName().upper(), value.get_debounceTime())
  112. temp = ''
  113. polarity = value.get_polarity()
  114. sensitive = value.get_sensitiveLevel()
  115. if cmp(polarity, 'High') == 0 and cmp(sensitive, 'Edge') == 0:
  116. temp = 'CUST_EINTF_TRIGGER_RISING'
  117. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Edge') == 0:
  118. temp = 'CUST_EINTF_TRIGGER_FALLING'
  119. elif cmp(polarity, 'High') == 0 and cmp(sensitive, 'Level') == 0:
  120. temp = 'CUST_EINTF_TRIGGER_HIGH'
  121. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Level') == 0:
  122. temp = 'CUST_EINTF_TRIGGER_LOW'
  123. gen_str += '''#define CUST_EINT_%s_TYPE\t\t\t%s\n''' %(value.get_varName().upper(), temp)
  124. temp = ''
  125. if cmp(value.get_debounceEnable(), 'Disable') == 0:
  126. temp = 'CUST_EINT_DEBOUNCE_DISABLE'
  127. elif cmp(value.get_debounceEnable(), 'Enable') == 0:
  128. temp = 'CUST_EINT_DEBOUNCE_ENABLE'
  129. gen_str += '''#define CUST_EINT_%s_DEBOUNCE_EN\t\t%s\n\n''' %(value.get_varName().upper(), temp)
  130. gen_str += '''#ifdef __cplusplus\n'''
  131. gen_str += '''}\n'''
  132. gen_str += '''#endif\n'''
  133. return gen_str
  134. def fill_mappingTable(self):
  135. gen_str = '''&eintc {\n'''
  136. count = 0
  137. if self.__map_count == 0:
  138. for i in range(0, string.atoi(self.__count)):
  139. if EintData.get_gpioNum(i) >= 0:
  140. count += 1
  141. count += len(EintData._int_eint)
  142. else:
  143. count = self.__map_count
  144. gen_str += '''\tmediatek,mapping_table_entry = <%d>;\n''' %(count)
  145. gen_str += '''\t\t\t/* <gpio_pin, eint_pin> */\n'''
  146. gen_str += '''\tmediatek,mapping_table = '''
  147. sorted_list = sorted(EintData.get_mapTable().keys())
  148. for key in sorted_list:
  149. value = EintData.get_mapTable()[key]
  150. if value != -1:
  151. gen_str += '''<%d %d>,\n\t\t\t\t\t''' %(key, value)
  152. sorted_list = sorted(EintData.get_internalEint().keys())
  153. for key in sorted_list:
  154. value = EintData.get_internalEint()[key]
  155. gen_str += '''<%s %s>,\n\t\t\t\t\t''' %(value, key)
  156. #for (key, value) in EintData._int_eint.items():
  157. #gen_str += '''<%s %s>,\n\t\t\t\t\t''' %(value, key)
  158. gen_str = gen_str[0:len(gen_str)-7]
  159. gen_str += ''';\n'''
  160. gen_str += '''\tmediatek,builtin_entry = <%d>;\n''' %(EintData._builtin_eint_count)
  161. if len(EintData._builtin_map) == 0:
  162. gen_str += '''};\n\n'''
  163. return gen_str
  164. gen_str += '''\t\t\t\t\t/* gpio, built-in func mode, built-in eint */\n'''
  165. gen_str += '''\tmediatek,builtin_mapping = '''
  166. for (key, value) in EintData._builtin_map.items():
  167. for (sub_key, sub_value) in value.items():
  168. gen_str += '''<%s %s %s>, /* %s */\n\t\t\t\t\t''' %(sub_key, sub_value[0:1], key, sub_value)
  169. gen_str = gen_str[0:gen_str.rfind(',')]
  170. gen_str += ';'
  171. gen_str += '''};\n\n'''
  172. return gen_str
  173. def get_gpioNum(self, eint_num):
  174. for (key, value) in EintData.get_mapTable().items():
  175. if cmp(eint_num, value) == 0:
  176. return key
  177. return -1
  178. def refGpio(self, eint_num, flag):
  179. gpio_vec= []
  180. for key in EintData._builtin_map.keys():
  181. if string.atoi(eint_num) == string.atoi(key):
  182. temp_map = EintData._builtin_map[key]
  183. for key in temp_map.keys():
  184. gpio_vec.append(key)
  185. if flag:
  186. for item in temp_map.keys():
  187. item_data = self.__gpio_obj.get_gpioData(string.atoi(item))
  188. if item_data.get_defMode() == string.atoi(temp_map[item].split(':')[0]):
  189. gpio_vec = []
  190. gpio_vec.append(item)
  191. return gpio_vec
  192. break
  193. gpio_num = EintData.get_gpioNum(string.atoi(eint_num))
  194. if gpio_num >= 0:
  195. gpio_vec.append(gpio_num)
  196. if flag:
  197. item_data = self.__gpio_obj.get_gpioData(gpio_num)
  198. mode_idx = item_data.get_defMode()
  199. mode_name = EintData.get_modeName(gpio_num, mode_idx)
  200. if re.match(r'GPIO[\d]+', mode_name) or re.match(r'EINT[\d]+', mode_name):
  201. return gpio_vec
  202. return gpio_vec
  203. def fill_dtsiFile(self):
  204. gen_str = '''#include <dt-bindings/interrupt-controller/irq.h>\n'''
  205. gen_str += '''#include <dt-bindings/interrupt-controller/arm-gic.h>\n'''
  206. gen_str += '''\n'''
  207. gen_str += self.fill_mappingTable()
  208. sorted_list = sorted(ModuleObj.get_data(self).keys(), key=compare)
  209. for key in sorted_list:
  210. value = ModuleObj.get_data(self)[key]
  211. gen_str += '''&%s {\n''' %(value.get_varName().lower())
  212. gen_str += '''\tinterrupt-parent = <&eintc>;\n'''
  213. temp = ''
  214. polarity = value.get_polarity()
  215. sensitive = value.get_sensitiveLevel()
  216. if cmp(polarity, 'High') == 0 and cmp(sensitive, 'Edge') == 0:
  217. temp = 'IRQ_TYPE_EDGE_RISING'
  218. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Edge') == 0:
  219. temp = 'IRQ_TYPE_EDGE_FALLING'
  220. elif cmp(polarity, 'High') == 0 and cmp(sensitive, 'Level') == 0:
  221. temp = 'IRQ_TYPE_LEVEL_HIGH'
  222. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Level') == 0:
  223. temp = 'IRQ_TYPE_LEVEL_LOW'
  224. gen_str += '''\tinterrupts = <%s %s>;\n''' %(self.refGpio(key[4:], True)[0], temp)
  225. gen_str += '''\tdebounce = <%s %d>;\n''' %(self.refGpio(key[4:], True)[0], string.atoi(value.get_debounceTime()) * 1000)
  226. gen_str += '''\tstatus = \"okay\";\n'''
  227. gen_str += '''};\n'''
  228. gen_str += '''\n'''
  229. return gen_str
  230. def get_gpioObj(self):
  231. return self.__gpio_obj
  232. class EintObj_MT6750S(EintObj):
  233. def __init__(self, gpio_obj):
  234. EintObj.__init__(self, gpio_obj)
  235. def parse(self, node):
  236. EintObj.parse(self, node)
  237. def gen_files(self):
  238. EintObj.gen_files(self)
  239. def gen_spec(self, para):
  240. EintObj.gen_spec(self, para)
  241. def fill_mappingTable(self):
  242. return ''
  243. class EintObj_MT6739(EintObj):
  244. def __init__(self, gpio_obj):
  245. EintObj.__init__(self, gpio_obj)
  246. def fill_dtsiFile(self):
  247. gen_str = '''#include <dt-bindings/interrupt-controller/irq.h>\n'''
  248. gen_str += '''#include <dt-bindings/interrupt-controller/arm-gic.h>\n'''
  249. gen_str += '''\n'''
  250. gen_str += self.fill_mappingTable()
  251. sorted_list = sorted(ModuleObj.get_data(self).keys(), key=compare)
  252. for key in sorted_list:
  253. value = ModuleObj.get_data(self)[key]
  254. gen_str += '''&%s {\n''' % (value.get_varName().lower())
  255. gen_str += '''\tinterrupt-parent = <&pio>;\n'''
  256. temp = ''
  257. polarity = value.get_polarity()
  258. sensitive = value.get_sensitiveLevel()
  259. if cmp(polarity, 'High') == 0 and cmp(sensitive, 'Edge') == 0:
  260. temp = 'IRQ_TYPE_EDGE_RISING'
  261. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Edge') == 0:
  262. temp = 'IRQ_TYPE_EDGE_FALLING'
  263. elif cmp(polarity, 'High') == 0 and cmp(sensitive, 'Level') == 0:
  264. temp = 'IRQ_TYPE_LEVEL_HIGH'
  265. elif cmp(polarity, 'Low') == 0 and cmp(sensitive, 'Level') == 0:
  266. temp = 'IRQ_TYPE_LEVEL_LOW'
  267. gen_str += '''\tinterrupts = <%s %s %s %d>;\n''' % (key[4:], temp, self.refGpio(key[4:], True)[0], self.refGpio_defMode(key[4:], True))
  268. if cmp(value.get_debounceEnable(), 'Enable') == 0:
  269. gen_str += '''\tdeb-gpios = <&pio %s 0>;\n''' % (self.refGpio(key[4:], True)[0])
  270. gen_str += '''\tdebounce = <%d>;\n''' % (string.atoi(value.get_debounceTime()) * 1000)
  271. gen_str += '''\tstatus = \"okay\";\n'''
  272. gen_str += '''};\n'''
  273. gen_str += '''\n'''
  274. return gen_str
  275. def fill_mappingTable(self):
  276. return ''
  277. def refGpio_defMode(self, eint_num, flag):
  278. refGpio_defMode = 0
  279. for key in EintData._builtin_map.keys():
  280. if string.atoi(eint_num) == string.atoi(key):
  281. temp_map = EintData._builtin_map[key]
  282. if flag:
  283. for item in temp_map.keys():
  284. item_data = self.get_gpioObj().get_gpioData(string.atoi(item))
  285. if item_data.get_defMode() == string.atoi(temp_map[item].split(':')[0]):
  286. refGpio_defMode = item_data.get_defMode()
  287. return refGpio_defMode
  288. break
  289. gpio_num = EintData.get_gpioNum(string.atoi(eint_num))
  290. if gpio_num >= 0:
  291. if flag:
  292. item_data = self.get_gpioObj().get_gpioData(gpio_num)
  293. refGpio_defMode = item_data.get_defMode()
  294. mode_name = EintData.get_modeName(gpio_num, refGpio_defMode)
  295. if re.match(r'GPIO[\d]+', mode_name) or re.match(r'EINT[\d]+', mode_name):
  296. return refGpio_defMode
  297. return refGpio_defMode