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.
 
 
 
 
 
 

134 lines
3.5 KiB

  1. # MEMORY
  2. #
  3. # All Memory regions have two components.
  4. # (1) A count of regions, in the form N_NAME
  5. # (2) An array within info about each region.
  6. #
  7. # The ARRAY
  8. #
  9. # <NAME>( RegionNumber , ATTRIBUTE )
  10. #
  11. # Where <NAME> is one of:
  12. #
  13. # N_FLASH & FLASH (internal memory)
  14. # N_RAM & RAM (internal memory)
  15. # N_MMREGS & MMREGS (for memory mapped registers)
  16. # N_XMEM & XMEM (off chip memory, ie: flash on cs0, sdram on cs2)
  17. # or N_UNKNOWN & UNKNOWN for things that do not exist.
  18. #
  19. # We have 1 unknown region.
  20. set N_UNKNOWN 1
  21. # All MEMORY regions must have these attributes
  22. # CS - chip select (if internal, use -1)
  23. set UNKNOWN(0,CHIPSELECT) -1
  24. # BASE - base address in memory
  25. set UNKNOWN(0,BASE) 0
  26. # LEN - length in bytes
  27. set UNKNOWN(0,LEN) $CPU_MAX_ADDRESS
  28. # HUMAN - human name of the region
  29. set UNKNOWN(0,HUMAN) "unknown"
  30. # TYPE - one of:
  31. # flash, ram, mmr, unknown
  32. # For harvard arch:
  33. # iflash, dflash, iram, dram
  34. set UNKNOWN(0,TYPE) "unknown"
  35. # RWX - access ablity
  36. # unix style chmod bits
  37. # 0 - no access
  38. # 1 - execute
  39. # 2 - write
  40. # 4 - read
  41. # hence: 7 - readwrite execute
  42. set RWX_NO_ACCESS 0
  43. set RWX_X_ONLY $BIT0
  44. set RWX_W_ONLY $BIT1
  45. set RWX_R_ONLY $BIT2
  46. set RWX_RW [expr $RWX_R_ONLY + $RWX_W_ONLY]
  47. set RWX_R_X [expr $RWX_R_ONLY + $RWX_X_ONLY]
  48. set RWX_RWX [expr $RWX_R_ONLY + $RWX_W_ONLY + $RWX_X_ONLY]
  49. set UNKNOWN(0,RWX) $RWX_NO_ACCESS
  50. # WIDTH - access width
  51. # 8,16,32 [0 means ANY]
  52. set ACCESS_WIDTH_NONE 0
  53. set ACCESS_WIDTH_8 $BIT0
  54. set ACCESS_WIDTH_16 $BIT1
  55. set ACCESS_WIDTH_32 $BIT2
  56. set ACCESS_WIDTH_ANY [expr $ACCESS_WIDTH_8 + $ACCESS_WIDTH_16 + $ACCESS_WIDTH_32]
  57. set UNKNOWN(0,ACCESS_WIDTH) $ACCESS_WIDTH_NONE
  58. proc iswithin { ADDRESS BASE LEN } {
  59. return [expr ((($ADDRESS - $BASE) > 0) && (($ADDRESS - $BASE + $LEN) > 0))]
  60. }
  61. proc address_info { ADDRESS } {
  62. foreach WHERE { FLASH RAM MMREGS XMEM UNKNOWN } {
  63. if { info exists $WHERE } {
  64. set lmt [set N_[set WHERE]]
  65. for { set region 0 } { $region < $lmt } { incr region } {
  66. if { iswithin $ADDRESS $WHERE($region,BASE) $WHERE($region,LEN) } {
  67. return "$WHERE $region";
  68. }
  69. }
  70. }
  71. }
  72. # Return the 'unknown'
  73. return "UNKNOWN 0"
  74. }
  75. proc memread32 {ADDR} {
  76. set foo(0) 0
  77. if ![ catch { ocd_mem2array foo 32 $ADDR 1 } msg ] {
  78. return $foo(0)
  79. } else {
  80. error "memread32: $msg"
  81. }
  82. }
  83. proc memread16 {ADDR} {
  84. set foo(0) 0
  85. if ![ catch { ocd_mem2array foo 16 $ADDR 1 } msg ] {
  86. return $foo(0)
  87. } else {
  88. error "memread16: $msg"
  89. }
  90. }
  91. proc memread8 {ADDR} {
  92. set foo(0) 0
  93. if ![ catch { ocd_mem2array foo 8 $ADDR 1 } msg ] {
  94. return $foo(0)
  95. } else {
  96. error "memread8: $msg"
  97. }
  98. }
  99. proc memwrite32 {ADDR DATA} {
  100. set foo(0) $DATA
  101. if ![ catch { ocd_array2mem foo 32 $ADDR 1 } msg ] {
  102. return $foo(0)
  103. } else {
  104. error "memwrite32: $msg"
  105. }
  106. }
  107. proc memwrite16 {ADDR DATA} {
  108. set foo(0) $DATA
  109. if ![ catch { ocd_array2mem foo 16 $ADDR 1 } msg ] {
  110. return $foo(0)
  111. } else {
  112. error "memwrite16: $msg"
  113. }
  114. }
  115. proc memwrite8 {ADDR DATA} {
  116. set foo(0) $DATA
  117. if ![ catch { ocd_array2mem foo 8 $ADDR 1 } msg ] {
  118. return $foo(0)
  119. } else {
  120. error "memwrite8: $msg"
  121. }
  122. }