stm32l4x.cfg 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. # SPDX-License-Identifier: GPL-2.0-or-later
  2. # script for stm32l4x family
  3. #
  4. # stm32l4 devices support both JTAG and SWD transports.
  5. #
  6. source [find target/swj-dp.tcl]
  7. source [find mem_helper.tcl]
  8. if { [info exists CHIPNAME] } {
  9. set _CHIPNAME $CHIPNAME
  10. } else {
  11. set _CHIPNAME stm32l4x
  12. }
  13. set _ENDIAN little
  14. # Work-area is a space in RAM used for flash programming
  15. # By default use 40kB (Available RAM in smallest device STM32L412)
  16. if { [info exists WORKAREASIZE] } {
  17. set _WORKAREASIZE $WORKAREASIZE
  18. } else {
  19. set _WORKAREASIZE 0xa000
  20. }
  21. #jtag scan chain
  22. if { [info exists CPUTAPID] } {
  23. set _CPUTAPID $CPUTAPID
  24. } else {
  25. if { [using_jtag] } {
  26. # See STM Document RM0351
  27. # Section 44.6.3 - corresponds to Cortex-M4 r0p1
  28. set _CPUTAPID 0x4ba00477
  29. } {
  30. set _CPUTAPID 0x2ba01477
  31. }
  32. }
  33. swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
  34. dap create $_CHIPNAME.dap -chain-position $_CHIPNAME.cpu
  35. if {[using_jtag]} {
  36. jtag newtap $_CHIPNAME bs -irlen 5
  37. }
  38. set _TARGETNAME $_CHIPNAME.cpu
  39. target create $_TARGETNAME cortex_m -endian $_ENDIAN -dap $_CHIPNAME.dap
  40. $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
  41. set _FLASHNAME $_CHIPNAME.flash
  42. flash bank $_FLASHNAME stm32l4x 0x08000000 0 0 0 $_TARGETNAME
  43. flash bank $_CHIPNAME.otp stm32l4x 0x1fff7000 0 0 0 $_TARGETNAME
  44. if { [info exists QUADSPI] && $QUADSPI } {
  45. set a [llength [flash list]]
  46. set _QSPINAME $_CHIPNAME.qspi
  47. flash bank $_QSPINAME stmqspi 0x90000000 0 0 0 $_TARGETNAME 0xA0001000
  48. } else {
  49. if { [info exists OCTOSPI1] && $OCTOSPI1 } {
  50. set a [llength [flash list]]
  51. set _OCTOSPINAME1 $_CHIPNAME.octospi1
  52. flash bank $_OCTOSPINAME1 stmqspi 0x90000000 0 0 0 $_TARGETNAME 0xA0001000
  53. }
  54. if { [info exists OCTOSPI2] && $OCTOSPI2 } {
  55. set b [llength [flash list]]
  56. set _OCTOSPINAME2 $_CHIPNAME.octospi2
  57. flash bank $_OCTOSPINAME2 stmqspi 0x70000000 0 0 0 $_TARGETNAME 0xA0001400
  58. }
  59. }
  60. # Common knowledges tells JTAG speed should be <= F_CPU/6.
  61. # F_CPU after reset is MSI 4MHz, so use F_JTAG = 500 kHz to stay on
  62. # the safe side.
  63. #
  64. # Note that there is a pretty wide band where things are
  65. # more or less stable, see http://openocd.zylin.com/#/c/3366/
  66. adapter speed 500
  67. adapter srst delay 100
  68. if {[using_jtag]} {
  69. jtag_ntrst_delay 100
  70. }
  71. reset_config srst_nogate
  72. if {![using_hla]} {
  73. # if srst is not fitted use SYSRESETREQ to
  74. # perform a soft reset
  75. cortex_m reset_config sysresetreq
  76. }
  77. $_TARGETNAME configure -event examine-end {
  78. # Enable debug during low power modes (uses more power)
  79. # DBGMCU_CR |= DBG_STANDBY | DBG_STOP | DBG_SLEEP
  80. mmw 0xE0042004 0x00000007 0
  81. # Stop watchdog counters during halt
  82. # DBGMCU_APB1_FZ |= DBG_IWDG_STOP | DBG_WWDG_STOP
  83. mmw 0xE0042008 0x00001800 0
  84. }
  85. tpiu create $_CHIPNAME.tpiu -dap $_CHIPNAME.dap -ap-num 0 -baseaddr 0xE0040000
  86. lappend _telnet_autocomplete_skip _proc_pre_enable_$_CHIPNAME.tpiu
  87. proc _proc_pre_enable_$_CHIPNAME.tpiu {_chipname} {
  88. targets $_chipname.cpu
  89. if { [$_chipname.tpiu cget -protocol] eq "sync" } {
  90. switch [$_chipname.tpiu cget -port-width] {
  91. 1 {
  92. # Set TRACE_IOEN; TRACE_MODE to sync 1 bit; GPIOE[2-3] to AF0
  93. mmw 0xE0042004 0x00000060 0x000000c0
  94. mmw 0x48001020 0x00000000 0x0000ff00
  95. mmw 0x48001000 0x000000a0 0x000000f0
  96. mmw 0x48001008 0x000000f0 0x00000000
  97. }
  98. 2 {
  99. # Set TRACE_IOEN; TRACE_MODE to sync 2 bit; GPIOE[2-4] to AF0
  100. mmw 0xE0042004 0x000000a0 0x000000c0
  101. mmw 0x48001020 0x00000000 0x000fff00
  102. mmw 0x48001000 0x000002a0 0x000003f0
  103. mmw 0x48001008 0x000003f0 0x00000000
  104. }
  105. 4 {
  106. # Set TRACE_IOEN; TRACE_MODE to sync 4 bit; GPIOE[2-6] to AF0
  107. mmw 0xE0042004 0x000000e0 0x000000c0
  108. mmw 0x48001020 0x00000000 0x0fffff00
  109. mmw 0x48001000 0x00002aa0 0x00003ff0
  110. mmw 0x48001008 0x00003ff0 0x00000000
  111. }
  112. }
  113. } else {
  114. # Set TRACE_IOEN; TRACE_MODE to async
  115. mmw 0xE0042004 0x00000020 0x000000c0
  116. }
  117. }
  118. $_CHIPNAME.tpiu configure -event pre-enable "_proc_pre_enable_$_CHIPNAME.tpiu $_CHIPNAME"
  119. $_TARGETNAME configure -event reset-init {
  120. # CPU comes out of reset with MSI_ON | MSI_RDY | MSI Range 6 (4 MHz).
  121. # Use MSI 24 MHz clock, compliant even with VOS == 2.
  122. # 3 WS compliant with VOS == 2 and 24 MHz.
  123. mww 0x40022000 0x00000103 ;# FLASH_ACR = PRFTBE | 3(Latency)
  124. mww 0x40021000 0x00000099 ;# RCC_CR = MSI_ON | MSIRGSEL | MSI Range 9
  125. # Boost JTAG frequency
  126. adapter speed 4000
  127. }
  128. $_TARGETNAME configure -event reset-start {
  129. # Reset clock is MSI (4 MHz)
  130. adapter speed 500
  131. }