GpioObj.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import re
  4. import os
  5. import sys
  6. import string
  7. import ConfigParser
  8. import xml.dom.minidom
  9. from data.GpioData import GpioData
  10. from data.EintData import EintData
  11. from ModuleObj import ModuleObj
  12. import ChipObj
  13. from utility.util import compare
  14. from utility.util import sorted_key
  15. from utility.util import log
  16. from utility.util import LogLevel
  17. class GpioObj(ModuleObj):
  18. def __init__(self):
  19. ModuleObj.__init__(self,'cust_gpio_boot.h', 'cust_gpio.dtsi')
  20. self.__fileName = 'cust_gpio_usage.h'
  21. self.__filePinfunc = '%s-pinfunc.h' %(ModuleObj.get_chipId().lower())
  22. self.__filePinCtrl = 'pinctrl-mtk-%s.h' %(ModuleObj.get_chipId().lower())
  23. self.__fileScp = 'cust_scp_gpio_usage.h'
  24. self.__fileMap = 'cust_gpio_usage_mapping.dtsi'
  25. self.__drvCur = False
  26. self.__gpio_column_enable = True
  27. def get_cfgInfo(self):
  28. cp = ConfigParser.ConfigParser(allow_no_value=True)
  29. cp.read(ModuleObj.get_cmpPath())
  30. # get GPIO_FREQ section
  31. keys= cp.options('GPIO_FREQ')
  32. for key in keys:
  33. value = cp.get('GPIO_FREQ', key)
  34. GpioData._freqMap[key] = value
  35. # get GPIO_MODE section
  36. keys = cp.options('GPIO_MODE')
  37. for key in keys:
  38. value = cp.get('GPIO_MODE', key)
  39. GpioData._specMap[key] = value
  40. GpioData._mapList = cp.options('GPIO_VARIABLES_MAPPING')
  41. cp.read(ModuleObj.get_figPath())
  42. ops = cp.options('GPIO')
  43. for op in ops:
  44. value = cp.get('GPIO', op)
  45. list = re.split(r' +|\t+', value)
  46. tmp_list = list[0:len(list)-2]
  47. temp = []
  48. for item in tmp_list:
  49. str = item[6:len(item)-1]
  50. temp.append(str)
  51. GpioData._modeMap[op] = temp
  52. data = GpioData()
  53. data.set_smtNum(string.atoi(list[len(list)-1]))
  54. ModuleObj.set_data(self, op.lower(), data)
  55. if cp.has_option('Chip Type', 'GPIO_COLUMN_ENABLE'):
  56. flag = cp.get('Chip Type', 'GPIO_COLUMN_ENABLE')
  57. if flag == '0':
  58. self.__gpio_column_enable = False
  59. def read(self, node):
  60. nodes = node.childNodes
  61. for node in nodes:
  62. if node.nodeType == xml.dom.Node.ELEMENT_NODE:
  63. if cmp(node.nodeName, 'count') == 0:
  64. GpioData._count = string.atoi(node.childNodes[0].nodeValue)
  65. continue
  66. eintNode = node.getElementsByTagName('eint_mode')
  67. defmNode = node.getElementsByTagName('def_mode')
  68. modsNode = node.getElementsByTagName('mode_arr')
  69. inpeNode = node.getElementsByTagName('inpull_en')
  70. inpsNode = node.getElementsByTagName('inpull_selhigh')
  71. defdNode = node.getElementsByTagName('def_dir')
  72. diriNode = node.getElementsByTagName('in')
  73. diroNode = node.getElementsByTagName('out')
  74. outhNode = node.getElementsByTagName('out_high')
  75. var0Node = node.getElementsByTagName('varName0')
  76. var1Node = node.getElementsByTagName('varName1')
  77. var2Node = node.getElementsByTagName('varName2')
  78. smtNode = node.getElementsByTagName('smt')
  79. iesNode = node.getElementsByTagName('ies')
  80. drvCurNode = node.getElementsByTagName('drv_cur')
  81. num = string.atoi(node.nodeName[4:])
  82. if num >= len(ModuleObj.get_data(self)):
  83. break
  84. data = ModuleObj.get_data(self)[node.nodeName]
  85. if len(eintNode):
  86. flag = False
  87. if cmp(eintNode[0].childNodes[0].nodeValue, 'true') == 0:
  88. flag = True
  89. data.set_eintMode(flag)
  90. if len(defmNode):
  91. data.set_defMode(string.atoi(defmNode[0].childNodes[0].nodeValue))
  92. if len(modsNode) != 0 and len(modsNode[0].childNodes) != 0:
  93. str = modsNode[0].childNodes[0].nodeValue
  94. temp_list = []
  95. for i in range(0, len(str)):
  96. temp_list.append(str[i])
  97. data.set_modeVec(temp_list)
  98. if len(inpeNode):
  99. flag = False
  100. if cmp(inpeNode[0].childNodes[0].nodeValue, 'true') == 0:
  101. flag = True
  102. data.set_inpullEn(flag)
  103. if len(inpsNode):
  104. flag = False
  105. if cmp(inpsNode[0].childNodes[0].nodeValue, 'true') == 0:
  106. flag = True
  107. data.set_inpullSelHigh(flag)
  108. if len(defdNode):
  109. data.set_defDir(defdNode[0].childNodes[0].nodeValue)
  110. if len(diriNode) != 0 and len(diriNode[0].childNodes) != 0:
  111. flag = False
  112. if cmp(diriNode[0].childNodes[0].nodeValue, 'true') == 0:
  113. flag = True
  114. data.set_inEn(flag)
  115. if len(diroNode) != 0 and len(diroNode[0].childNodes) != 0:
  116. flag = False
  117. if cmp(diroNode[0].childNodes[0].nodeValue, 'true') == 0:
  118. flag = True
  119. data.set_outEn(flag)
  120. if len(outhNode):
  121. flag = False
  122. if cmp(outhNode[0].childNodes[0].nodeValue, 'true') == 0:
  123. flag = True
  124. data.set_outHigh(flag)
  125. temp_list= []
  126. if len(var0Node) != 0 and len(var0Node[0].childNodes) != 0:
  127. temp_list.append(var0Node[0].childNodes[0].nodeValue)
  128. if len(var1Node) != 0 and len(var1Node[0].childNodes) != 0:
  129. temp_list.append(var1Node[0].childNodes[0].nodeValue)
  130. if len(var2Node) != 0 and len(var2Node[0].childNodes) != 0:
  131. temp_list.append(var2Node[0].childNodes[0].nodeValue)
  132. data.set_varNames(temp_list)
  133. if len(smtNode):
  134. flag = False
  135. if cmp(smtNode[0].childNodes[0].nodeValue, 'true') == 0:
  136. flag = True
  137. data.set_smtEn(flag)
  138. if len(iesNode):
  139. flag = False
  140. if cmp(iesNode[0].childNodes[0].nodeValue, 'true') == 0:
  141. flag = True
  142. data.set_iesEn(flag)
  143. if len(drvCurNode) != 0 and len(drvCurNode[0].childNodes) != 0:
  144. self.__drvCur = True
  145. data.set_drvCur(drvCurNode[0].childNodes[0].nodeValue)
  146. ModuleObj.set_data(self, node.nodeName, data)
  147. return True
  148. def get_gpioData(self, idx):
  149. if idx >= GpioData._count or idx < 0:
  150. return None
  151. key = 'gpio%s' %(idx)
  152. return ModuleObj.get_data(self)[key]
  153. def parse(self, node):
  154. self.get_cfgInfo()
  155. self.read(node)
  156. def isMuxMode(self, key, index, modIdx):
  157. mode_name = GpioData.get_modeName(key, index)
  158. modIdx.append(index)
  159. if mode_name.find('//') != -1:
  160. return True
  161. return False
  162. def gen_files(self):
  163. ModuleObj.gen_files(self)
  164. self.gen_cFile()
  165. self.gen_specFiles()
  166. def gen_spec(self, para):
  167. if para == 'gpio_usage_h':
  168. self.gen_cFile()
  169. elif para == 'gpio_boot_h':
  170. self.gen_hFile()
  171. elif para == 'gpio_dtsi':
  172. self.gen_dtsiFile()
  173. elif para == 'scp_gpio_usage_h':
  174. self.gen_scpUsage()
  175. elif para == 'pinctrl_h':
  176. self.gen_pinCtrl()
  177. elif para == 'pinfunc_h':
  178. self.gen_pinFunc()
  179. elif para == 'gpio_usage_mapping_dtsi':
  180. self.gen_mapDtsi()
  181. def gen_cFile(self):
  182. gen_str = ''
  183. fp = open(os.path.join(ModuleObj.get_genPath(), self.__fileName), 'w')
  184. gen_str += ModuleObj.writeComment()
  185. gen_str += ModuleObj.writeHeader(self.__fileName)
  186. gen_str += self.fill_cFile()
  187. gen_str += ModuleObj.writeTail(self.__fileName)
  188. fp.write(gen_str)
  189. fp.close()
  190. def gen_specFiles(self):
  191. self.gen_pinFunc()
  192. self.gen_pinCtrl()
  193. self.gen_scpUsage()
  194. self.gen_mapDtsi()
  195. def gen_pinFunc(self):
  196. gen_str = ''
  197. fp = open(os.path.join(ModuleObj.get_genPath(), self.__filePinfunc), 'w')
  198. gen_str += ModuleObj.writeComment()
  199. gen_str += ModuleObj.writeHeader(self.__filePinfunc)
  200. gen_str += self.fill_pinfunc_hFile()
  201. gen_str += ModuleObj.writeTail(self.__filePinfunc)
  202. fp.write(gen_str)
  203. fp.close()
  204. def gen_pinCtrl(self):
  205. gen_str = ''
  206. fp = open(os.path.join(ModuleObj.get_genPath(), self.__filePinCtrl), 'w')
  207. gen_str += ModuleObj.writeComment()
  208. gen_str += ModuleObj.writeHeader(self.__filePinCtrl)
  209. gen_str += self.fill_pinctrl_hFile()
  210. gen_str += ModuleObj.writeTail(self.__filePinCtrl)
  211. fp.write(gen_str)
  212. fp.close()
  213. def gen_scpUsage(self):
  214. gen_str = ''
  215. fp = open(os.path.join(ModuleObj.get_genPath(), self.__fileScp), 'w')
  216. gen_str += ModuleObj.writeComment()
  217. gen_str += ModuleObj.writeHeader(self.__fileScp)
  218. gen_str += self.fill_cFile()
  219. gen_str += ModuleObj.writeTail(self.__fileScp)
  220. fp.write(gen_str)
  221. fp.close()
  222. def gen_mapDtsi(self):
  223. gen_str = ''
  224. fp = open(os.path.join(ModuleObj.get_genPath(), self.__fileMap), 'w')
  225. gen_str += ModuleObj.writeComment()
  226. gen_str += self.fill_mapping_dtsiFile()
  227. fp.write(gen_str)
  228. fp.close()
  229. def fill_hFile(self):
  230. gen_str = '''//Configuration for GPIO SMT(Schmidt Trigger) Group output start\n'''
  231. temp_list = []
  232. for key in sorted_key(ModuleObj.get_data(self).keys()):
  233. #for value in ModuleObj.get_data(self).values():
  234. value = ModuleObj.get_data(self)[key]
  235. num = value.get_smtNum()
  236. if num in temp_list or num < 0:
  237. continue
  238. else:
  239. temp_list.append(num)
  240. if value.get_smtEn():
  241. gen_str += '''#define GPIO_SMT_GROUP_%d\t\t1\n''' %(num)
  242. else:
  243. gen_str += '''#define GPIO_SMT_GROUP_%d\t\t0\n''' %(num)
  244. gen_str += '''\n\n'''
  245. sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  246. for key in sorted_list:
  247. value = ModuleObj.get_data(self)[key]
  248. if self.is_i2cPadPin(value.get_modeName(key, value.get_defMode())):
  249. value.set_inpullEn(False)
  250. value.set_outHigh(False)
  251. value.set_inpullSelHigh(False)
  252. gen_str += '''//Configuration for %s\n''' %(key.upper())
  253. mode_name = GpioData.get_modeName(key, value.get_defMode())
  254. val = ''
  255. if mode_name != '':
  256. if self.__gpio_column_enable:
  257. flag = False
  258. if mode_name.find('//') != -1:
  259. flag = True
  260. if flag:
  261. if value.get_modeVec()[value.get_defMode()] == '1':
  262. val = str(value.get_defMode())
  263. elif value.get_modeVec()[value.get_defMode()] == '2':
  264. val = str(value.get_defMode() + GpioData._modNum)
  265. else:
  266. val = str(value.get_defMode())
  267. else:
  268. val = str(value.get_defMode())
  269. if len(val) < 2:
  270. val = '0' + val
  271. pull_en = ''
  272. if value.get_inPullEn():
  273. pull_en = 'ENABLE'
  274. else:
  275. pull_en = 'DISABLE'
  276. pull_sel = ''
  277. if value.get_inPullSelHigh():
  278. pull_sel = 'UP'
  279. else:
  280. pull_sel = 'DOWN'
  281. out_high = ''
  282. if value.get_outHigh():
  283. out_high = 'ONE'
  284. else:
  285. out_high = 'ZERO'
  286. smt_en = ''
  287. if value.get_smtEn():
  288. smt_en = 'ENABLE'
  289. else:
  290. smt_en= 'DISABLE'
  291. ies_en = ''
  292. if value.get_iesEn():
  293. ies_en = 'ENABLE'
  294. else:
  295. ies_en = 'DISABLE'
  296. gen_str += '''#define %s_MODE\t\t\tGPIO_MODE_%s\n''' %(key.upper(), val)
  297. gen_str += '''#define %s_DIR\t\t\tGPIO_DIR_%s\n''' %(key.upper(), value.get_defDir())
  298. gen_str += '''#define %s_PULLEN\t\tGPIO_PULL_%s\n''' %(key.upper(), pull_en)
  299. gen_str += '''#define %s_PULL\t\t\tGPIO_PULL_%s\n''' %(key.upper(), pull_sel)
  300. gen_str += '''#define %s_DATAOUT\t\tGPIO_OUT_%s\n''' %(key.upper(), out_high)
  301. gen_str += '''#define %s_SMT\t\t\tGPIO_SMT_%s\n''' %(key.upper(), smt_en)
  302. gen_str += '''#define %s_IES\t\t\tGPIO_IES_%s\n''' %(key.upper(), ies_en)
  303. if self.__drvCur:
  304. drv_cur = 'DRV_UNSUPPORTED'
  305. if value.get_drvCur() != '':
  306. drv_cur = value.get_drvCur()
  307. gen_str += '''#define %s_DRV\t\t\tGPIO_%s\n''' %(key.upper(), drv_cur)
  308. gen_str += '''\n'''
  309. return gen_str
  310. def is_i2cPadPin(self, name):
  311. if re.match(r'^SCL\d+$', name) or re.match(r'^SDA\d+$', name):
  312. return True
  313. return False
  314. def fill_cFile(self):
  315. gen_str = ''
  316. for key in sorted_key(ModuleObj.get_data(self).keys()):
  317. value = ModuleObj.get_data(self)[key]
  318. if 'GPIO_INIT_NO_COVER' in value.get_varNames():
  319. continue
  320. for varName in value.get_varNames():
  321. gen_str += '''#define %s\t\t\t(%s | 0x80000000)\n''' %(varName.upper(), key.upper())
  322. if value.get_eintMode():
  323. gen_str += '''#define %s_M_EINT\t\tGPIO_MODE_00\n''' % (varName)
  324. if self.__gpio_column_enable:
  325. temp_list = []
  326. for item in GpioData._specMap.keys():
  327. regExp = '[_A-Z0-9:]*%s[_A-Z0-9:]*' %(item.upper())
  328. pat = re.compile(regExp)
  329. for i in range(0, GpioData._modNum):
  330. list = value.get_modeVec()
  331. mode_name = GpioData.get_modeName(key, i)
  332. if list[i] == '1':
  333. if mode_name.find('//') != -1:
  334. mode_name = mode_name.split('//')[0]
  335. elif list[i] == '2':
  336. if mode_name.find('//') != -1:
  337. mode_name = mode_name.split('//')[1]
  338. if pat.match(mode_name):
  339. if cmp(item, 'eint') == 0 and ((value.get_eintMode() or mode_name.find('MD_EINT') != -1)):
  340. continue
  341. gen_str += '''#define %s%s\t\tGPIO_MODE_0%d\n''' % (varName.upper(), GpioData._specMap[item].upper(), i)
  342. temp_list.append(i)
  343. break
  344. if not value.get_eintMode():
  345. list = value.get_modeVec()
  346. for i in range(0,GpioData._modNum):
  347. mode_name = GpioData.get_modeName(key, i)
  348. if list[i] == '0':
  349. continue
  350. elif list[i] == '1':
  351. if mode_name.find('//') != -1:
  352. mode_name = mode_name.split('//')[0]
  353. elif list[i] == '2':
  354. if mode_name.find('//') != -1:
  355. mode_name = mode_name.split('//')[1]
  356. if not i in temp_list:
  357. gen_str += '''#define %s_M_%s\t\tGPIO_MODE_0%d\n''' %(varName, re.sub(r'\d{0,3}$', '', mode_name), i)
  358. regExp = r'CLKM\d'
  359. pat = re.compile(regExp)
  360. for i in range(0, GpioData._modNum):
  361. mode = GpioData.get_modeName(key, i)
  362. if pat.match(mode):
  363. gen_str += '''#define %s_CLK\t\tCLK_OUT%s\n''' % (varName, mode[4:])
  364. temp = ''
  365. if varName in GpioData._freqMap.keys():
  366. temp = GpioData._freqMap[varName]
  367. else:
  368. temp = 'GPIO_CLKSRC_NONE'
  369. gen_str += '''#define %s_FREQ\t\t%s\n''' % (varName, temp)
  370. else:
  371. mode_name = GpioData.get_modeName(key, value.get_defMode())
  372. bmatch = False
  373. for item in GpioData._specMap.keys():
  374. regExp = '[_A-Z0-9:]*%s[_A-Z0-9:]*' %(item.upper())
  375. pat = re.compile(regExp)
  376. if pat.match(mode_name):
  377. if cmp(item, 'eint') == 0 and ((value.get_eintMode() or mode_name.find('MD_EINT') != -1)):
  378. continue
  379. gen_str += '''#define %s%s\t\tGPIO_MODE_0%d\n''' % (varName.upper(), GpioData._specMap[item].upper(), value.get_defMode())
  380. bmatch = True
  381. if not bmatch:
  382. gen_str += '''#define %s_M_%s\t\tGPIO_MODE_0%d\n''' % (varName.upper(), re.sub(r'\d{0,3}$', '', mode_name), value.get_defMode())
  383. if value.get_defMode() != 0:
  384. mode_name = GpioData.get_modeName(key, 0)
  385. gen_str += '''#define %s_M_%s\t\tGPIO_MODE_0%d\n''' % (varName.upper(), re.sub(r'\d{0,3}$', '', mode_name), 0)
  386. gen_str += '''\n'''
  387. return gen_str
  388. def fill_dtsiFile(self):
  389. gen_str = '''&pio {\n\n'''
  390. gen_str += '''\tgpio_pins_default: gpiodef{\n\t};\n\n'''
  391. #sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  392. for key in sorted_key(ModuleObj.get_data(self).keys()):
  393. #for key in sorted_list:
  394. value = ModuleObj.get_data(self)[key]
  395. gen_str += '''\t%s: gpio@%s {\n''' %(key.lower(), key[4:])
  396. gen_str += '''\t\tpins_cmd_dat {\n'''
  397. mode = value.get_defMode()
  398. mode_name = GpioData.get_modeName(key, mode)
  399. if self.__gpio_column_enable:
  400. mode_val = value.get_modeVec()[mode]
  401. if mode_val == '1':
  402. if mode_name.find('//') != -1:
  403. mode_name = mode_name.split('//')[0]
  404. elif mode_val == '2':
  405. if mode_name.find('//') != -1:
  406. mode_name = mode_name.split('//')[1]
  407. gen_str += '''\t\t\tpins = <PINMUX_GPIO%s__FUNC_%s>;\n''' %(key[4:], mode_name)
  408. gen_str += '''\t\t\tslew-rate = <%d>;\n''' %(value.ge_defDirInt())
  409. temp = ''
  410. if not value.get_inPullEn():
  411. temp = 'bias-disable;'
  412. gen_str += '''\t\t\t%s\n''' %(temp)
  413. if value.get_inPullSelHigh():
  414. temp = '11'
  415. else:
  416. temp = '00'
  417. gen_str += '''\t\t\tbias-pull-down = <%s>;\n''' %(temp)
  418. if value.get_outHigh():
  419. temp = 'high'
  420. else:
  421. temp = 'low'
  422. gen_str += '''\t\t\toutput-%s;\n''' %(temp)
  423. gen_str += '''\t\t\tinput-schmitt-enable = <%d>;\n''' %(value.get_smtEn())
  424. gen_str += '''\t\t};\n'''
  425. gen_str += '''\t};\n'''
  426. gen_str += '''};\n\n'''
  427. gen_str += '''&gpio {\n'''
  428. lineLen = 0
  429. gen_str += '''\tpinctrl-names = "default",'''
  430. lineLen += 30
  431. for i in range(0, GpioData._count-1):
  432. gen_str += '''"gpio%d",''' %(i)
  433. if i < 10:
  434. lineLen += 8
  435. elif i < 100:
  436. lineLen += 9
  437. elif i >= 100:
  438. lineLen += 10
  439. if lineLen > 100:
  440. gen_str += '''\n'''
  441. lineLen = 0
  442. gen_str += '''"gpio%d";\n''' %(GpioData._count-1)
  443. gen_str += '''\tpinctrl-0 = <&gpio_pins_default>;\n'''
  444. for i in range(1, GpioData._count):
  445. gen_str += '''\tpinctrl-%d = <&gpio%d>;\n''' %(i, i-1)
  446. gen_str += '''\n'''
  447. gen_str += '''\tstatus = \"okay\";\n'''
  448. gen_str += '''};\n'''
  449. return gen_str
  450. def fill_pinfunc_hFile(self):
  451. gen_str = '''#include \"mt65xx.h\"\n\n'''
  452. #sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  453. for key in sorted_key(ModuleObj.get_data(self).keys()):
  454. #for key in sorted_list:
  455. value = ModuleObj.get_data(self)[key]
  456. for i in range(0, GpioData._modNum):
  457. mode_name = GpioData.get_modeName(key, i)
  458. if mode_name != '':
  459. lst = []
  460. if mode_name.find('//') != -1:
  461. lst = mode_name.split('//')
  462. else:
  463. lst.append(mode_name)
  464. for j in range(0, len(lst)):
  465. gen_str += '''#define PINMUX_GPIO%s__FUNC_%s (MTK_PIN_NO(%s) | %d)\n''' %(key[4:], lst[j], key[4:], (i + j*8))
  466. gen_str += '''\n'''
  467. gen_str += '''\n'''
  468. return gen_str
  469. def fill_pinctrl_hFile(self):
  470. gen_str = '''#include <linux/pinctrl/pinctrl.h>\n'''
  471. gen_str += '''#include <pinctrl-mtk-common.h>\n\n'''
  472. gen_str += '''static const struct mtk_desc_pin mtk_pins_%s[] = {\n''' %(ModuleObj.get_chipId().lower())
  473. #sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  474. for key in sorted_key(ModuleObj.get_data(self).keys()):
  475. #for key in sorted_list:
  476. value = ModuleObj.get_data(self)[key]
  477. gen_str += '''\tMTK_PIN(\n'''
  478. gen_str += '''\t\tPINCTRL_PIN(%s, \"%s\"),\n''' %(key[4:], key.upper())
  479. gen_str += '''\t\tNULL, \"%s\",\n''' %(ModuleObj.get_chipId().lower())
  480. gen_str += '''\t\tMTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT)'''
  481. for i in range(0, GpioData._modNum):
  482. mode_name = GpioData.get_modeName(key, i)
  483. if mode_name != '':
  484. lst = []
  485. if mode_name.find('//') != -1:
  486. lst = mode_name.split('//')
  487. else:
  488. lst.append(mode_name)
  489. for j in range(0, len(lst)):
  490. gen_str += ''',\n\t\tMTK_FUNCTION(%d, "%s")''' %(i + j * 8, lst[j])
  491. gen_str += '''\n\t),\n'''
  492. gen_str += '''};\n'''
  493. return gen_str
  494. def fill_mapping_dtsiFile(self):
  495. gen_str = '''&gpio_usage_mapping {\n'''
  496. #sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  497. for key in sorted_key(ModuleObj.get_data(self).keys()):
  498. #for key in sorted_list:
  499. value = ModuleObj.get_data(self)[key]
  500. for varName in value.get_varNames():
  501. if varName != '' and varName.lower() in GpioData._mapList:
  502. gen_str += '''\t%s = <%s>;\n''' %(varName, key[4:])
  503. gen_str += '''};\n'''
  504. return gen_str
  505. def set_eint_map_table(self, map_table):
  506. GpioData.set_eint_map_table(map_table)
  507. def fill_init_default_dtsiFile(self):
  508. return ''
  509. class GpioObj_whitney(GpioObj):
  510. def __init__(self):
  511. GpioObj.__init__(self)
  512. def parse(self, node):
  513. log(LogLevel.info, 'GpioObj_whitney parse')
  514. GpioObj.parse(self, node)
  515. def gen_files(self):
  516. GpioObj.gen_files(self)
  517. def gen_spec(self, para):
  518. GpioObj.gen_spec(self, para)
  519. def is_i2cPadPin(self, name):
  520. return False
  521. class GpioObj_MT6759(GpioObj):
  522. def __init__(self):
  523. GpioObj.__init__(self)
  524. def parse(self, node):
  525. GpioObj.parse(self, node)
  526. def gen_files(self):
  527. GpioObj.gen_files(self)
  528. def gen_spec(self, para):
  529. GpioObj.gen_spec(self, para)
  530. def is_i2cPadPin(self, name):
  531. return False
  532. def fill_mapping_dtsiFile(self):
  533. gen_str = '''&gpio_usage_mapping {\n'''
  534. #sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  535. for key in sorted_key(ModuleObj.get_data(self).keys()):
  536. #for key in sorted_list:
  537. value = ModuleObj.get_data(self)[key]
  538. for varName in value.get_varNames():
  539. if varName != '' and varName.lower() in GpioData._mapList:
  540. gen_str += '''\t%s = <&pio %s 0>;\n''' %(varName, key[4:])
  541. gen_str += '''};\n'''
  542. return gen_str
  543. class GpioObj_MT6739(GpioObj_MT6759):
  544. def __init__(self):
  545. GpioObj_MT6759.__init__(self)
  546. def get_eint_index(self, gpio_index):
  547. if string.atoi(gpio_index) in GpioData._map_table.keys():
  548. return GpioData._map_table[string.atoi(gpio_index)]
  549. return -1
  550. def fill_pinctrl_hFile(self):
  551. gen_str = '''#include <linux/pinctrl/pinctrl.h>\n'''
  552. gen_str += '''#include <pinctrl-mtk-common.h>\n\n'''
  553. gen_str += '''static const struct mtk_desc_pin mtk_pins_%s[] = {\n''' % (ModuleObj.get_chipId().lower())
  554. # sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  555. for key in sorted_key(ModuleObj.get_data(self).keys()):
  556. # for key in sorted_list:
  557. value = ModuleObj.get_data(self)[key]
  558. gen_str += '''\tMTK_PIN(\n'''
  559. gen_str += '''\t\tPINCTRL_PIN(%s, \"%s\"),\n''' % (key[4:], key.upper())
  560. gen_str += '''\t\tNULL, \"%s\",\n''' % (ModuleObj.get_chipId().lower())
  561. eint_index = self.get_eint_index(key[4:])
  562. if eint_index != -1:
  563. gen_str += '''\t\tMTK_EINT_FUNCTION(%d, %d)''' % (0, eint_index)
  564. else:
  565. gen_str += '''\t\tMTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT)'''
  566. for i in range(0, GpioData._modNum):
  567. mode_name = GpioData.get_modeName(key, i)
  568. if mode_name != '':
  569. lst = []
  570. if mode_name.find('//') != -1:
  571. lst = mode_name.split('//')
  572. else:
  573. lst.append(mode_name)
  574. for j in range(0, len(lst)):
  575. gen_str += ''',\n\t\tMTK_FUNCTION(%d, "%s")''' % (i + j * 8, lst[j])
  576. gen_str += '''\n\t),\n'''
  577. gen_str += '''};\n'''
  578. return gen_str
  579. # remove dct in lk
  580. class GpioObj_MT6771(GpioObj_MT6739):
  581. def fill_init_default_dtsiFile(self):
  582. gen_str = '''\n&gpio{\n'''
  583. gen_str += '''\tgpio_init_default = '''
  584. for key in sorted_key(ModuleObj.get_data(self).keys()):
  585. value = ModuleObj.get_data(self)[key]
  586. # if var name contains GPIO_INIT_NO_COVER, the device tree info of the pin in cust.dtsi file would not gen
  587. if "GPIO_INIT_NO_COVER" in value.get_varNames():
  588. continue
  589. num = string.atoi(key[4:])
  590. defMode = value.get_defMode()
  591. dout = 1 if value.get_outHigh() else 0
  592. pullEn = 1 if value.get_inPullEn() else 0
  593. pullSel = 1 if value.get_inPullSelHigh() else 0
  594. smtEn = 1 if value.get_smtEn() else 0
  595. gen_str += '''<%d %d %d %d %d %d %d>,\n\t\t''' % (num, defMode, value.ge_defDirInt(), dout, pullEn, pullSel, smtEn)
  596. gen_str = gen_str[0: len(gen_str) - 4]
  597. gen_str += ';'
  598. gen_str += '''\n};\n'''
  599. return gen_str
  600. class GpioObj_MT6763(GpioObj_MT6759):
  601. def fill_init_default_dtsiFile(self):
  602. gen_str = '''\n&gpio{\n'''
  603. gen_str += '''\tgpio_init_default = '''
  604. for key in sorted_key(ModuleObj.get_data(self).keys()):
  605. value = ModuleObj.get_data(self)[key]
  606. num = string.atoi(key[4:])
  607. defMode = value.get_defMode()
  608. dout = 1 if value.get_outHigh() else 0
  609. pullEn = 1 if value.get_inPullEn() else 0
  610. pullSel = 1 if value.get_inPullSelHigh() else 0
  611. smtEn = 1 if value.get_smtEn() else 0
  612. gen_str += '''<%d %d %d %d %d %d %d>,\n\t\t''' % (num, defMode, value.ge_defDirInt(), dout, pullEn, pullSel, smtEn)
  613. gen_str = gen_str[0: len(gen_str) - 4]
  614. gen_str += ';'
  615. gen_str += '''\n};\n'''
  616. return gen_str
  617. class GpioObj_MT6768(GpioObj_MT6771):
  618. def fill_pinctrl_hFile(self):
  619. gen_str = '''#include "pinctrl-paris.h"\n\n'''
  620. gen_str += '''static const struct mtk_pin_desc mtk_pins_%s[] = {\n''' % (ModuleObj.get_chipId().lower())
  621. # sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  622. for key in sorted_key(ModuleObj.get_data(self).keys()):
  623. # for key in sorted_list:
  624. gen_str += '''\tMTK_PIN(\n'''
  625. gen_str += '''\t\t%s, \"%s\",\n''' % (key[4:], key.upper())
  626. eint_index = self.get_eint_index(key[4:])
  627. if eint_index != -1:
  628. gen_str += '''\t\tMTK_EINT_FUNCTION(%d, %d),\n''' % (0, eint_index)
  629. else:
  630. gen_str += '''\t\tMTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),\n'''
  631. gen_str += '''\t\tDRV_GRP4'''
  632. for i in range(0, GpioData._modNum):
  633. mode_name = GpioData.get_modeName(key, i)
  634. if mode_name != '':
  635. lst = []
  636. if mode_name.find('//') != -1:
  637. lst = mode_name.split('//')
  638. else:
  639. lst.append(mode_name)
  640. for j in range(0, len(lst)):
  641. gen_str += ''',\n\t\tMTK_FUNCTION(%d, "%s")''' % (i + j * 8, lst[j])
  642. gen_str += '''\n\t),\n'''
  643. gen_str += '''};\n'''
  644. return gen_str
  645. class GpioObj_MT6785(GpioObj_MT6771):
  646. # change feature from light for pin control
  647. def fill_pinctrl_hFile(self):
  648. gen_str = '''#include "pinctrl-paris.h"\n\n'''
  649. gen_str += '''static const struct mtk_pin_desc mtk_pins_%s[] = {\n''' % (ModuleObj.get_chipId().lower())
  650. # sorted_list = sorted(ModuleObj.get_data(self).keys(), key = compare)
  651. for key in sorted_key(ModuleObj.get_data(self).keys()):
  652. # for key in sorted_list:
  653. gen_str += '''\tMTK_PIN(\n'''
  654. gen_str += '''\t\t%s, \"%s\",\n''' % (key[4:], key.upper())
  655. eint_index = self.get_eint_index(key[4:])
  656. if eint_index != -1:
  657. gen_str += '''\t\tMTK_EINT_FUNCTION(%d, %d),\n''' % (0, eint_index)
  658. else:
  659. gen_str += '''\t\tMTK_EINT_FUNCTION(NO_EINT_SUPPORT, NO_EINT_SUPPORT),\n'''
  660. gen_str += '''\t\tDRV_GRP4'''
  661. for i in range(0, GpioData._modNum):
  662. mode_name = GpioData.get_modeName(key, i)
  663. smt_number = ModuleObj.get_data(self)[key].get_smtNum()
  664. if mode_name != '':
  665. if smt_number != -1:
  666. gen_str += ''',\n\t\tMTK_FUNCTION(%d, "%s")''' % (i, mode_name)
  667. else:
  668. gen_str += ''',\n\t\tMTK_FUNCTION(%d, NULL)''' % (i)
  669. gen_str += '''\n\t),\n'''
  670. gen_str += '''};\n'''
  671. return gen_str