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.
 
 
 
 
 
 

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