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.
 
 
 
 
 
 

369 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. reg_cache_t* embeddedice_build_reg_cache(target_t *target, arm7_9_common_t *arm7_9)
  75. {
  76. reg_cache_t *reg_cache = malloc(sizeof(reg_cache_t));
  77. reg_t *reg_list = NULL;
  78. embeddedice_reg_t *arch_info = NULL;
  79. arm_jtag_t *jtag_info = &arm7_9->jtag_info;
  80. int num_regs;
  81. int i;
  82. int eice_version = 0;
  83. /* register a register arch-type for EmbeddedICE registers only once */
  84. if (embeddedice_reg_arch_type == -1)
  85. embeddedice_reg_arch_type = register_reg_arch_type(embeddedice_get_reg, embeddedice_set_reg_w_exec);
  86. if (arm7_9->has_vector_catch)
  87. num_regs = 17;
  88. else
  89. num_regs = 16;
  90. /* the actual registers are kept in two arrays */
  91. reg_list = calloc(num_regs, sizeof(reg_t));
  92. arch_info = calloc(num_regs, sizeof(embeddedice_reg_t));
  93. /* fill in values for the reg cache */
  94. reg_cache->name = "EmbeddedICE registers";
  95. reg_cache->next = NULL;
  96. reg_cache->reg_list = reg_list;
  97. reg_cache->num_regs = num_regs;
  98. /* set up registers */
  99. for (i = 0; i < num_regs; i++)
  100. {
  101. reg_list[i].name = embeddedice_reg_list[i];
  102. reg_list[i].size = 32;
  103. reg_list[i].dirty = 0;
  104. reg_list[i].valid = 0;
  105. reg_list[i].bitfield_desc = NULL;
  106. reg_list[i].num_bitfields = 0;
  107. reg_list[i].value = calloc(1, 4);
  108. reg_list[i].arch_info = &arch_info[i];
  109. reg_list[i].arch_type = embeddedice_reg_arch_type;
  110. arch_info[i].addr = embeddedice_reg_arch_info[i];
  111. arch_info[i].jtag_info = jtag_info;
  112. }
  113. /* identify EmbeddedICE version by reading DCC control register */
  114. embeddedice_read_reg(&reg_list[EICE_COMMS_CTRL]);
  115. jtag_execute_queue();
  116. eice_version = buf_get_u32(reg_list[EICE_COMMS_CTRL].value, 28, 4);
  117. switch (eice_version)
  118. {
  119. case 1:
  120. reg_list[EICE_DBG_CTRL].size = 3;
  121. reg_list[EICE_DBG_STAT].size = 5;
  122. break;
  123. case 2:
  124. reg_list[EICE_DBG_CTRL].size = 4;
  125. reg_list[EICE_DBG_STAT].size = 5;
  126. arm7_9->has_single_step = 1;
  127. break;
  128. case 3:
  129. ERROR("EmbeddedICE version 3 detected, EmbeddedICE handling might be broken");
  130. reg_list[EICE_DBG_CTRL].size = 6;
  131. reg_list[EICE_DBG_STAT].size = 5;
  132. arm7_9->has_single_step = 1;
  133. arm7_9->has_monitor_mode = 1;
  134. break;
  135. case 4:
  136. reg_list[EICE_DBG_CTRL].size = 6;
  137. reg_list[EICE_DBG_STAT].size = 5;
  138. arm7_9->has_monitor_mode = 1;
  139. break;
  140. case 5:
  141. reg_list[EICE_DBG_CTRL].size = 6;
  142. reg_list[EICE_DBG_STAT].size = 5;
  143. arm7_9->has_single_step = 1;
  144. arm7_9->has_monitor_mode = 1;
  145. break;
  146. case 6:
  147. reg_list[EICE_DBG_CTRL].size = 6;
  148. reg_list[EICE_DBG_STAT].size = 10;
  149. arm7_9->has_monitor_mode = 1;
  150. break;
  151. case 7:
  152. WARNING("EmbeddedICE version 7 detected, EmbeddedICE handling might be broken");
  153. reg_list[EICE_DBG_CTRL].size = 6;
  154. reg_list[EICE_DBG_STAT].size = 5;
  155. arm7_9->has_monitor_mode = 1;
  156. break;
  157. default:
  158. ERROR("unknown EmbeddedICE version (comms ctrl: 0x%8.8x)", buf_get_u32(reg_list[EICE_COMMS_CTRL].value, 0, 32));
  159. }
  160. /* explicitly disable monitor mode */
  161. if (arm7_9->has_monitor_mode)
  162. {
  163. embeddedice_read_reg(&reg_list[EICE_DBG_CTRL]);
  164. jtag_execute_queue();
  165. buf_set_u32(reg_list[EICE_DBG_CTRL].value, 4, 1, 0);
  166. embeddedice_set_reg_w_exec(&reg_list[EICE_DBG_CTRL], reg_list[EICE_DBG_CTRL].value);
  167. }
  168. return reg_cache;
  169. }
  170. int embeddedice_get_reg(reg_t *reg)
  171. {
  172. if (embeddedice_read_reg(reg) != ERROR_OK)
  173. {
  174. ERROR("BUG: error scheduling EmbeddedICE register read");
  175. exit(-1);
  176. }
  177. if (jtag_execute_queue() != ERROR_OK)
  178. {
  179. ERROR("register read failed");
  180. }
  181. return ERROR_OK;
  182. }
  183. int embeddedice_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask)
  184. {
  185. embeddedice_reg_t *ice_reg = reg->arch_info;
  186. u8 reg_addr = ice_reg->addr & 0x1f;
  187. scan_field_t fields[3];
  188. DEBUG("%i", ice_reg->addr);
  189. jtag_add_end_state(TAP_RTI);
  190. arm_jtag_scann(ice_reg->jtag_info, 0x2);
  191. arm_jtag_set_instr(ice_reg->jtag_info, ice_reg->jtag_info->intest_instr, NULL);
  192. fields[0].device = ice_reg->jtag_info->chain_pos;
  193. fields[0].num_bits = 32;
  194. fields[0].out_value = reg->value;
  195. fields[0].out_mask = NULL;
  196. fields[0].in_value = NULL;
  197. fields[0].in_check_value = NULL;
  198. fields[0].in_check_mask = NULL;
  199. fields[0].in_handler = NULL;
  200. fields[0].in_handler_priv = NULL;
  201. fields[1].device = ice_reg->jtag_info->chain_pos;
  202. fields[1].num_bits = 5;
  203. fields[1].out_value = malloc(1);
  204. buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
  205. fields[1].out_mask = NULL;
  206. fields[1].in_value = NULL;
  207. fields[1].in_check_value = NULL;
  208. fields[1].in_check_mask = NULL;
  209. fields[1].in_handler = NULL;
  210. fields[1].in_handler_priv = NULL;
  211. fields[2].device = ice_reg->jtag_info->chain_pos;
  212. fields[2].num_bits = 1;
  213. fields[2].out_value = malloc(1);
  214. buf_set_u32(fields[2].out_value, 0, 1, 0);
  215. fields[2].out_mask = NULL;
  216. fields[2].in_value = NULL;
  217. fields[2].in_check_value = NULL;
  218. fields[2].in_check_mask = NULL;
  219. fields[2].in_handler = NULL;
  220. fields[2].in_handler_priv = NULL;
  221. jtag_add_dr_scan(3, fields, -1, NULL);
  222. fields[0].in_value = reg->value;
  223. fields[0].in_check_value = check_value;
  224. fields[0].in_check_mask = check_mask;
  225. /* when reading the DCC data register, leaving the address field set to
  226. * EICE_COMMS_DATA would read the register twice
  227. * reading the control register is safe
  228. */
  229. buf_set_u32(fields[1].out_value, 0, 5, embeddedice_reg_arch_info[EICE_COMMS_CTRL]);
  230. jtag_add_dr_scan(3, fields, -1, NULL);
  231. free(fields[1].out_value);
  232. free(fields[2].out_value);
  233. return ERROR_OK;
  234. }
  235. int embeddedice_read_reg(reg_t *reg)
  236. {
  237. return embeddedice_read_reg_w_check(reg, NULL, NULL);
  238. }
  239. int embeddedice_set_reg(reg_t *reg, u32 value)
  240. {
  241. if (embeddedice_write_reg(reg, value) != ERROR_OK)
  242. {
  243. ERROR("BUG: error scheduling EmbeddedICE register write");
  244. exit(-1);
  245. }
  246. buf_set_u32(reg->value, 0, reg->size, value);
  247. reg->valid = 1;
  248. reg->dirty = 0;
  249. return ERROR_OK;
  250. }
  251. int embeddedice_set_reg_w_exec(reg_t *reg, u8 *buf)
  252. {
  253. embeddedice_set_reg(reg, buf_get_u32(buf, 0, reg->size));
  254. if (jtag_execute_queue() != ERROR_OK)
  255. {
  256. ERROR("register write failed");
  257. exit(-1);
  258. }
  259. return ERROR_OK;
  260. }
  261. int embeddedice_write_reg(reg_t *reg, u32 value)
  262. {
  263. embeddedice_reg_t *ice_reg = reg->arch_info;
  264. u8 reg_addr = ice_reg->addr & 0x1f;
  265. scan_field_t fields[3];
  266. DEBUG("%i: 0x%8.8x", ice_reg->addr, value);
  267. jtag_add_end_state(TAP_RTI);
  268. arm_jtag_scann(ice_reg->jtag_info, 0x2);
  269. arm_jtag_set_instr(ice_reg->jtag_info, ice_reg->jtag_info->intest_instr, NULL);
  270. fields[0].device = ice_reg->jtag_info->chain_pos;
  271. fields[0].num_bits = 32;
  272. fields[0].out_value = malloc(4);
  273. buf_set_u32(fields[0].out_value, 0, 32, value);
  274. fields[0].out_mask = NULL;
  275. fields[0].in_value = NULL;
  276. fields[0].in_check_value = NULL;
  277. fields[0].in_check_mask = NULL;
  278. fields[0].in_handler = NULL;
  279. fields[0].in_handler_priv = NULL;
  280. fields[1].device = ice_reg->jtag_info->chain_pos;
  281. fields[1].num_bits = 5;
  282. fields[1].out_value = malloc(1);
  283. buf_set_u32(fields[1].out_value, 0, 5, reg_addr);
  284. fields[1].out_mask = NULL;
  285. fields[1].in_value = NULL;
  286. fields[1].in_check_value = NULL;
  287. fields[1].in_check_mask = NULL;
  288. fields[1].in_handler = NULL;
  289. fields[1].in_handler_priv = NULL;
  290. fields[2].device = ice_reg->jtag_info->chain_pos;
  291. fields[2].num_bits = 1;
  292. fields[2].out_value = malloc(1);
  293. buf_set_u32(fields[2].out_value, 0, 1, 1);
  294. fields[2].out_mask = NULL;
  295. fields[2].in_value = NULL;
  296. fields[2].in_check_value = NULL;
  297. fields[2].in_check_mask = NULL;
  298. fields[2].in_handler = NULL;
  299. fields[2].in_handler_priv = NULL;
  300. jtag_add_dr_scan(3, fields, -1, NULL);
  301. free(fields[0].out_value);
  302. free(fields[1].out_value);
  303. free(fields[2].out_value);
  304. return ERROR_OK;
  305. }
  306. int embeddedice_store_reg(reg_t *reg)
  307. {
  308. return embeddedice_write_reg(reg, buf_get_u32(reg->value, 0, reg->size));
  309. }