uboot_helper 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #!/usr/bin/env python3
  2. # SPDX-License-Identifier: GPL-2.0
  3. # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
  4. import argparse
  5. # When adding new devices to the list please keep them in alphabetical order
  6. # board-name should contain 'dashes' (-) not 'underscores' (_) and shouldn't contain capitals
  7. # you can check the formating using an online tool such as https://codebeautify.org/python-formatter-beautifier
  8. # 'project' : {
  9. # 'device' : {
  10. # 'board-name' : {
  11. # 'dtb' : 'board-name.dtb',
  12. # 'config' : 'board_name_defconfig'
  13. # },
  14. # },
  15. # },
  16. devices = \
  17. {
  18. 'Allwinner': {
  19. 'A64': {
  20. 'orangepi-win': {
  21. 'dtb': 'sun50i-a64-orangepi-win.dtb',
  22. 'config': 'orangepi_win_defconfig',
  23. 'crust_config': 'orangepi_win_defconfig',
  24. },
  25. 'pine64': {
  26. 'dtb': 'sun50i-a64-pine64.dtb',
  27. 'config': 'pine64_plus_defconfig',
  28. 'crust_config': 'pine64_plus_defconfig'
  29. },
  30. 'pine64-lts': {
  31. 'dtb': 'sun50i-a64-pine64-lts.dtb',
  32. 'config': 'pine64-lts_defconfig',
  33. 'crust_config': 'pine64_plus_defconfig'
  34. },
  35. 'pine64-plus': {
  36. 'dtb': 'sun50i-a64-pine64-plus.dtb',
  37. 'config': 'pine64_plus_defconfig',
  38. 'crust_config': 'pine64_plus_defconfig',
  39. },
  40. },
  41. 'H2-plus': {
  42. 'bananapi-m2-zero': {
  43. 'dtb': 'sun8i-h2-plus-bananapi-m2-zero.dtb',
  44. 'config': 'bananapi_m2_zero_defconfig',
  45. 'crust_config': 'orangepi_one_defconfig'
  46. },
  47. },
  48. 'H3': {
  49. 'bananapi-m2p': {
  50. 'dtb': 'sun8i-h3-bananapi-m2-plus.dtb',
  51. 'config': 'bananapi_m2_plus_h3_defconfig',
  52. 'crust_config': 'bananapi_m2_plus_h3_defconfig'
  53. },
  54. 'beelink-x2': {
  55. 'dtb': 'sun8i-h3-beelink-x2.dtb',
  56. 'config': 'beelink_x2_defconfig',
  57. 'crust_config': 'beelink_x2_defconfig'
  58. },
  59. 'libretech-h3': {
  60. 'dtb': 'sun8i-h3-libretech-all-h3-cc.dtb',
  61. 'config': 'libretech_all_h3_cc_h3_defconfig',
  62. 'crust_config': 'libretech_all_h3_cc_h3_defconfig',
  63. },
  64. 'nanopi-m1': {
  65. 'dtb': 'sun8i-h3-nanopi-m1.dtb',
  66. 'config': 'nanopi_m1_defconfig',
  67. 'crust_config': 'nanopi_m1_defconfig'
  68. },
  69. 'orangepi-2': {
  70. 'dtb': 'sun8i-h3-orangepi-2.dtb',
  71. 'config': 'orangepi_2_defconfig',
  72. 'crust_config': 'orangepi_2_defconfig',
  73. },
  74. 'orangepi-pc': {
  75. 'dtb': 'sun8i-h3-orangepi-pc.dtb',
  76. 'config': 'orangepi_pc_defconfig',
  77. 'crust_config': 'orangepi_pc_defconfig',
  78. },
  79. 'orangepi-pc-plus': {
  80. 'dtb': 'sun8i-h3-orangepi-pc-plus.dtb',
  81. 'config': 'orangepi_pc_plus_defconfig',
  82. 'crust_config': 'orangepi_pc_plus_defconfig',
  83. },
  84. 'orangepi-plus2e': {
  85. 'dtb': 'sun8i-h3-orangepi-plus2e.dtb',
  86. 'config': 'orangepi_plus2e_defconfig',
  87. 'crust_config': 'orangepi_plus2e_defconfig',
  88. },
  89. 'orangepi-plus': {
  90. 'dtb': 'sun8i-h3-orangepi-plus.dtb',
  91. 'config': 'orangepi_plus_defconfig',
  92. 'crust_config': 'orangepi_plus_defconfig',
  93. },
  94. },
  95. 'H5' : {
  96. 'orangepi-pc2': {
  97. 'dtb': 'sun50i-h5-orangepi-pc2.dtb',
  98. 'config': 'orangepi_pc2_defconfig',
  99. 'crust_config': 'orangepi_pc2_defconfig',
  100. },
  101. 'tritium-h5': {
  102. 'dtb': 'sun50i-h5-libretech-all-h3-cc.dtb',
  103. 'config': 'libretech_all_h3_cc_h5_defconfig',
  104. 'crust_config': 'libretech_all_h3_cc_h5_defconfig'
  105. },
  106. },
  107. 'H6': {
  108. 'beelink-gs1' : {
  109. 'dtb' : 'sun50i-h6-beelink-gs1.dtb',
  110. 'config' : 'beelink_gs1_defconfig',
  111. 'crust_config' : 'beelink_gs1_defconfig'
  112. },
  113. 'orangepi-3': {
  114. 'dtb': 'sun50i-h6-orangepi-3.dtb',
  115. 'config': 'orangepi_3_defconfig',
  116. 'crust_config': 'orangepi_3_defconfig'
  117. },
  118. 'orangepi-3-lts': {
  119. 'dtb': 'sun50i-h6-orangepi-3-lts.dtb',
  120. 'config': 'orangepi_3_lts_defconfig',
  121. 'crust_config': 'pine_h64_defconfig'
  122. },
  123. 'orangepi-lite2': {
  124. 'dtb': 'sun50i-h6-orangepi-lite2.dtb',
  125. 'config': 'orangepi_lite2_defconfig',
  126. 'crust_config': 'orangepi_3_defconfig'
  127. },
  128. 'orangepi-one-plus': {
  129. 'dtb': 'sun50i-h6-orangepi-one-plus.dtb',
  130. 'config': 'orangepi_one_plus_defconfig',
  131. 'crust_config': 'orangepi_3_defconfig'
  132. },
  133. 'pine-h64': {
  134. 'dtb': 'sun50i-h6-pine-h64.dtb',
  135. 'config': 'pine_h64_defconfig',
  136. 'crust_config': 'pine_h64_defconfig',
  137. },
  138. 'pine-h64-model-b': {
  139. 'dtb': 'sun50i-h6-pine-h64-model-b.dtb',
  140. 'config': 'pine_h64_defconfig',
  141. 'crust_config': 'pine_h64_defconfig'
  142. },
  143. 'tanix-tx6' : {
  144. 'dtb' : 'sun50i-h6-tanix-tx6.dtb',
  145. 'config' : 'tanix_tx6_defconfig',
  146. 'crust_config' : 'tanix_tx6_defconfig'
  147. },
  148. },
  149. 'R40' : {
  150. 'bananapi-m2u' : {
  151. 'dtb' : 'sun8i-r40-bananapi-m2-ultra.dtb',
  152. 'config' : 'Bananapi_M2_Ultra_defconfig'
  153. },
  154. },
  155. },
  156. 'Amlogic': {
  157. 'AMLGX': {
  158. 'box': {
  159. 'dtb': '',
  160. 'config': 'p212_defconfig'
  161. },
  162. 'bananapi-m2s': {
  163. 'dtb': 'meson-g12b-a311d-bananapi-m2s.dtb',
  164. 'config': 'bananapi-m2s_defconfig'
  165. },
  166. 'bananapi-m2-pro': {
  167. 'dtb': 'meson-sm1-bananapi-m2-pro.dtb',
  168. 'config': 'bananapi-m2-pro_defconfig'
  169. },
  170. 'bananapi-m5': {
  171. 'dtb': 'meson-sm1-bananapi-m5.dtb',
  172. 'config': 'bananapi-m5_defconfig'
  173. },
  174. 'khadas-vim': {
  175. 'dtb': 'meson-gxl-s905x-khadas-vim.dtb',
  176. 'config': 'khadas-vim_defconfig'
  177. },
  178. 'khadas-vim2': {
  179. 'dtb': 'meson-gxm-khadas-vim2.dtb',
  180. 'config': 'khadas-vim2_defconfig'
  181. },
  182. 'khadas-vim3': {
  183. 'dtb': 'meson-g12b-a311d-khadas-vim3.dtb',
  184. 'config': 'khadas-vim3_defconfig'
  185. },
  186. 'khadas-vim3l': {
  187. 'dtb': 'meson-sm1-khadas-vim3l.dtb',
  188. 'config': 'khadas-vim3l_defconfig'
  189. },
  190. 'lafrite': {
  191. 'dtb': 'meson-gxl-s805x-libretech-ac.dtb',
  192. 'config': 'libretech-ac_defconfig'
  193. },
  194. 'lepotato': {
  195. 'dtb': 'meson-gxl-s905x-libretech-cc.dtb',
  196. 'config': 'libretech-cc_defconfig'
  197. },
  198. 'nanopi-k2': {
  199. 'dtb': 'meson-gxbb-nanopi-k2.dtb',
  200. 'config': 'nanopi-k2_defconfig'
  201. },
  202. 'odroid-c2': {
  203. 'dtb': 'meson-gxbb-odroidc2.dtb',
  204. 'config': 'odroid-c2_defconfig'
  205. },
  206. 'odroid-c4': {
  207. 'dtb': 'meson-sm1-odroid-c4.dtb',
  208. 'config': 'odroid-c4_defconfig'
  209. },
  210. 'odroid-hc4': {
  211. 'dtb': 'meson-sm1-odroid-hc4.dtb',
  212. 'config': 'odroid-hc4_defconfig'
  213. },
  214. 'odroid-n2': {
  215. 'dtb': 'meson-g12b-odroid-n2.dtb',
  216. 'config': 'odroid-n2_defconfig'
  217. },
  218. 'radxa-zero': {
  219. 'dtb': 'meson-g12a-radxa-zero.dtb',
  220. 'config': 'radxa-zero_defconfig'
  221. },
  222. 'radxa-zero2': {
  223. 'dtb': 'meson-g12b-radxa-zero2.dtb',
  224. 'config': 'radxa-zero2_defconfig'
  225. },
  226. 'wetek-core2': {
  227. 'dtb': 'meson-gxm-wetek-core2.dtb',
  228. 'config': 'wetek-core2_defconfig'
  229. },
  230. 'wetek-play2': {
  231. 'dtb': 'meson-gxbb-wetek-play2.dtb',
  232. 'config': 'wetek-play2_defconfig'
  233. },
  234. },
  235. },
  236. 'NXP': {
  237. 'iMX6': {
  238. 'cubox': {
  239. 'dtb': '',
  240. 'config': 'mx6cuboxi_defconfig'
  241. },
  242. 'udoo': {
  243. 'dtb': '',
  244. 'config': 'udoo_defconfig'
  245. },
  246. 'wandboard': {
  247. 'dtb': '',
  248. 'config': 'wandboard_defconfig'
  249. },
  250. },
  251. 'iMX8' : {
  252. 'mq-evk' : {
  253. 'dtb' : 'imx8mq-evk.dtb',
  254. 'config' : 'imx8mq_evk_defconfig'
  255. },
  256. 'pico-mq' : {
  257. 'dtb' : 'imx8mq-pico-pi.dtb',
  258. 'config' : 'pico-imx8mq_defconfig'
  259. },
  260. },
  261. },
  262. 'Qualcomm': {
  263. 'Dragonboard': {
  264. '410c': {
  265. 'dtb': 'apq8016-sbc.dtb',
  266. 'config': 'dragonboard410c_defconfig'
  267. },
  268. },
  269. },
  270. 'Rockchip': {
  271. 'RK3288': {
  272. 'miqi': {
  273. 'dtb': 'rk3288-miqi.dtb',
  274. 'config': 'miqi-rk3288_defconfig'
  275. },
  276. 'tinker': {
  277. 'dtb': 'rk3288-tinker-s.dtb',
  278. 'config': 'tinker-s-rk3288_defconfig'
  279. },
  280. },
  281. 'RK3328': {
  282. 'a1': {
  283. 'dtb': 'rk3328-a1.dtb',
  284. 'config': 'evb-rk3328_defconfig',
  285. 'rockchip_legacy_boot': '1'
  286. },
  287. 'roc-cc': {
  288. 'dtb': 'rk3328-roc-cc.dtb',
  289. 'config': 'roc-cc-rk3328_defconfig'
  290. },
  291. 'rock64': {
  292. 'dtb': 'rk3328-rock64.dtb',
  293. 'config': 'rock64-rk3328_defconfig'
  294. },
  295. },
  296. 'RK3399': {
  297. 'hugsun-x99': {
  298. 'dtb': 'rk3399-hugsun-x99.dtb',
  299. 'config': 'evb-rk3399_defconfig',
  300. 'rockchip_legacy_boot': '1'
  301. },
  302. 'khadas-edge': {
  303. 'dtb': 'rk3399-khadas-edge.dtb',
  304. 'config': 'khadas-edge-rk3399_defconfig'
  305. },
  306. 'nanopc-t4': {
  307. 'dtb': 'rk3399-nanopc-t4.dtb',
  308. 'config': 'nanopc-t4-rk3399_defconfig'
  309. },
  310. 'nanopi-m4': {
  311. 'dtb': 'rk3399-nanopi-m4.dtb',
  312. 'config': 'nanopi-m4-rk3399_defconfig'
  313. },
  314. 'orangepi': {
  315. 'dtb': 'rk3399-orangepi.dtb',
  316. 'config': 'orangepi-rk3399_defconfig'
  317. },
  318. 'rock960': {
  319. 'dtb': 'rk3399-rock960.dtb',
  320. 'config': 'rock960-rk3399_defconfig'
  321. },
  322. 'rock-pi-4': {
  323. 'dtb': 'rk3399-rock-pi-4b.dtb',
  324. 'config': 'rock-pi-4-rk3399_defconfig'
  325. },
  326. 'rock-pi-4-plus': {
  327. 'dtb': 'rk3399-rock-pi-4b-plus.dtb',
  328. 'config': 'rock-pi-4-rk3399_defconfig'
  329. },
  330. 'rock-4c-plus': {
  331. 'dtb': 'rk3399-rock-4c-plus.dtb',
  332. 'config': 'rock-4c-plus-rk3399_defconfig'
  333. },
  334. 'rock-pi-n10': {
  335. 'dtb': 'rk3399pro-rock-pi-n10.dtb',
  336. 'config': 'rock-pi-n10-rk3399pro_defconfig'
  337. },
  338. 'rockpro64': {
  339. 'dtb': 'rk3399-rockpro64.dtb',
  340. 'config': 'rockpro64-rk3399_defconfig'
  341. },
  342. 'roc-pc': {
  343. 'dtb': 'rk3399-roc-pc-mezzanine.dtb',
  344. 'config': 'roc-pc-mezzanine-rk3399_defconfig'
  345. },
  346. 'roc-pc-plus': {
  347. 'dtb': 'rk3399-roc-pc-plus.dtb',
  348. 'config': 'roc-pc-rk3399_defconfig'
  349. },
  350. 'sapphire': {
  351. 'dtb': 'rk3399-sapphire.dtb',
  352. 'config': 'evb-rk3399_defconfig',
  353. 'rockchip_legacy_boot': '1'
  354. },
  355. },
  356. },
  357. 'Samsung': {
  358. 'Exynos': {
  359. 'odroid-xu3': {
  360. 'dtb': 'exynos5422-odroidxu3.dtb',
  361. 'config': 'odroid-xu3_defconfig'
  362. },
  363. 'odroid-xu4': {
  364. 'dtb': 'exynos5422-odroidxu4.dtb',
  365. 'config': 'odroid-xu4_defconfig'
  366. },
  367. },
  368. },
  369. }
  370. class OptionsAction(argparse.Action):
  371. def __call__(self, parser, namespace, values, option_string=None):
  372. message = None
  373. if self.dest == 'project':
  374. if values is None:
  375. print(' '.join(project for project in sorted(devices)))
  376. parser.exit()
  377. if values not in devices.keys():
  378. message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(project) for project in devices]))
  379. if self.dest == 'soc':
  380. project = getattr(namespace, 'project')
  381. if values is None:
  382. print(' '.join(soc for soc in sorted(devices[project])))
  383. parser.exit()
  384. if values not in devices[project].keys():
  385. message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(soc) for soc in devices[project]]))
  386. if self.dest == 'board':
  387. project = getattr(namespace, 'project')
  388. soc = getattr(namespace, 'soc')
  389. if values is None:
  390. print(' '.join(board for board in sorted(devices[project][soc])))
  391. parser.exit()
  392. if values not in devices[project][soc].keys():
  393. message = "invalid choice: {0!r} (choose from {1})".format(values, ', '.join([repr(board) for board in devices[project][soc]]))
  394. if self.dest == 'value':
  395. project = getattr(namespace, 'project')
  396. soc = getattr(namespace, 'soc')
  397. board = getattr(namespace, 'board')
  398. if values is None:
  399. print(' '.join(value for value in sorted(devices[project][soc][board].keys())))
  400. parser.exit()
  401. if values not in devices[project][soc][board].keys():
  402. parser.exit()
  403. if message is not None:
  404. raise argparse.ArgumentError(self, message)
  405. setattr(namespace, self.dest, values)
  406. parser = argparse.ArgumentParser(description='Script to help with u-boot configuration')
  407. parser.add_argument('project', nargs='?', action=OptionsAction)
  408. parser.add_argument('soc', nargs='?', action=OptionsAction)
  409. parser.add_argument('board', nargs='?', action=OptionsAction)
  410. parser.add_argument('value', nargs='?', action=OptionsAction)
  411. options = parser.parse_args()
  412. print(devices[options.project][options.soc][options.board][options.value])
  413. parser.exit()