You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

493 lines
15 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2009 by Simon Qian *
  3. * SimonQian@SimonQian.com *
  4. * *
  5. * This program is free software; you can redistribute it and/or modify *
  6. * it under the terms of the GNU General Public License as published by *
  7. * the Free Software Foundation; either version 2 of the License, or *
  8. * (at your option) any later version. *
  9. * *
  10. * This program is distributed in the hope that it will be useful, *
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  13. * GNU General Public License for more details. *
  14. * *
  15. * You should have received a copy of the GNU General Public License *
  16. * along with this program; if not, write to the *
  17. * Free Software Foundation, Inc., *
  18. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  19. ***************************************************************************/
  20. #ifdef HAVE_CONFIG_H
  21. #include "config.h"
  22. #endif
  23. #include "avrf.h"
  24. #include "avrt.h"
  25. #include "flash.h"
  26. /* AVR_JTAG_Instructions */
  27. #define AVR_JTAG_INS_LEN 4
  28. // Public Instructions:
  29. #define AVR_JTAG_INS_EXTEST 0x00
  30. #define AVR_JTAG_INS_IDCODE 0x01
  31. #define AVR_JTAG_INS_SAMPLE_PRELOAD 0x02
  32. #define AVR_JTAG_INS_BYPASS 0x0F
  33. // AVR Specified Public Instructions:
  34. #define AVR_JTAG_INS_AVR_RESET 0x0C
  35. #define AVR_JTAG_INS_PROG_ENABLE 0x04
  36. #define AVR_JTAG_INS_PROG_COMMANDS 0x05
  37. #define AVR_JTAG_INS_PROG_PAGELOAD 0x06
  38. #define AVR_JTAG_INS_PROG_PAGEREAD 0x07
  39. // Data Registers:
  40. #define AVR_JTAG_REG_Bypass_Len 1
  41. #define AVR_JTAG_REG_DeviceID_Len 32
  42. #define AVR_JTAG_REG_Reset_Len 1
  43. #define AVR_JTAG_REG_JTAGID_Len 32
  44. #define AVR_JTAG_REG_ProgrammingEnable_Len 16
  45. #define AVR_JTAG_REG_ProgrammingCommand_Len 15
  46. #define AVR_JTAG_REG_FlashDataByte_Len 16
  47. avrf_type_t avft_chips_info[] =
  48. {
  49. // name, chip_id, flash_page_size, flash_page_num, eeprom_page_size, eeprom_page_num
  50. {"atmega128", 0x9702, 256, 512, 8, 512},
  51. };
  52. static int avrf_register_commands(struct command_context_s *cmd_ctx);
  53. static int avrf_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank);
  54. static int avrf_erase(struct flash_bank_s *bank, int first, int last);
  55. static int avrf_protect(struct flash_bank_s *bank, int set, int first, int last);
  56. static int avrf_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count);
  57. static int avrf_probe(struct flash_bank_s *bank);
  58. static int avrf_auto_probe(struct flash_bank_s *bank);
  59. //static int avrf_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  60. static int avrf_protect_check(struct flash_bank_s *bank);
  61. static int avrf_info(struct flash_bank_s *bank, char *buf, int buf_size);
  62. static int avrf_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
  63. extern int avr_jtag_sendinstr(jtag_tap_t *tap, uint8_t *ir_in, uint8_t ir_out);
  64. extern int avr_jtag_senddat(jtag_tap_t *tap, uint32_t *dr_in, uint32_t dr_out, int len);
  65. extern int mcu_write_ir(jtag_tap_t *tap, uint8_t *ir_in, uint8_t *ir_out, int ir_len, int rti);
  66. extern int mcu_write_dr(jtag_tap_t *tap, uint8_t *ir_in, uint8_t *ir_out, int dr_len, int rti);
  67. extern int mcu_write_ir_u8(jtag_tap_t *tap, uint8_t *ir_in, uint8_t ir_out, int ir_len, int rti);
  68. extern int mcu_write_dr_u8(jtag_tap_t *tap, uint8_t *ir_in, uint8_t ir_out, int dr_len, int rti);
  69. extern int mcu_write_ir_u16(jtag_tap_t *tap, uint16_t *ir_in, uint16_t ir_out, int ir_len, int rti);
  70. extern int mcu_write_dr_u16(jtag_tap_t *tap, uint16_t *ir_in, uint16_t ir_out, int dr_len, int rti);
  71. extern int mcu_write_ir_u32(jtag_tap_t *tap, uint32_t *ir_in, uint32_t ir_out, int ir_len, int rti);
  72. extern int mcu_write_dr_u32(jtag_tap_t *tap, uint32_t *ir_in, uint32_t ir_out, int dr_len, int rti);
  73. extern int mcu_execute_queue(void);
  74. flash_driver_t avr_flash =
  75. {
  76. .name = "avr",
  77. .register_commands = avrf_register_commands,
  78. .flash_bank_command = avrf_flash_bank_command,
  79. .erase = avrf_erase,
  80. .protect = avrf_protect,
  81. .write = avrf_write,
  82. .probe = avrf_probe,
  83. .auto_probe = avrf_auto_probe,
  84. .erase_check = default_flash_mem_blank_check,
  85. .protect_check = avrf_protect_check,
  86. .info = avrf_info
  87. };
  88. /* avr program functions */
  89. static int avr_jtag_reset(avr_common_t *avr, uint32_t reset)
  90. {
  91. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_AVR_RESET);
  92. avr_jtag_senddat(avr->jtag_info.tap, NULL, reset ,AVR_JTAG_REG_Reset_Len);
  93. return ERROR_OK;
  94. }
  95. static int avr_jtag_read_jtagid(avr_common_t *avr, uint32_t *id)
  96. {
  97. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_IDCODE);
  98. avr_jtag_senddat(avr->jtag_info.tap, id, 0, AVR_JTAG_REG_JTAGID_Len);
  99. return ERROR_OK;
  100. }
  101. static int avr_jtagprg_enterprogmode(avr_common_t *avr)
  102. {
  103. avr_jtag_reset(avr, 1);
  104. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_ENABLE);
  105. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0xA370, AVR_JTAG_REG_ProgrammingEnable_Len);
  106. return ERROR_OK;
  107. }
  108. static int avr_jtagprg_leaveprogmode(avr_common_t *avr)
  109. {
  110. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_COMMANDS);
  111. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x2300, AVR_JTAG_REG_ProgrammingCommand_Len);
  112. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3300, AVR_JTAG_REG_ProgrammingCommand_Len);
  113. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_ENABLE);
  114. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0, AVR_JTAG_REG_ProgrammingEnable_Len);
  115. avr_jtag_reset(avr, 0);
  116. return ERROR_OK;
  117. }
  118. static int avr_jtagprg_chiperase(avr_common_t *avr)
  119. {
  120. uint32_t poll_value;
  121. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_COMMANDS);
  122. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x2380, AVR_JTAG_REG_ProgrammingCommand_Len);
  123. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3180, AVR_JTAG_REG_ProgrammingCommand_Len);
  124. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3380, AVR_JTAG_REG_ProgrammingCommand_Len);
  125. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3380, AVR_JTAG_REG_ProgrammingCommand_Len);
  126. do {
  127. poll_value = 0;
  128. avr_jtag_senddat(avr->jtag_info.tap, &poll_value, 0x3380, AVR_JTAG_REG_ProgrammingCommand_Len);
  129. if (ERROR_OK != mcu_execute_queue())
  130. {
  131. return ERROR_FAIL;
  132. }
  133. LOG_DEBUG("poll_value = 0x%04" PRIx32 "", poll_value);
  134. } while (!(poll_value & 0x0200));
  135. return ERROR_OK;
  136. }
  137. static int avr_jtagprg_writeflashpage(avr_common_t *avr, uint8_t *page_buf, uint32_t buf_size, uint32_t addr, uint32_t page_size)
  138. {
  139. uint32_t i, poll_value;
  140. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_COMMANDS);
  141. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x2310, AVR_JTAG_REG_ProgrammingCommand_Len);
  142. // load addr high byte
  143. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x0700 | ((addr >> 9) & 0xFF), AVR_JTAG_REG_ProgrammingCommand_Len);
  144. // load addr low byte
  145. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x0300 | ((addr >> 1) & 0xFF), AVR_JTAG_REG_ProgrammingCommand_Len);
  146. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_PAGELOAD);
  147. for (i = 0; i < page_size; i++)
  148. {
  149. if (i < buf_size)
  150. {
  151. avr_jtag_senddat(avr->jtag_info.tap, NULL, page_buf[i], 8);
  152. }
  153. else
  154. {
  155. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0xFF, 8);
  156. }
  157. }
  158. avr_jtag_sendinstr(avr->jtag_info.tap, NULL, AVR_JTAG_INS_PROG_COMMANDS);
  159. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3700, AVR_JTAG_REG_ProgrammingCommand_Len);
  160. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3500, AVR_JTAG_REG_ProgrammingCommand_Len);
  161. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3700, AVR_JTAG_REG_ProgrammingCommand_Len);
  162. avr_jtag_senddat(avr->jtag_info.tap, NULL, 0x3700, AVR_JTAG_REG_ProgrammingCommand_Len);
  163. do {
  164. poll_value = 0;
  165. avr_jtag_senddat(avr->jtag_info.tap, &poll_value, 0x3700, AVR_JTAG_REG_ProgrammingCommand_Len);
  166. if (ERROR_OK != mcu_execute_queue())
  167. {
  168. return ERROR_FAIL;
  169. }
  170. LOG_DEBUG("poll_value = 0x%04" PRIx32 "", poll_value);
  171. } while (!(poll_value & 0x0200));
  172. return ERROR_OK;
  173. }
  174. /* interface command */
  175. static int avrf_register_commands(struct command_context_s *cmd_ctx)
  176. {
  177. command_t *avr_cmd = register_command(cmd_ctx, NULL, "avr", NULL, COMMAND_ANY, "avr flash specific commands");
  178. register_command(cmd_ctx, avr_cmd, "mass_erase", avrf_handle_mass_erase_command, COMMAND_EXEC,
  179. "mass erase device");
  180. return ERROR_OK;
  181. }
  182. static int avrf_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct flash_bank_s *bank)
  183. {
  184. avrf_flash_bank_t *avrf_info;
  185. if (argc < 6)
  186. {
  187. LOG_WARNING("incomplete flash_bank avr configuration");
  188. return ERROR_FLASH_BANK_INVALID;
  189. }
  190. avrf_info = malloc(sizeof(avrf_flash_bank_t));
  191. bank->driver_priv = avrf_info;
  192. avrf_info->probed = 0;
  193. return ERROR_OK;
  194. }
  195. static int avrf_erase(struct flash_bank_s *bank, int first, int last)
  196. {
  197. LOG_INFO("%s", __FUNCTION__);
  198. return ERROR_OK;
  199. }
  200. static int avrf_protect(struct flash_bank_s *bank, int set, int first, int last)
  201. {
  202. LOG_INFO("%s", __FUNCTION__);
  203. return ERROR_OK;
  204. }
  205. static int avrf_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t offset, uint32_t count)
  206. {
  207. target_t *target = bank->target;
  208. avr_common_t *avr = target->arch_info;
  209. uint32_t cur_size, cur_buffer_size, page_size;
  210. if (bank->target->state != TARGET_HALTED)
  211. {
  212. LOG_ERROR("Target not halted");
  213. return ERROR_TARGET_NOT_HALTED;
  214. }
  215. page_size = bank->sectors[0].size;
  216. if ((offset % page_size) != 0)
  217. {
  218. LOG_WARNING("offset 0x%" PRIx32 " breaks required %" PRIu32 "-byte alignment", offset, page_size);
  219. return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
  220. }
  221. LOG_DEBUG("offset is 0x%08" PRIx32 "", offset);
  222. LOG_DEBUG("count is %" PRId32 "", count);
  223. if (ERROR_OK != avr_jtagprg_enterprogmode(avr))
  224. {
  225. return ERROR_FAIL;
  226. }
  227. cur_size = 0;
  228. while (count > 0)
  229. {
  230. if (count > page_size)
  231. {
  232. cur_buffer_size = page_size;
  233. }
  234. else
  235. {
  236. cur_buffer_size = count;
  237. }
  238. avr_jtagprg_writeflashpage(avr, buffer + cur_size, cur_buffer_size, offset + cur_size, page_size);
  239. count -= cur_buffer_size;
  240. cur_size += cur_buffer_size;
  241. keep_alive();
  242. }
  243. return avr_jtagprg_leaveprogmode(avr);
  244. }
  245. #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
  246. #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
  247. #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
  248. static int avrf_probe(struct flash_bank_s *bank)
  249. {
  250. target_t *target = bank->target;
  251. avrf_flash_bank_t *avrf_info = bank->driver_priv;
  252. avr_common_t *avr = target->arch_info;
  253. avrf_type_t *avr_info = NULL;
  254. int i;
  255. uint32_t device_id;
  256. if (bank->target->state != TARGET_HALTED)
  257. {
  258. LOG_ERROR("Target not halted");
  259. return ERROR_TARGET_NOT_HALTED;
  260. }
  261. avrf_info->probed = 0;
  262. avr_jtag_read_jtagid(avr, &device_id);
  263. if (ERROR_OK != mcu_execute_queue())
  264. {
  265. return ERROR_FAIL;
  266. }
  267. LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
  268. if (EXTRACT_MFG(device_id) != 0x1F)
  269. {
  270. LOG_ERROR("0x%" PRIx32 " is invalid Manufacturer for avr, 0x%X is expected", EXTRACT_MFG(device_id), 0x1F);
  271. }
  272. for (i = 0; i < (int)(sizeof(avft_chips_info) / sizeof(avft_chips_info[0])); i++)
  273. {
  274. if (avft_chips_info[i].chip_id == EXTRACT_PART(device_id))
  275. {
  276. avr_info = &avft_chips_info[i];
  277. LOG_INFO("target device is %s", avr_info->name);
  278. break;
  279. }
  280. }
  281. if (avr_info != NULL)
  282. {
  283. // chip found
  284. bank->base = 0x00000000;
  285. bank->size = (avr_info->flash_page_size * avr_info->flash_page_num);
  286. bank->num_sectors = avr_info->flash_page_num;
  287. bank->sectors = malloc(sizeof(flash_sector_t) * avr_info->flash_page_num);
  288. for (i = 0; i < avr_info->flash_page_num; i++)
  289. {
  290. bank->sectors[i].offset = i * avr_info->flash_page_size;
  291. bank->sectors[i].size = avr_info->flash_page_size;
  292. bank->sectors[i].is_erased = -1;
  293. bank->sectors[i].is_protected = 1;
  294. }
  295. avrf_info->probed = 1;
  296. return ERROR_OK;
  297. }
  298. else
  299. {
  300. // chip not supported
  301. LOG_ERROR("0x%" PRIx32 " is not support for avr", EXTRACT_PART(device_id));
  302. avrf_info->probed = 1;
  303. return ERROR_FAIL;
  304. }
  305. }
  306. static int avrf_auto_probe(struct flash_bank_s *bank)
  307. {
  308. avrf_flash_bank_t *avrf_info = bank->driver_priv;
  309. if (avrf_info->probed)
  310. return ERROR_OK;
  311. return avrf_probe(bank);
  312. }
  313. static int avrf_protect_check(struct flash_bank_s *bank)
  314. {
  315. LOG_INFO("%s", __FUNCTION__);
  316. return ERROR_OK;
  317. }
  318. static int avrf_info(struct flash_bank_s *bank, char *buf, int buf_size)
  319. {
  320. target_t *target = bank->target;
  321. avr_common_t *avr = target->arch_info;
  322. avrf_type_t *avr_info = NULL;
  323. int i;
  324. uint32_t device_id;
  325. if (bank->target->state != TARGET_HALTED)
  326. {
  327. LOG_ERROR("Target not halted");
  328. return ERROR_TARGET_NOT_HALTED;
  329. }
  330. avr_jtag_read_jtagid(avr, &device_id);
  331. if (ERROR_OK != mcu_execute_queue())
  332. {
  333. return ERROR_FAIL;
  334. }
  335. LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
  336. if (EXTRACT_MFG(device_id) != 0x1F)
  337. {
  338. LOG_ERROR("0x%" PRIx32 " is invalid Manufacturer for avr, 0x%X is expected", EXTRACT_MFG(device_id), 0x1F);
  339. }
  340. for (i = 0; i < (int)(sizeof(avft_chips_info) / sizeof(avft_chips_info[0])); i++)
  341. {
  342. if (avft_chips_info[i].chip_id == EXTRACT_PART(device_id))
  343. {
  344. avr_info = &avft_chips_info[i];
  345. LOG_INFO("target device is %s", avr_info->name);
  346. break;
  347. }
  348. }
  349. if (avr_info != NULL)
  350. {
  351. // chip found
  352. snprintf(buf, buf_size, "%s - Rev: 0x%" PRIx32 "", avr_info->name, EXTRACT_VER(device_id));
  353. return ERROR_OK;
  354. }
  355. else
  356. {
  357. // chip not supported
  358. snprintf(buf, buf_size, "Cannot identify target as a avr\n");
  359. return ERROR_FLASH_OPERATION_FAILED;
  360. }
  361. }
  362. static int avrf_mass_erase(struct flash_bank_s *bank)
  363. {
  364. target_t *target = bank->target;
  365. avr_common_t *avr = target->arch_info;
  366. if (target->state != TARGET_HALTED)
  367. {
  368. LOG_ERROR("Target not halted");
  369. return ERROR_TARGET_NOT_HALTED;
  370. }
  371. if ((ERROR_OK != avr_jtagprg_enterprogmode(avr))
  372. || (ERROR_OK != avr_jtagprg_chiperase(avr))
  373. || (ERROR_OK != avr_jtagprg_leaveprogmode(avr)))
  374. {
  375. return ERROR_FAIL;
  376. }
  377. return ERROR_OK;
  378. }
  379. static int avrf_handle_mass_erase_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
  380. {
  381. flash_bank_t *bank;
  382. int i;
  383. if (argc < 1)
  384. {
  385. command_print(cmd_ctx, "avr mass_erase <bank>");
  386. return ERROR_OK;
  387. }
  388. bank = get_flash_bank_by_num(strtoul(args[0], NULL, 0));
  389. if (!bank)
  390. {
  391. command_print(cmd_ctx, "flash bank '#%s' is out of bounds", args[0]);
  392. return ERROR_OK;
  393. }
  394. if (avrf_mass_erase(bank) == ERROR_OK)
  395. {
  396. /* set all sectors as erased */
  397. for (i = 0; i < bank->num_sectors; i++)
  398. {
  399. bank->sectors[i].is_erased = 1;
  400. }
  401. command_print(cmd_ctx, "avr mass erase complete");
  402. }
  403. else
  404. {
  405. command_print(cmd_ctx, "avr mass erase failed");
  406. }
  407. LOG_DEBUG("%s", __FUNCTION__);
  408. return ERROR_OK;
  409. }