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.
 
 
 
 
 
 

386 lines
10 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2005 by Dominic Rath *
  3. * Dominic.Rath@gmx.de *
  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 "embeddedice.h"
  24. #include "armv4_5.h"
  25. #include "arm7_9_common.h"
  26. #include "log.h"
  27. #include "arm_jtag.h"
  28. #include "types.h"
  29. #include "binarybuffer.h"
  30. #include "target.h"
  31. #include "register.h"
  32. #include "jtag.h"
  33. #include <stdlib.h>
  34. bitfield_desc_t embeddedice_comms_ctrl_bitfield_desc[] =
  35. {
  36. {"R", 1},
  37. {"W", 1},
  38. {"reserved", 26},
  39. {"version", 4}
  40. };
  41. int embeddedice_reg_arch_info[] =
  42. {
  43. 0x0, 0x1, 0x4, 0x5,
  44. 0x8, 0x9, 0xa, 0xb, 0xc, 0xd,
  45. 0x10, 0x11, 0x12, 0x13, 0x14, 0x15,
  46. 0x2
  47. };
  48. char* embeddedice_reg_list[] =
  49. {
  50. "debug_ctrl",
  51. "debug_status",
  52. "comms_ctrl",
  53. "comms_data",
  54. "watch 0 addr value",
  55. "watch 0 addr mask",
  56. "watch 0 data value",
  57. "watch 0 data mask",
  58. "watch 0 control value",
  59. "watch 0 control mask",
  60. "watch 1 addr value",
  61. "watch 1 addr mask",
  62. "watch 1 data value",
  63. "watch 1 data mask",
  64. "watch 1 control value",
  65. "watch 1 control mask",
  66. "vector catch"
  67. };
  68. int embeddedice_reg_arch_type = -1;
  69. int embeddedice_get_reg(reg_t *reg);
  70. int embeddedice_set_reg(reg_t *reg, u32 value);
  71. int embeddedice_set_reg_w_exec(reg_t *reg, u8 *buf);
  72. int embeddedice_write_reg(reg_t *reg, u32 value);
  73. int embeddedice_read_reg(reg_t *reg);
  74. int embeddedice_jtag_error_handler(u8 *in_value, void *priv)
  75. {
  76. char *caller = priv;
  77. DEBUG("caller: %s", caller);
  78. return ERROR_OK;
  79. }
  80. reg_cache_t* embeddedice_build_reg_cache(target_t *target, arm7_9_common_t *arm7_9)
  81. {
  82. reg_cache_t *reg_cache = malloc(sizeof(reg_cache_t));
  83. reg_t *reg_list = NULL;
  84. embeddedice_reg_t *arch_info = NULL;
  85. arm_jtag_t *jtag_info = &arm7_9->jtag_info;
  86. int num_regs;
  87. int i;
  88. int eice_version = 0;
  89. /* register a register arch-type for EmbeddedICE registers only once */
  90. if (embeddedice_reg_arch_type == -1)
  91. embeddedice_reg_arch_type = register_reg_arch_type(embeddedice_get_reg, embeddedice_set_reg_w_exec);
  92. if (arm7_9->has_vector_catch)
  93. num_regs = 17;
  94. else
  95. num_regs = 16;
  96. /* the actual registers are kept in two arrays */
  97. reg_list = calloc(num_regs, sizeof(reg_t));
  98. arch_info = calloc(num_regs, sizeof(embeddedice_reg_t));
  99. /* fill in values for the reg cache */
  100. reg_cache->name = "EmbeddedICE registers";
  101. reg_cache->next = NULL;
  102. reg_cache->reg_list = reg_list;
  103. reg_cache->num_regs = num_regs;
  104. /* set up registers */
  105. for (i = 0; i < num_regs; i++)
  106. {
  107. reg_list[i].name = embeddedice_reg_list[i];
  108. reg_list[i].size = 32;
  109. reg_list[i].dirty = 0;
  110. reg_list[i].valid = 0;
  111. reg_list[i].bitfield_desc = NULL;
  112. reg_list[i].num_bitfields = 0;
  113. reg_list[i].value = calloc(1, 4);
  114. reg_list[i].arch_info = &arch_info[i];
  115. reg_list[i].arch_type = embeddedice_reg_arch_type;
  116. arch_info[i].addr = embeddedice_reg_arch_info[i];
  117. arch_info[i].jtag_info = jtag_info;
  118. }
  119. /* identify EmbeddedICE version by reading DCC control register */
  120. embeddedice_read_reg(&reg_list[EICE_COMMS_CTRL]);
  121. jtag_execute_queue();
  122. eice_version = buf_get_u32(reg_list[EICE_COMMS_CTRL].value, 28, 4);
  123. switch (eice_version)
  124. {
  125. case 1:
  126. reg_list[EICE_DBG_CTRL].size = 3;
  127. reg_list[EICE_DBG_STAT].size = 5;
  128. break;
  129. case 2:
  130. reg_list[EICE_DBG_CTRL].size = 4;
  131. reg_list[EICE_DBG_STAT].size = 5;
  132. arm7_9->has_single_step = 1;
  133. break;
  134. case 3:
  135. ERROR("EmbeddedICE version 3 detected, EmbeddedICE handling might be broken");
  136. reg_list[EICE_DBG_CTRL].size = 6;
  137. reg_list[EICE_DBG_STAT].size = 5;
  138. arm7_9->has_single_step = 1;
  139. arm7_9->has_monitor_mode = 1;
  140. break;
  141. case 4:
  142. reg_list[EICE_DBG_CTRL].size = 6;
  143. reg_list[EICE_DBG_STAT].size = 5;
  144. arm7_9->has_monitor_mode = 1;
  145. break;
  146. case 5:
  147. reg_list[EICE_DBG_CTRL].size = 6;
  148. reg_list[EICE_DBG_STAT].size = 5;
  149. arm7_9->has_single_step = 1;
  150. arm7_9->has_monitor_mode = 1;
  151. break;
  152. case 6:
  153. reg_list[EICE_DBG_CTRL].size = 6;
  154. reg_list[EICE_DBG_STAT].size = 10;
  155. arm7_9->has_monitor_mode = 1;
  156. break;
  157. case 7:
  158. WARNING("EmbeddedICE version 7 detected, EmbeddedICE handling might be broken");
  159. reg_list[EICE_DBG_CTRL].size = 6;
  160. reg_list[EICE_DBG_STAT].size = 5;
  161. arm7_9->has_monitor_mode = 1;
  162. break;
  163. default:
  164. ERROR("unknown EmbeddedICE version (comms ctrl: 0x%8.8x)", buf_get_u32(reg_list[EICE_COMMS_CTRL].value, 0, 32));
  165. }
  166. /* explicitly disable monitor mode */
  167. if (arm7_9->has_monitor_mode)
  168. {
  169. embeddedice_read_reg(&reg_list[EICE_DBG_CTRL]);
  170. jtag_execute_queue();
  171. buf_set_u32(reg_list[EICE_DBG_CTRL].value, 4, 1, 0);
  172. embeddedice_set_reg_w_exec(&reg_list[EICE_DBG_CTRL], reg_list[EICE_DBG_CTRL].value);
  173. }
  174. return reg_cache;
  175. }
  176. int embeddedice_get_reg(reg_t *reg)
  177. {
  178. if (embeddedice_read_reg(reg) != ERROR_OK)
  179. {
  180. ERROR("BUG: error scheduling EmbeddedICE register read");
  181. exit(-1);
  182. }
  183. if (jtag_execute_queue() != ERROR_OK)
  184. {
  185. ERROR("register read failed");
  186. }
  187. return ERROR_OK;
  188. }
  189. int embeddedice_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
  190. {
  191. embeddedice_reg_t *ice_reg = reg->arch_info;
  192. u8 reg_addr = ice_reg->addr & 0x1f;
  193. scan_field_t fields[3];
  194. error_handler_t error_handler;
  195. DEBUG("%i", ice_reg->addr);
  196. jtag_add_end_state(TAP_RTI);
  197. arm_jtag_scann(ice_reg->jtag_info, 0x2);
  198. error_handler.error_handler = embeddedice_jtag_error_handler;
  199. error_handler.error_handler_priv = "embeddedice_read_reg_w_check";
  200. arm_jtag_set_instr(ice_reg->jtag_info, ice_reg->jtag_info->intest_instr, &error_handler);
  201. fields[0].device = ice_reg->jtag_info->chain_pos;
  202. fields[0].num_bits = 32;
  203. fields[0].out_value = reg->value;
  204. fields[0].out_mask = NULL;
  205. fields[0].in_value = NULL;
  206. fields[0].in_check_value = NULL;
  207. fields[0].in_check_mask = NULL;
  208. fields[0].in_handler = NULL;
  209. fields[0].in_handler_priv = NULL;
  210. fields[1].device = ice_reg->jtag_info->chain_pos;
  211. fields[1].num_bits = 5;
  212. fields[1].out_value = malloc(1);
  213. buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
  214. fields[1].out_mask = NULL;
  215. fields[1].in_value = NULL;
  216. fields[1].in_check_value = NULL;
  217. fields[1].in_check_mask = NULL;
  218. fields[1].in_handler = NULL;
  219. fields[1].in_handler_priv = NULL;
  220. fields[2].device = ice_reg->jtag_info->chain_pos;
  221. fields[2].num_bits = 1;
  222. fields[2].out_value = malloc(1);
  223. buf_set_u32(fields[2].out_value, 0, 1, 0);
  224. fields[2].out_mask = NULL;
  225. fields[2].in_value = NULL;
  226. fields[2].in_check_value = NULL;
  227. fields[2].in_check_mask = NULL;
  228. fields[2].in_handler = NULL;
  229. fields[2].in_handler_priv = NULL;
  230. jtag_add_dr_scan(3, fields, -1, NULL);
  231. fields[0].in_value = reg->value;
  232. fields[0].in_check_value = check_value;
  233. fields[0].in_check_mask = check_mask;
  234. /* when reading the DCC data register, leaving the address field set to
  235. * EICE_COMMS_DATA would read the register twice
  236. * reading the control register is safe
  237. */
  238. buf_set_u32(fields[1].out_value, 0, 5, embeddedice_reg_arch_info[EICE_COMMS_CTRL]);
  239. jtag_add_dr_scan(3, fields, -1, NULL);
  240. free(fields[1].out_value);
  241. free(fields[2].out_value);
  242. return ERROR_OK;
  243. }
  244. int embeddedice_read_reg(reg_t *reg)
  245. {
  246. return embeddedice_read_reg_w_check(reg, NULL, NULL);
  247. }
  248. int embeddedice_set_reg(reg_t *reg, u32 value)
  249. {
  250. if (embeddedice_write_reg(reg, value) != ERROR_OK)
  251. {
  252. ERROR("BUG: error scheduling EmbeddedICE register write");
  253. exit(-1);
  254. }
  255. buf_set_u32(reg->value, 0, reg->size, value);
  256. reg->valid = 1;
  257. reg->dirty = 0;
  258. return ERROR_OK;
  259. }
  260. int embeddedice_set_reg_w_exec(reg_t *reg, u8 *buf)
  261. {
  262. embeddedice_set_reg(reg, buf_get_u32(buf, 0, reg->size));
  263. if (jtag_execute_queue() != ERROR_OK)
  264. {
  265. ERROR("register write failed");
  266. exit(-1);
  267. }
  268. return ERROR_OK;
  269. }
  270. int embeddedice_write_reg(reg_t *reg, u32 value)
  271. {
  272. embeddedice_reg_t *ice_reg = reg->arch_info;
  273. u8 reg_addr = ice_reg->addr & 0x1f;
  274. scan_field_t fields[3];
  275. error_handler_t error_handler;
  276. DEBUG("%i: 0x%8.8x", ice_reg->addr, value);
  277. jtag_add_end_state(TAP_RTI);
  278. arm_jtag_scann(ice_reg->jtag_info, 0x2);
  279. error_handler.error_handler = embeddedice_jtag_error_handler;
  280. error_handler.error_handler_priv = "embeddedice_write_reg";
  281. arm_jtag_set_instr(ice_reg->jtag_info, ice_reg->jtag_info->intest_instr, NULL);
  282. fields[0].device = ice_reg->jtag_info->chain_pos;
  283. fields[0].num_bits = 32;
  284. fields[0].out_value = malloc(4);
  285. buf_set_u32(fields[0].out_value, 0, 32, value);
  286. fields[0].out_mask = NULL;
  287. fields[0].in_value = NULL;
  288. fields[0].in_check_value = NULL;
  289. fields[0].in_check_mask = NULL;
  290. fields[0].in_handler = NULL;
  291. fields[0].in_handler_priv = NULL;
  292. fields[1].device = ice_reg->jtag_info->chain_pos;
  293. fields[1].num_bits = 5;
  294. fields[1].out_value = malloc(1);
  295. buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
  296. fields[1].out_mask = NULL;
  297. fields[1].in_value = NULL;
  298. fields[1].in_check_value = NULL;
  299. fields[1].in_check_mask = NULL;
  300. fields[1].in_handler = NULL;
  301. fields[1].in_handler_priv = NULL;
  302. fields[2].device = ice_reg->jtag_info->chain_pos;
  303. fields[2].num_bits = 1;
  304. fields[2].out_value = malloc(1);
  305. buf_set_u32(fields[2].out_value, 0, 1, 1);
  306. fields[2].out_mask = NULL;
  307. fields[2].in_value = NULL;
  308. fields[2].in_check_value = NULL;
  309. fields[2].in_check_mask = NULL;
  310. fields[2].in_handler = NULL;
  311. fields[2].in_handler_priv = NULL;
  312. jtag_add_dr_scan(3, fields, -1, NULL);
  313. free(fields[0].out_value);
  314. free(fields[1].out_value);
  315. free(fields[2].out_value);
  316. return ERROR_OK;
  317. }
  318. int embeddedice_store_reg(reg_t *reg)
  319. {
  320. return embeddedice_write_reg(reg, buf_get_u32(reg->value, 0, reg->size));
  321. }