soc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. /*
  2. * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #pragma once
  7. #ifndef __ASSEMBLER__
  8. #include <stdint.h>
  9. #include "esp_assert.h"
  10. #endif
  11. #include "esp_bit_defs.h"
  12. #include "reg_base.h"
  13. #define PRO_CPU_NUM (0)
  14. #define SOC_MAX_CONTIGUOUS_RAM_SIZE (SOC_EXTRAM_DATA_HIGH - SOC_EXTRAM_DATA_LOW) ///< Largest span of contiguous memory (DRAM or IRAM) in the address space
  15. #define REG_UHCI_BASE(i) (DR_REG_UHCI0_BASE)
  16. #define REG_UART_BASE( i ) (DR_REG_UART_BASE + (i) * 0x10000 )
  17. #define REG_UART_AHB_BASE(i) (0x60000000 + (i) * 0x10000 )
  18. #define UART_FIFO_AHB_REG(i) (REG_UART_AHB_BASE(i) + 0x0)
  19. #define REG_I2S_BASE( i ) (DR_REG_I2S_BASE)
  20. #define REG_TIMG_BASE(i) (DR_REG_TIMERGROUP0_BASE + (i)*0x1000)
  21. #define REG_SPI_MEM_BASE(i) (DR_REG_SPI0_BASE - (i) * 0x1000)
  22. #define REG_I2C_BASE(i) (DR_REG_I2C_EXT_BASE + (i) * 0x14000 )
  23. //Convenient way to replace the register ops when ulp riscv projects
  24. //consume this file
  25. #ifndef ULP_RISCV_REGISTER_OPS
  26. //Registers Operation {{
  27. #define ETS_UNCACHED_ADDR(addr) (addr)
  28. #define ETS_CACHED_ADDR(addr) (addr)
  29. #ifndef __ASSEMBLER__
  30. //write value to register
  31. #define REG_WRITE(_r, _v) do { \
  32. (*(volatile uint32_t *)(_r)) = (_v); \
  33. } while(0)
  34. //read value from register
  35. #define REG_READ(_r) ({ \
  36. (*(volatile uint32_t *)(_r)); \
  37. })
  38. //get bit or get bits from register
  39. #define REG_GET_BIT(_r, _b) ({ \
  40. (*(volatile uint32_t*)(_r) & (_b)); \
  41. })
  42. //set bit or set bits to register
  43. #define REG_SET_BIT(_r, _b) do { \
  44. *(volatile uint32_t*)(_r) = (*(volatile uint32_t*)(_r)) | (_b); \
  45. } while(0)
  46. //clear bit or clear bits of register
  47. #define REG_CLR_BIT(_r, _b) do { \
  48. *(volatile uint32_t*)(_r) = (*(volatile uint32_t*)(_r)) & (~(_b)); \
  49. } while(0)
  50. //set bits of register controlled by mask
  51. #define REG_SET_BITS(_r, _b, _m) do { \
  52. *(volatile uint32_t*)(_r) = (*(volatile uint32_t*)(_r) & ~(_m)) | ((_b) & (_m)); \
  53. } while(0)
  54. //get field from register, uses field _S & _V to determine mask
  55. #define REG_GET_FIELD(_r, _f) ({ \
  56. ((REG_READ(_r) >> (_f##_S)) & (_f##_V)); \
  57. })
  58. //set field of a register from variable, uses field _S & _V to determine mask
  59. #define REG_SET_FIELD(_r, _f, _v) do { \
  60. REG_WRITE((_r),((REG_READ(_r) & ~((_f##_V) << (_f##_S)))|(((_v) & (_f##_V))<<(_f##_S)))); \
  61. } while(0)
  62. //get field value from a variable, used when _f is not left shifted by _f##_S
  63. #define VALUE_GET_FIELD(_r, _f) (((_r) >> (_f##_S)) & (_f))
  64. //get field value from a variable, used when _f is left shifted by _f##_S
  65. #define VALUE_GET_FIELD2(_r, _f) (((_r) & (_f))>> (_f##_S))
  66. //set field value to a variable, used when _f is not left shifted by _f##_S
  67. #define VALUE_SET_FIELD(_r, _f, _v) ((_r)=(((_r) & ~((_f) << (_f##_S)))|((_v)<<(_f##_S))))
  68. //set field value to a variable, used when _f is left shifted by _f##_S
  69. #define VALUE_SET_FIELD2(_r, _f, _v) ((_r)=(((_r) & ~(_f))|((_v)<<(_f##_S))))
  70. //generate a value from a field value, used when _f is not left shifted by _f##_S
  71. #define FIELD_TO_VALUE(_f, _v) (((_v)&(_f))<<_f##_S)
  72. //generate a value from a field value, used when _f is left shifted by _f##_S
  73. #define FIELD_TO_VALUE2(_f, _v) (((_v)<<_f##_S) & (_f))
  74. //read value from register
  75. #define READ_PERI_REG(addr) ({ \
  76. (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))); \
  77. })
  78. //write value to register
  79. #define WRITE_PERI_REG(addr, val) do { \
  80. (*((volatile uint32_t *)ETS_UNCACHED_ADDR(addr))) = (uint32_t)(val); \
  81. } while(0)
  82. //clear bits of register controlled by mask
  83. #define CLEAR_PERI_REG_MASK(reg, mask) do { \
  84. WRITE_PERI_REG((reg), (READ_PERI_REG(reg)&(~(mask)))); \
  85. } while(0)
  86. //set bits of register controlled by mask
  87. #define SET_PERI_REG_MASK(reg, mask) do { \
  88. WRITE_PERI_REG((reg), (READ_PERI_REG(reg)|(mask))); \
  89. } while(0)
  90. //get bits of register controlled by mask
  91. #define GET_PERI_REG_MASK(reg, mask) ({ \
  92. (READ_PERI_REG(reg) & (mask)); \
  93. })
  94. //get bits of register controlled by highest bit and lowest bit
  95. #define GET_PERI_REG_BITS(reg, hipos,lowpos) ({ \
  96. ((READ_PERI_REG(reg)>>(lowpos))&((1<<((hipos)-(lowpos)+1))-1)); \
  97. })
  98. //set bits of register controlled by mask and shift
  99. #define SET_PERI_REG_BITS(reg,bit_map,value,shift) do { \
  100. WRITE_PERI_REG((reg),(READ_PERI_REG(reg)&(~((bit_map)<<(shift))))|(((value) & (bit_map))<<(shift)) ); \
  101. } while(0)
  102. //get field of register
  103. #define GET_PERI_REG_BITS2(reg, mask,shift) ({ \
  104. ((READ_PERI_REG(reg)>>(shift))&(mask)); \
  105. })
  106. #endif /* !__ASSEMBLER__ */
  107. //}}
  108. #endif /* !ULP_RISCV_REGISTER_OPS */
  109. //Periheral Clock {{
  110. #define APB_CLK_FREQ_ROM ( 40*1000000 )
  111. #define CPU_CLK_FREQ_ROM APB_CLK_FREQ_ROM
  112. #define CPU_CLK_FREQ APB_CLK_FREQ
  113. #define APB_CLK_FREQ ( 80*1000000 ) //unit: Hz
  114. #define REF_CLK_FREQ ( 1000000 )
  115. #define UART_CLK_FREQ APB_CLK_FREQ
  116. #define WDT_CLK_FREQ APB_CLK_FREQ
  117. #define TIMER_CLK_FREQ (80000000>>4) //80MHz divided by 16
  118. #define SPI_CLK_DIV 4
  119. #define TICKS_PER_US_ROM 40 // CPU is 80MHz
  120. #define GPIO_MATRIX_DELAY_NS 0
  121. //}}
  122. /* Overall memory map */
  123. #define SOC_DROM_LOW 0x3F000000/*drom0 low address for icache*/
  124. #define SOC_DROM_HIGH 0x3FF80000/*dram0 high address for dcache*/
  125. #define SOC_IROM_LOW 0x40080000
  126. #define SOC_IROM_HIGH 0x40800000
  127. #define SOC_IROM_MASK_LOW 0x40000000
  128. #define SOC_IROM_MASK_HIGH 0x40020000
  129. #define SOC_IRAM_LOW 0x40020000
  130. #define SOC_IRAM_HIGH 0x40070000
  131. #define SOC_DRAM_LOW 0x3FFB0000
  132. #define SOC_DRAM_HIGH 0x40000000
  133. #define SOC_RTC_IRAM_LOW 0x40070000
  134. #define SOC_RTC_IRAM_HIGH 0x40072000
  135. #define SOC_RTC_DRAM_LOW 0x3ff9e000
  136. #define SOC_RTC_DRAM_HIGH 0x3ffa0000
  137. #define SOC_RTC_DATA_LOW 0x50000000
  138. #define SOC_RTC_DATA_HIGH 0x50002000
  139. #define SOC_EXTRAM_DATA_LOW 0x3F500000
  140. #define SOC_EXTRAM_DATA_HIGH 0x3FF80000
  141. #define SOC_EXTRAM_DATA_SIZE (SOC_EXTRAM_DATA_HIGH - SOC_EXTRAM_DATA_LOW)
  142. //First and last words of the D/IRAM region, for both the DRAM address as well as the IRAM alias.
  143. #define SOC_DIRAM_IRAM_LOW 0x40020000
  144. #define SOC_DIRAM_IRAM_HIGH 0x40070000
  145. #define SOC_DIRAM_DRAM_LOW 0x3FFB0000
  146. #define SOC_DIRAM_DRAM_HIGH 0x40000000
  147. #define SOC_I_D_OFFSET (SOC_DIRAM_IRAM_LOW - SOC_DIRAM_DRAM_LOW)
  148. #define MAP_DRAM_TO_IRAM(addr) (addr + SOC_I_D_OFFSET)
  149. #define MAP_IRAM_TO_DRAM(addr) (addr - SOC_I_D_OFFSET)
  150. // Region of memory accessible via DMA in internal memory. See esp_ptr_dma_capable().
  151. #define SOC_DMA_LOW 0x3FFB0000
  152. #define SOC_DMA_HIGH 0x40000000
  153. // Region of memory accessible via DMA in external memory. See esp_ptr_dma_ext_capable().
  154. #define SOC_DMA_EXT_LOW 0x3F500000
  155. #define SOC_DMA_EXT_HIGH 0x3FF80000
  156. // Region of memory that is byte-accessible. See esp_ptr_byte_accessible().
  157. #define SOC_BYTE_ACCESSIBLE_LOW 0x3FF9E000
  158. #define SOC_BYTE_ACCESSIBLE_HIGH 0x40000000
  159. //Region of memory that is internal, as in on the same silicon die as the ESP32 CPUs
  160. //(excluding RTC data region, that's checked separately.) See esp_ptr_internal().
  161. #define SOC_MEM_INTERNAL_LOW 0x3FF9E000
  162. #define SOC_MEM_INTERNAL_HIGH 0x40072000
  163. // Start (highest address) of ROM boot stack, only relevant during early boot
  164. #define SOC_ROM_STACK_START 0x3fffe70c
  165. //interrupt cpu using table, Please see the core-isa.h
  166. /*************************************************************************************************************
  167. * Intr num Level Type PRO CPU usage
  168. * 0 1 extern level WMAC
  169. * 1 1 extern level BT/BLE Host HCI DMA
  170. * 2 1 extern level
  171. * 3 1 extern level
  172. * 4 1 extern level WBB
  173. * 5 1 extern level BT/BLE Controller
  174. * 6 1 timer FreeRTOS Tick(L1)
  175. * 7 1 software BT/BLE VHCI
  176. * 8 1 extern level BT/BLE BB(RX/TX)
  177. * 9 1 extern level
  178. * 10 1 extern edge
  179. * 11 3 profiling
  180. * 12 1 extern level
  181. * 13 1 extern level
  182. * 14 7 nmi Reserved
  183. * 15 3 timer FreeRTOS Tick(L3)
  184. * 16 5 timer
  185. * 17 1 extern level
  186. * 18 1 extern level
  187. * 19 2 extern level
  188. * 20 2 extern level
  189. * 21 2 extern level
  190. * 22 3 extern edge
  191. * 23 3 extern level
  192. * 24 4 extern level TG1_WDT
  193. * 25 4 extern level CACHEERR
  194. * 26 5 extern level
  195. * 27 3 extern level Reserved
  196. * 28 4 extern edge Reserved
  197. * 29 3 software Reserved
  198. * 30 4 extern edge Reserved
  199. * 31 5 extern level
  200. *************************************************************************************************************
  201. */
  202. //CPU0 Interrupt number reserved, not touch this.
  203. #define ETS_WMAC_INUM 0
  204. #define ETS_BT_HOST_INUM 1
  205. #define ETS_WBB_INUM 4
  206. #define ETS_TG0_T1_INUM 10 /**< use edge interrupt*/
  207. #define ETS_FRC1_INUM 22
  208. #define ETS_T1_WDT_INUM 24
  209. #define ETS_MEMACCESS_ERR_INUM 25
  210. //CPU0 Interrupt number used in ROM, should be cancelled in SDK
  211. #define ETS_SLC_INUM 1
  212. #define ETS_UART0_INUM 5
  213. #define ETS_UART1_INUM 5
  214. #define ETS_SPI2_INUM 1
  215. //CPU0 Interrupt number used in ROM code only when module init function called, should pay attention here.
  216. #define ETS_FRC_TIMER2_INUM 10 /* use edge*/
  217. #define ETS_GPIO_INUM 4
  218. //Other interrupt number should be managed by the user
  219. //Invalid interrupt for number interrupt matrix
  220. #define ETS_INVALID_INUM 6