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.
 
 
 
 
 
 

320 lines
7.4 KiB

  1. /***************************************************************************
  2. * Copyright (C) 2010 by Oleksandr Tymoshenko <gonzo@bluezbox.com> *
  3. * *
  4. * This program is free software; you can redistribute it and/or modify *
  5. * it under the terms of the GNU General Public License as published by *
  6. * the Free Software Foundation; either version 2 of the License, or *
  7. * (at your option) any later version. *
  8. * *
  9. * This program is distributed in the hope that it will be useful, *
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  12. * GNU General Public License for more details. *
  13. * *
  14. * You should have received a copy of the GNU General Public License *
  15. * along with this program; if not, write to the *
  16. * Free Software Foundation, Inc., *
  17. * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
  18. ***************************************************************************/
  19. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include "target.h"
  23. #include "jtag/jtag.h"
  24. #include "avr32_jtag.h"
  25. #include "avr32_mem.h"
  26. int avr32_jtag_read_memory32(struct avr32_jtag *jtag_info,
  27. uint32_t addr, int count, uint32_t *buffer)
  28. {
  29. int i, retval;
  30. uint32_t data;
  31. for (i = 0; i < count; i++) {
  32. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  33. addr + i*4, &data);
  34. if (retval != ERROR_OK)
  35. return retval;
  36. /* XXX: Assume AVR32 is BE */
  37. buffer[i] = be_to_h_u32((uint8_t *)&data);
  38. }
  39. return ERROR_OK;
  40. }
  41. int avr32_jtag_read_memory16(struct avr32_jtag *jtag_info,
  42. uint32_t addr, int count, uint16_t *buffer)
  43. {
  44. int i, retval;
  45. uint32_t data;
  46. i = 0;
  47. /* any unaligned half-words? */
  48. if (addr & 3) {
  49. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  50. addr + i*2, &data);
  51. if (retval != ERROR_OK)
  52. return retval;
  53. /* XXX: Assume AVR32 is BE */
  54. data = be_to_h_u32((uint8_t *)&data);
  55. buffer[i] = (data >> 16) & 0xffff;
  56. i++;
  57. }
  58. /* read all complete words */
  59. for (; i < (count & ~1); i += 2) {
  60. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  61. addr + i*2, &data);
  62. if (retval != ERROR_OK)
  63. return retval;
  64. /* XXX: Assume AVR32 is BE */
  65. data = be_to_h_u32((uint8_t *)&data);
  66. buffer[i] = data & 0xffff;
  67. buffer[i+1] = (data >> 16) & 0xffff;
  68. }
  69. /* last halfword */
  70. if (i < count) {
  71. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  72. addr + i*2, &data);
  73. if (retval != ERROR_OK)
  74. return retval;
  75. /* XXX: Assume AVR32 is BE */
  76. data = be_to_h_u32((uint8_t *)&data);
  77. buffer[i] = data & 0xffff;
  78. }
  79. return ERROR_OK;
  80. }
  81. int avr32_jtag_read_memory8(struct avr32_jtag *jtag_info,
  82. uint32_t addr, int count, uint8_t *buffer)
  83. {
  84. int i, j, retval;
  85. uint8_t data[4];
  86. i = 0;
  87. /* Do we have non-aligned bytes? */
  88. if (addr & 3) {
  89. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  90. addr + i, (uint32_t *)(void *)data);
  91. if (retval != ERROR_OK)
  92. return retval;
  93. for (j = addr & 3; (j < 4) && (i < count); j++, i++)
  94. buffer[i] = data[3-j];
  95. }
  96. /* read all complete words */
  97. for (; i < (count & ~3); i += 4) {
  98. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  99. addr + i, (uint32_t *)(void *)data);
  100. if (retval != ERROR_OK)
  101. return retval;
  102. for (j = 0; j < 4; j++)
  103. buffer[i+j] = data[3-j];
  104. }
  105. /* remaining bytes */
  106. if (i < count) {
  107. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  108. addr + i, (uint32_t *)(void *)data);
  109. if (retval != ERROR_OK)
  110. return retval;
  111. for (j = 0; i + j < count; j++)
  112. buffer[i+j] = data[3-j];
  113. }
  114. return ERROR_OK;
  115. }
  116. int avr32_jtag_write_memory32(struct avr32_jtag *jtag_info,
  117. uint32_t addr, int count, const uint32_t *buffer)
  118. {
  119. int i, retval;
  120. uint32_t data;
  121. for (i = 0; i < count; i++) {
  122. /* XXX: Assume AVR32 is BE */
  123. h_u32_to_be((uint8_t *)&data, buffer[i]);
  124. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  125. addr + i*4, data);
  126. if (retval != ERROR_OK)
  127. return retval;
  128. }
  129. return ERROR_OK;
  130. }
  131. int avr32_jtag_write_memory16(struct avr32_jtag *jtag_info,
  132. uint32_t addr, int count, const uint16_t *buffer)
  133. {
  134. int i, retval;
  135. uint32_t data;
  136. uint32_t data_out;
  137. i = 0;
  138. /*
  139. * Do we have any non-aligned half-words?
  140. */
  141. if (addr & 3) {
  142. /*
  143. * mwa_read will read whole world, no nead to fiddle
  144. * with address. It will be truncated in set_addr
  145. */
  146. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  147. addr, &data);
  148. if (retval != ERROR_OK)
  149. return retval;
  150. data = be_to_h_u32((uint8_t *)&data);
  151. data = (buffer[i] << 16) | (data & 0xffff);
  152. h_u32_to_be((uint8_t *)&data_out, data);
  153. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  154. addr, data_out);
  155. if (retval != ERROR_OK)
  156. return retval;
  157. i++;
  158. }
  159. /* write all complete words */
  160. for (; i < (count & ~1); i += 2) {
  161. /* XXX: Assume AVR32 is BE */
  162. data = (buffer[i+1] << 16) | buffer[i];
  163. h_u32_to_be((uint8_t *)&data_out, data);
  164. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  165. addr + i*2, data_out);
  166. if (retval != ERROR_OK)
  167. return retval;
  168. }
  169. /* last halfword */
  170. if (i < count) {
  171. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  172. addr + i*2, &data);
  173. if (retval != ERROR_OK)
  174. return retval;
  175. data = be_to_h_u32((uint8_t *)&data);
  176. data &= ~0xffff;
  177. data |= buffer[i];
  178. h_u32_to_be((uint8_t *)&data_out, data);
  179. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  180. addr + i*2, data_out);
  181. if (retval != ERROR_OK)
  182. return retval;
  183. }
  184. return ERROR_OK;
  185. }
  186. int avr32_jtag_write_memory8(struct avr32_jtag *jtag_info,
  187. uint32_t addr, int count, const uint8_t *buffer)
  188. {
  189. int i, j, retval;
  190. uint32_t data;
  191. uint32_t data_out;
  192. i = 0;
  193. /*
  194. * Do we have any non-aligned bytes?
  195. */
  196. if (addr & 3) {
  197. /*
  198. * mwa_read will read whole world, no nead to fiddle
  199. * with address. It will be truncated in set_addr
  200. */
  201. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  202. addr, &data);
  203. if (retval != ERROR_OK)
  204. return retval;
  205. data = be_to_h_u32((uint8_t *)&data);
  206. for (j = addr & 3; (j < 4) && (i < count); j++, i++) {
  207. data &= ~(0xff << j*8);
  208. data |= (buffer[i] << j*8);
  209. }
  210. h_u32_to_be((uint8_t *)&data_out, data);
  211. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  212. addr, data_out);
  213. if (retval != ERROR_OK)
  214. return retval;
  215. }
  216. /* write all complete words */
  217. for (; i < (count & ~3); i += 4) {
  218. data = 0;
  219. for (j = 0; j < 4; j++)
  220. data |= (buffer[j+i] << j*8);
  221. h_u32_to_be((uint8_t *)&data_out, data);
  222. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  223. addr + i, data_out);
  224. if (retval != ERROR_OK)
  225. return retval;
  226. }
  227. /*
  228. * Write trailing bytes
  229. */
  230. if (i < count) {
  231. retval = avr32_jtag_mwa_read(jtag_info, SLAVE_HSB_UNCACHED,
  232. addr + i, &data);
  233. if (retval != ERROR_OK)
  234. return retval;
  235. data = be_to_h_u32((uint8_t *)&data);
  236. for (j = 0; i < count; j++, i++) {
  237. data &= ~(0xff << j*8);
  238. data |= (buffer[j+i] << j*8);
  239. }
  240. h_u32_to_be((uint8_t *)&data_out, data);
  241. retval = avr32_jtag_mwa_write(jtag_info, SLAVE_HSB_UNCACHED,
  242. addr+i, data_out);
  243. if (retval != ERROR_OK)
  244. return retval;
  245. }
  246. return ERROR_OK;
  247. }