pxa_reg_calcs.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #!/usr/bin/python
  2. # (C) Copyright 2004
  3. # BEC Systems <http://bec-systems.com>
  4. # Cliff Brake <cliff.brake@gmail.com>
  5. # SPDX-License-Identifier: GPL-2.0+
  6. # calculations for PXA255 registers
  7. class gpio:
  8. dir = '0'
  9. set = '0'
  10. clr = '0'
  11. alt = '0'
  12. desc = ''
  13. def __init__(self, dir=0, set=0, clr=0, alt=0, desc=''):
  14. self.dir = dir
  15. self.set = set
  16. self.clr = clr
  17. self.alt = alt
  18. self.desc = desc
  19. # the following is a dictionary of all GPIOs in the system
  20. # the key is the GPIO number
  21. pxa255_alt_func = {
  22. 0: ['gpio', 'none', 'none', 'none'],
  23. 1: ['gpio', 'gpio reset', 'none', 'none'],
  24. 2: ['gpio', 'none', 'none', 'none'],
  25. 3: ['gpio', 'none', 'none', 'none'],
  26. 4: ['gpio', 'none', 'none', 'none'],
  27. 5: ['gpio', 'none', 'none', 'none'],
  28. 6: ['gpio', 'MMC clk', 'none', 'none'],
  29. 7: ['gpio', '48MHz clock', 'none', 'none'],
  30. 8: ['gpio', 'MMC CS0', 'none', 'none'],
  31. 9: ['gpio', 'MMC CS1', 'none', 'none'],
  32. 10: ['gpio', 'RTC Clock', 'none', 'none'],
  33. 11: ['gpio', '3.6MHz', 'none', 'none'],
  34. 12: ['gpio', '32KHz', 'none', 'none'],
  35. 13: ['gpio', 'none', 'MBGNT', 'none'],
  36. 14: ['gpio', 'MBREQ', 'none', 'none'],
  37. 15: ['gpio', 'none', 'nCS_1', 'none'],
  38. 16: ['gpio', 'none', 'PWM0', 'none'],
  39. 17: ['gpio', 'none', 'PWM1', 'none'],
  40. 18: ['gpio', 'RDY', 'none', 'none'],
  41. 19: ['gpio', 'DREQ[1]', 'none', 'none'],
  42. 20: ['gpio', 'DREQ[0]', 'none', 'none'],
  43. 21: ['gpio', 'none', 'none', 'none'],
  44. 22: ['gpio', 'none', 'none', 'none'],
  45. 23: ['gpio', 'none', 'SSP SCLK', 'none'],
  46. 24: ['gpio', 'none', 'SSP SFRM', 'none'],
  47. 25: ['gpio', 'none', 'SSP TXD', 'none'],
  48. 26: ['gpio', 'SSP RXD', 'none', 'none'],
  49. 27: ['gpio', 'SSP EXTCLK', 'none', 'none'],
  50. 28: ['gpio', 'AC97 bitclk in, I2S bitclock out', 'I2S bitclock in', 'none'],
  51. 29: ['gpio', 'AC97 SDATA_IN0', 'I2S SDATA_IN', 'none'],
  52. 30: ['gpio', 'I2S SDATA_OUT', 'AC97 SDATA_OUT', 'none'],
  53. 31: ['gpio', 'I2S SYNC', 'AC97 SYNC', 'none'],
  54. 32: ['gpio', 'AC97 SDATA_IN1', 'I2S SYSCLK', 'none'],
  55. 33: ['gpio', 'none', 'nCS_5', 'none'],
  56. 34: ['gpio', 'FF RXD', 'MMC CS0', 'none'],
  57. 35: ['gpio', 'FF CTS', 'none', 'none'],
  58. 36: ['gpio', 'FF DCD', 'none', 'none'],
  59. 37: ['gpio', 'FF DSR', 'none', 'none'],
  60. 38: ['gpio', 'FF RI', 'none', 'none'],
  61. 39: ['gpio', 'MMC CS1', 'FF TXD', 'none'],
  62. 40: ['gpio', 'none', 'FF DTR', 'none'],
  63. 41: ['gpio', 'none', 'FF RTS', 'none'],
  64. 42: ['gpio', 'BT RXD', 'none', 'HW RXD'],
  65. 43: ['gpio', 'none', 'BT TXD', 'HW TXD'],
  66. 44: ['gpio', 'BT CTS', 'none', 'HW CTS'],
  67. 45: ['gpio', 'none', 'BT RTS', 'HW RTS'],
  68. 46: ['gpio', 'ICP_RXD', 'STD RXD', 'none'],
  69. 47: ['gpio', 'STD TXD', 'ICP_TXD', 'none'],
  70. 48: ['gpio', 'HW TXD', 'nPOE', 'none'],
  71. 49: ['gpio', 'HW RXD', 'nPWE', 'none'],
  72. 50: ['gpio', 'HW CTS', 'nPIOR', 'none'],
  73. 51: ['gpio', 'nPIOW', 'HW RTS', 'none'],
  74. 52: ['gpio', 'none', 'nPCE[1]', 'none'],
  75. 53: ['gpio', 'MMC CLK', 'nPCE[2]', 'none'],
  76. 54: ['gpio', 'MMC CLK', 'nPSKSEL', 'none'],
  77. 55: ['gpio', 'none', 'nPREG', 'none'],
  78. 56: ['gpio', 'nPWAIT', 'none', 'none'],
  79. 57: ['gpio', 'nIOIS16', 'none', 'none'],
  80. 58: ['gpio', 'none', 'LDD[0]', 'none'],
  81. 59: ['gpio', 'none', 'LDD[1]', 'none'],
  82. 60: ['gpio', 'none', 'LDD[2]', 'none'],
  83. 61: ['gpio', 'none', 'LDD[3]', 'none'],
  84. 62: ['gpio', 'none', 'LDD[4]', 'none'],
  85. 63: ['gpio', 'none', 'LDD[5]', 'none'],
  86. 64: ['gpio', 'none', 'LDD[6]', 'none'],
  87. 65: ['gpio', 'none', 'LDD[7]', 'none'],
  88. 66: ['gpio', 'MBREQ', 'LDD[8]', 'none'],
  89. 67: ['gpio', 'MMC CS0', 'LDD[9]', 'none'],
  90. 68: ['gpio', 'MMC CS1', 'LDD[10]', 'none'],
  91. 69: ['gpio', 'MMC CLK', 'LDD[11]', 'none'],
  92. 70: ['gpio', 'RTC CLK', 'LDD[12]', 'none'],
  93. 71: ['gpio', '3.6 MHz', 'LDD[13]', 'none'],
  94. 72: ['gpio', '32 KHz', 'LDD[14]', 'none'],
  95. 73: ['gpio', 'MBGNT', 'LDD[15]', 'none'],
  96. 74: ['gpio', 'none', 'LCD_FCLK', 'none'],
  97. 75: ['gpio', 'none', 'LCD_LCLK', 'none'],
  98. 76: ['gpio', 'none', 'LCD_PCLK', 'none'],
  99. 77: ['gpio', 'none', 'LCD_ACBIAS', 'none'],
  100. 78: ['gpio', 'none', 'nCS_2', 'none'],
  101. 79: ['gpio', 'none', 'nCS_3', 'none'],
  102. 80: ['gpio', 'none', 'nCS_4', 'none'],
  103. 81: ['gpio', 'NSSPSCLK', 'none', 'none'],
  104. 82: ['gpio', 'NSSPSFRM', 'none', 'none'],
  105. 83: ['gpio', 'NSSPTXD', 'NSSPRXD', 'none'],
  106. 84: ['gpio', 'NSSPTXD', 'NSSPRXD', 'none'],
  107. }
  108. #def __init__(self, dir=0, set=0, clr=0, alt=0, desc=''):
  109. gpio_list = []
  110. for i in range(0,85):
  111. gpio_list.append(gpio())
  112. #chip select GPIOs
  113. gpio_list[18] = gpio(0, 0, 0, 1, 'RDY')
  114. gpio_list[33] = gpio(1, 1, 0, 2, 'CS5#')
  115. gpio_list[80] = gpio(1, 1, 0, 2, 'CS4#')
  116. gpio_list[79] = gpio(1, 1, 0, 2, 'CS3#')
  117. gpio_list[78] = gpio(1, 1, 0, 2, 'CS2#')
  118. gpio_list[15] = gpio(1, 1, 0, 2, 'CS1#')
  119. gpio_list[22] = gpio(0, 0, 0, 0, 'Consumer IR, PCC_S1_IRQ_O#')
  120. gpio_list[21] = gpio(0, 0, 0, 0, 'IRQ_IDE, PFI')
  121. gpio_list[19] = gpio(0, 0, 0, 0, 'XB_DREQ1, PCC_SO_IRQ_O#')
  122. gpio_list[20] = gpio(0, 0, 0, 0, 'XB_DREQ0')
  123. gpio_list[20] = gpio(0, 0, 0, 0, 'XB_DREQ0')
  124. gpio_list[17] = gpio(0, 0, 0, 0, 'IRQ_AXB')
  125. gpio_list[16] = gpio(1, 0, 0, 2, 'PWM0')
  126. # PCMCIA stuff
  127. gpio_list[57] = gpio(0, 0, 0, 1, 'PCC_IOIS16#')
  128. gpio_list[56] = gpio(0, 0, 0, 1, 'PCC_WAIT#')
  129. gpio_list[55] = gpio(1, 0, 0, 2, 'PCC_REG#')
  130. gpio_list[54] = gpio(1, 0, 0, 2, 'PCC_SCKSEL')
  131. gpio_list[53] = gpio(1, 1, 0, 2, 'PCC_CE2#')
  132. gpio_list[52] = gpio(1, 1, 0, 2, 'PCC_CE1#')
  133. gpio_list[51] = gpio(1, 1, 0, 1, 'PCC_IOW#')
  134. gpio_list[50] = gpio(1, 1, 0, 2, 'PCC_IOR#')
  135. gpio_list[49] = gpio(1, 1, 0, 2, 'PCC_WE#')
  136. gpio_list[48] = gpio(1, 1, 0, 2, 'PCC_OE#')
  137. # SSP port
  138. gpio_list[26] = gpio(0, 0, 0, 1, 'SSP_RXD')
  139. gpio_list[25] = gpio(0, 0, 0, 0, 'SSP_TXD')
  140. gpio_list[24] = gpio(1, 0, 1, 2, 'SSP_SFRM')
  141. gpio_list[23] = gpio(1, 0, 1, 2, 'SSP_SCLK')
  142. gpio_list[27] = gpio(0, 0, 0, 0, 'SSP_EXTCLK')
  143. # audio codec
  144. gpio_list[32] = gpio(0, 0, 0, 0, 'AUD_SDIN1')
  145. gpio_list[31] = gpio(1, 0, 0, 2, 'AC_SYNC')
  146. gpio_list[30] = gpio(1, 0, 0, 2, 'AC_SDOUT')
  147. gpio_list[29] = gpio(0, 0, 0, 1, 'AUD_SDIN0')
  148. gpio_list[28] = gpio(0, 0, 0, 1, 'AC_BITCLK')
  149. # serial ports
  150. gpio_list[39] = gpio(1, 0, 0, 2, 'FF_TXD')
  151. gpio_list[34] = gpio(0, 0, 0, 1, 'FF_RXD')
  152. gpio_list[41] = gpio(1, 0, 0, 2, 'FF_RTS')
  153. gpio_list[35] = gpio(0, 0, 0, 1, 'FF_CTS')
  154. gpio_list[40] = gpio(1, 0, 0, 2, 'FF_DTR')
  155. gpio_list[37] = gpio(0, 0, 0, 1, 'FF_DSR')
  156. gpio_list[38] = gpio(0, 0, 0, 1, 'FF_RI')
  157. gpio_list[36] = gpio(0, 0, 0, 1, 'FF_DCD')
  158. gpio_list[43] = gpio(1, 0, 0, 2, 'BT_TXD')
  159. gpio_list[42] = gpio(0, 0, 0, 1, 'BT_RXD')
  160. gpio_list[45] = gpio(1, 0, 0, 2, 'BT_RTS')
  161. gpio_list[44] = gpio(0, 0, 0, 1, 'BT_CTS')
  162. gpio_list[47] = gpio(1, 0, 0, 1, 'IR_TXD')
  163. gpio_list[46] = gpio(0, 0, 0, 2, 'IR_RXD')
  164. # misc GPIO signals
  165. gpio_list[14] = gpio(0, 0, 0, 0, 'MBREQ')
  166. gpio_list[13] = gpio(0, 0, 0, 0, 'MBGNT')
  167. gpio_list[12] = gpio(0, 0, 0, 0, 'GPIO_12/32K_CLK')
  168. gpio_list[11] = gpio(0, 0, 0, 0, '3M6_CLK')
  169. gpio_list[10] = gpio(1, 0, 1, 0, 'GPIO_10/RTC_CLK/debug LED')
  170. gpio_list[9] = gpio(0, 0, 0, 0, 'MMC_CD#')
  171. gpio_list[8] = gpio(0, 0, 0, 0, 'PCC_S1_CD#')
  172. gpio_list[7] = gpio(0, 0, 0, 0, 'PCC_S0_CD#')
  173. gpio_list[6] = gpio(1, 0, 0, 1, 'MMC_CLK')
  174. gpio_list[5] = gpio(0, 0, 0, 0, 'IRQ_TOUCH#')
  175. gpio_list[4] = gpio(0, 0, 0, 0, 'IRQ_ETH')
  176. gpio_list[3] = gpio(0, 0, 0, 0, 'MQ_IRQ#')
  177. gpio_list[2] = gpio(0, 0, 0, 0, 'BAT_DATA')
  178. gpio_list[1] = gpio(0, 0, 0, 1, 'USER_RESET#')
  179. gpio_list[0] = gpio(0, 0, 0, 1, 'USER_RESET#')
  180. # LCD GPIOs
  181. gpio_list[58] = gpio(1, 0, 0, 2, 'LDD0')
  182. gpio_list[59] = gpio(1, 0, 0, 2, 'LDD1')
  183. gpio_list[60] = gpio(1, 0, 0, 2, 'LDD2')
  184. gpio_list[61] = gpio(1, 0, 0, 2, 'LDD3')
  185. gpio_list[62] = gpio(1, 0, 0, 2, 'LDD4')
  186. gpio_list[63] = gpio(1, 0, 0, 2, 'LDD5')
  187. gpio_list[64] = gpio(1, 0, 0, 2, 'LDD6')
  188. gpio_list[65] = gpio(1, 0, 0, 2, 'LDD7')
  189. gpio_list[66] = gpio(1, 0, 0, 2, 'LDD8')
  190. gpio_list[67] = gpio(1, 0, 0, 2, 'LDD9')
  191. gpio_list[68] = gpio(1, 0, 0, 2, 'LDD10')
  192. gpio_list[69] = gpio(1, 0, 0, 2, 'LDD11')
  193. gpio_list[70] = gpio(1, 0, 0, 2, 'LDD12')
  194. gpio_list[71] = gpio(1, 0, 0, 2, 'LDD13')
  195. gpio_list[72] = gpio(1, 0, 0, 2, 'LDD14')
  196. gpio_list[73] = gpio(1, 0, 0, 2, 'LDD15')
  197. gpio_list[74] = gpio(1, 0, 0, 2, 'FCLK')
  198. gpio_list[75] = gpio(1, 0, 0, 2, 'LCLK')
  199. gpio_list[76] = gpio(1, 0, 0, 2, 'PCLK')
  200. gpio_list[77] = gpio(1, 0, 0, 2, 'ACBIAS')
  201. # calculate registers
  202. pxa_regs = {
  203. 'gpdr0':0, 'gpdr1':0, 'gpdr2':0,
  204. 'gpsr0':0, 'gpsr1':0, 'gpsr2':0,
  205. 'gpcr0':0, 'gpcr1':0, 'gpcr2':0,
  206. 'gafr0_l':0, 'gafr0_u':0,
  207. 'gafr1_l':0, 'gafr1_u':0,
  208. 'gafr2_l':0, 'gafr2_u':0,
  209. }
  210. # U-boot define names
  211. uboot_reg_names = {
  212. 'gpdr0':'CONFIG_SYS_GPDR0_VAL', 'gpdr1':'CONFIG_SYS_GPDR1_VAL', 'gpdr2':'CONFIG_SYS_GPDR2_VAL',
  213. 'gpsr0':'CONFIG_SYS_GPSR0_VAL', 'gpsr1':'CONFIG_SYS_GPSR1_VAL', 'gpsr2':'CONFIG_SYS_GPSR2_VAL',
  214. 'gpcr0':'CONFIG_SYS_GPCR0_VAL', 'gpcr1':'CONFIG_SYS_GPCR1_VAL', 'gpcr2':'CONFIG_SYS_GPCR2_VAL',
  215. 'gafr0_l':'CONFIG_SYS_GAFR0_L_VAL', 'gafr0_u':'CONFIG_SYS_GAFR0_U_VAL',
  216. 'gafr1_l':'CONFIG_SYS_GAFR1_L_VAL', 'gafr1_u':'CONFIG_SYS_GAFR1_U_VAL',
  217. 'gafr2_l':'CONFIG_SYS_GAFR2_L_VAL', 'gafr2_u':'CONFIG_SYS_GAFR2_U_VAL',
  218. }
  219. # bit mappings
  220. bit_mappings = [
  221. { 'gpio':(0,32), 'shift':1, 'regs':{'dir':'gpdr0', 'set':'gpsr0', 'clr':'gpcr0'} },
  222. { 'gpio':(32,64), 'shift':1, 'regs':{'dir':'gpdr1', 'set':'gpsr1', 'clr':'gpcr1'} },
  223. { 'gpio':(64,85), 'shift':1, 'regs':{'dir':'gpdr2', 'set':'gpsr2', 'clr':'gpcr2'} },
  224. { 'gpio':(0,16), 'shift':2, 'regs':{'alt':'gafr0_l'} },
  225. { 'gpio':(16,32), 'shift':2, 'regs':{'alt':'gafr0_u'} },
  226. { 'gpio':(32,48), 'shift':2, 'regs':{'alt':'gafr1_l'} },
  227. { 'gpio':(48,64), 'shift':2, 'regs':{'alt':'gafr1_u'} },
  228. { 'gpio':(64,80), 'shift':2, 'regs':{'alt':'gafr2_l'} },
  229. { 'gpio':(80,85), 'shift':2, 'regs':{'alt':'gafr2_u'} },
  230. ]
  231. def stuff_bits(bit_mapping, gpio_list):
  232. gpios = range( bit_mapping['gpio'][0], bit_mapping['gpio'][1])
  233. for gpio in gpios:
  234. for reg in bit_mapping['regs'].keys():
  235. value = eval( 'gpio_list[gpio].%s' % (reg) )
  236. if ( value ):
  237. # we have a high bit
  238. bit_shift = (gpio - bit_mapping['gpio'][0]) * bit_mapping['shift']
  239. bit = value << (bit_shift)
  240. pxa_regs[bit_mapping['regs'][reg]] |= bit
  241. for i in bit_mappings:
  242. stuff_bits(i, gpio_list)
  243. # now print out all regs
  244. registers = pxa_regs.keys()
  245. registers.sort()
  246. for reg in registers:
  247. print '%s: 0x%x' % (reg, pxa_regs[reg])
  248. # print define to past right into U-Boot source code
  249. print
  250. print
  251. for reg in registers:
  252. print '#define %s 0x%x' % (uboot_reg_names[reg], pxa_regs[reg])
  253. # print all GPIOS
  254. print
  255. print
  256. for i in range(len(gpio_list)):
  257. gpio_i = gpio_list[i]
  258. alt_func_desc = pxa255_alt_func[i][gpio_i.alt]
  259. print 'GPIO: %i, dir=%i, set=%i, clr=%i, alt=%s, desc=%s' % (i, gpio_i.dir, gpio_i.set, gpio_i.clr, alt_func_desc, gpio_i.desc)