hpm_lin_regs.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /*
  2. * Copyright (c) 2021-2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_LIN_H
  8. #define HPM_LIN_H
  9. typedef struct {
  10. __RW uint32_t DATABYTE[8]; /* 0x0 - 0x1C: data byte */
  11. __RW uint32_t CONTROL; /* 0x20: control register */
  12. __R uint32_t STATE; /* 0x24: state register */
  13. __R uint32_t ERROR; /* 0x28: error register */
  14. __RW uint32_t DATA_LEN; /* 0x2C: data lenth register */
  15. __RW uint32_t BAUDRATE_CTL_LOW; /* 0x30: baudrate control low register */
  16. __RW uint32_t BARDRATE_CTL_HIGH; /* 0x34: baudrate control high register */
  17. __RW uint32_t ID; /* 0x38: id register */
  18. __RW uint32_t TV; /* 0x3C: timeout control register */
  19. } LIN_Type;
  20. /* Bitfield definition for register array: DATABYTE */
  21. /*
  22. * DATA_BYTE (RW)
  23. *
  24. * data byte
  25. */
  26. #define LIN_DATABYTE_DATA_BYTE_MASK (0xFFU)
  27. #define LIN_DATABYTE_DATA_BYTE_SHIFT (0U)
  28. #define LIN_DATABYTE_DATA_BYTE_SET(x) (((uint32_t)(x) << LIN_DATABYTE_DATA_BYTE_SHIFT) & LIN_DATABYTE_DATA_BYTE_MASK)
  29. #define LIN_DATABYTE_DATA_BYTE_GET(x) (((uint32_t)(x) & LIN_DATABYTE_DATA_BYTE_MASK) >> LIN_DATABYTE_DATA_BYTE_SHIFT)
  30. /* Bitfield definition for register: CONTROL */
  31. /*
  32. * STOP (WO)
  33. *
  34. * slave only. Write 1 when the Host determin do not response to the data request according to a unkown ID
  35. */
  36. #define LIN_CONTROL_STOP_MASK (0x80U)
  37. #define LIN_CONTROL_STOP_SHIFT (7U)
  38. #define LIN_CONTROL_STOP_SET(x) (((uint32_t)(x) << LIN_CONTROL_STOP_SHIFT) & LIN_CONTROL_STOP_MASK)
  39. #define LIN_CONTROL_STOP_GET(x) (((uint32_t)(x) & LIN_CONTROL_STOP_MASK) >> LIN_CONTROL_STOP_SHIFT)
  40. /*
  41. * SLEEP (RW)
  42. *
  43. * The bit is used by the LIN core to determine whether the LIN bus is in sleep mode or not. Set this bit after sending or receiving a Sleep Mode frame or if a bus idle timeout interrupt is requested or if after a wakeup request there is no response from the master and a timeout is signaled. The bit will be automatically reset by the LIN core.
  44. */
  45. #define LIN_CONTROL_SLEEP_MASK (0x40U)
  46. #define LIN_CONTROL_SLEEP_SHIFT (6U)
  47. #define LIN_CONTROL_SLEEP_SET(x) (((uint32_t)(x) << LIN_CONTROL_SLEEP_SHIFT) & LIN_CONTROL_SLEEP_MASK)
  48. #define LIN_CONTROL_SLEEP_GET(x) (((uint32_t)(x) & LIN_CONTROL_SLEEP_MASK) >> LIN_CONTROL_SLEEP_SHIFT)
  49. /*
  50. * TRANSMIT (RW)
  51. *
  52. * 1: transmit operation 0: receive operation
  53. */
  54. #define LIN_CONTROL_TRANSMIT_MASK (0x20U)
  55. #define LIN_CONTROL_TRANSMIT_SHIFT (5U)
  56. #define LIN_CONTROL_TRANSMIT_SET(x) (((uint32_t)(x) << LIN_CONTROL_TRANSMIT_SHIFT) & LIN_CONTROL_TRANSMIT_MASK)
  57. #define LIN_CONTROL_TRANSMIT_GET(x) (((uint32_t)(x) & LIN_CONTROL_TRANSMIT_MASK) >> LIN_CONTROL_TRANSMIT_SHIFT)
  58. /*
  59. * DATA_ACK (RW)
  60. *
  61. * slave only. Write 1 after handling a data request interrupt
  62. */
  63. #define LIN_CONTROL_DATA_ACK_MASK (0x10U)
  64. #define LIN_CONTROL_DATA_ACK_SHIFT (4U)
  65. #define LIN_CONTROL_DATA_ACK_SET(x) (((uint32_t)(x) << LIN_CONTROL_DATA_ACK_SHIFT) & LIN_CONTROL_DATA_ACK_MASK)
  66. #define LIN_CONTROL_DATA_ACK_GET(x) (((uint32_t)(x) & LIN_CONTROL_DATA_ACK_MASK) >> LIN_CONTROL_DATA_ACK_SHIFT)
  67. /*
  68. * RESET_INT (WO)
  69. *
  70. * write 1 to reset the int bit in the status register and the interrupt request output of LIN
  71. */
  72. #define LIN_CONTROL_RESET_INT_MASK (0x8U)
  73. #define LIN_CONTROL_RESET_INT_SHIFT (3U)
  74. #define LIN_CONTROL_RESET_INT_SET(x) (((uint32_t)(x) << LIN_CONTROL_RESET_INT_SHIFT) & LIN_CONTROL_RESET_INT_MASK)
  75. #define LIN_CONTROL_RESET_INT_GET(x) (((uint32_t)(x) & LIN_CONTROL_RESET_INT_MASK) >> LIN_CONTROL_RESET_INT_SHIFT)
  76. /*
  77. * RESET_ERROR (WO)
  78. *
  79. * assert 1 to reset the error bits in status register and error register. A read access to this bit delivers always the value 0
  80. */
  81. #define LIN_CONTROL_RESET_ERROR_MASK (0x4U)
  82. #define LIN_CONTROL_RESET_ERROR_SHIFT (2U)
  83. #define LIN_CONTROL_RESET_ERROR_SET(x) (((uint32_t)(x) << LIN_CONTROL_RESET_ERROR_SHIFT) & LIN_CONTROL_RESET_ERROR_MASK)
  84. #define LIN_CONTROL_RESET_ERROR_GET(x) (((uint32_t)(x) & LIN_CONTROL_RESET_ERROR_MASK) >> LIN_CONTROL_RESET_ERROR_SHIFT)
  85. /*
  86. * WAKEUP_REQ (RW)
  87. *
  88. * wakeup request. Assert to terminate the Sleep mode of the LIN bus. The bit will be reset by core
  89. */
  90. #define LIN_CONTROL_WAKEUP_REQ_MASK (0x2U)
  91. #define LIN_CONTROL_WAKEUP_REQ_SHIFT (1U)
  92. #define LIN_CONTROL_WAKEUP_REQ_SET(x) (((uint32_t)(x) << LIN_CONTROL_WAKEUP_REQ_SHIFT) & LIN_CONTROL_WAKEUP_REQ_MASK)
  93. #define LIN_CONTROL_WAKEUP_REQ_GET(x) (((uint32_t)(x) & LIN_CONTROL_WAKEUP_REQ_MASK) >> LIN_CONTROL_WAKEUP_REQ_SHIFT)
  94. /*
  95. * START_REQ (RW)
  96. *
  97. * master only. Set by host controller of a LIN master to start the LIN transmission. The core will reset the bit after the transmission is finished or an error is occurred
  98. */
  99. #define LIN_CONTROL_START_REQ_MASK (0x1U)
  100. #define LIN_CONTROL_START_REQ_SHIFT (0U)
  101. #define LIN_CONTROL_START_REQ_SET(x) (((uint32_t)(x) << LIN_CONTROL_START_REQ_SHIFT) & LIN_CONTROL_START_REQ_MASK)
  102. #define LIN_CONTROL_START_REQ_GET(x) (((uint32_t)(x) & LIN_CONTROL_START_REQ_MASK) >> LIN_CONTROL_START_REQ_SHIFT)
  103. /* Bitfield definition for register: STATE */
  104. /*
  105. * LIN_ACTIVE (RO)
  106. *
  107. * The bit indicates whether the LIN bus is active or not
  108. */
  109. #define LIN_STATE_LIN_ACTIVE_MASK (0x80U)
  110. #define LIN_STATE_LIN_ACTIVE_SHIFT (7U)
  111. #define LIN_STATE_LIN_ACTIVE_GET(x) (((uint32_t)(x) & LIN_STATE_LIN_ACTIVE_MASK) >> LIN_STATE_LIN_ACTIVE_SHIFT)
  112. /*
  113. * BUS_IDLE_TV (RO)
  114. *
  115. * slave only. This bit is set by LIN core if bit sleep is not set and no bus activity is detected for 4s
  116. */
  117. #define LIN_STATE_BUS_IDLE_TV_MASK (0x40U)
  118. #define LIN_STATE_BUS_IDLE_TV_SHIFT (6U)
  119. #define LIN_STATE_BUS_IDLE_TV_GET(x) (((uint32_t)(x) & LIN_STATE_BUS_IDLE_TV_MASK) >> LIN_STATE_BUS_IDLE_TV_SHIFT)
  120. /*
  121. * ABORTED (RO)
  122. *
  123. * slave only. This bit is set by LIN core slave if a transmission is aborted after the bneginning of the data field due to a timeout or bit error.
  124. */
  125. #define LIN_STATE_ABORTED_MASK (0x20U)
  126. #define LIN_STATE_ABORTED_SHIFT (5U)
  127. #define LIN_STATE_ABORTED_GET(x) (((uint32_t)(x) & LIN_STATE_ABORTED_MASK) >> LIN_STATE_ABORTED_SHIFT)
  128. /*
  129. * DATA_REQ (RO)
  130. *
  131. * slave only. Sets after receiving the identifier and requests an interrupt to the host controller.
  132. */
  133. #define LIN_STATE_DATA_REQ_MASK (0x10U)
  134. #define LIN_STATE_DATA_REQ_SHIFT (4U)
  135. #define LIN_STATE_DATA_REQ_GET(x) (((uint32_t)(x) & LIN_STATE_DATA_REQ_MASK) >> LIN_STATE_DATA_REQ_SHIFT)
  136. /*
  137. * INT (RO)
  138. *
  139. * set when request an interrupt. Reset by reset_int
  140. */
  141. #define LIN_STATE_INT_MASK (0x8U)
  142. #define LIN_STATE_INT_SHIFT (3U)
  143. #define LIN_STATE_INT_GET(x) (((uint32_t)(x) & LIN_STATE_INT_MASK) >> LIN_STATE_INT_SHIFT)
  144. /*
  145. * ERROR (RO)
  146. *
  147. * set when detecte an error, clear by reset_error
  148. */
  149. #define LIN_STATE_ERROR_MASK (0x4U)
  150. #define LIN_STATE_ERROR_SHIFT (2U)
  151. #define LIN_STATE_ERROR_GET(x) (((uint32_t)(x) & LIN_STATE_ERROR_MASK) >> LIN_STATE_ERROR_SHIFT)
  152. /*
  153. * WAKEUP (RO)
  154. *
  155. * set when transmitting a wakeup signal or when received a wakeup signal. Clear when reset_error bit is 1
  156. */
  157. #define LIN_STATE_WAKEUP_MASK (0x2U)
  158. #define LIN_STATE_WAKEUP_SHIFT (1U)
  159. #define LIN_STATE_WAKEUP_GET(x) (((uint32_t)(x) & LIN_STATE_WAKEUP_MASK) >> LIN_STATE_WAKEUP_SHIFT)
  160. /*
  161. * COMPLETE (RO)
  162. *
  163. * set after a transmission has been successful finished and it will reset at the start of a transmission.
  164. */
  165. #define LIN_STATE_COMPLETE_MASK (0x1U)
  166. #define LIN_STATE_COMPLETE_SHIFT (0U)
  167. #define LIN_STATE_COMPLETE_GET(x) (((uint32_t)(x) & LIN_STATE_COMPLETE_MASK) >> LIN_STATE_COMPLETE_SHIFT)
  168. /* Bitfield definition for register: ERROR */
  169. /*
  170. * PARITY_ERROR (RO)
  171. *
  172. * slave only. identifier parity error
  173. */
  174. #define LIN_ERROR_PARITY_ERROR_MASK (0x8U)
  175. #define LIN_ERROR_PARITY_ERROR_SHIFT (3U)
  176. #define LIN_ERROR_PARITY_ERROR_GET(x) (((uint32_t)(x) & LIN_ERROR_PARITY_ERROR_MASK) >> LIN_ERROR_PARITY_ERROR_SHIFT)
  177. /*
  178. * TIMEOUT (RO)
  179. *
  180. * timeout error. The master detects a timeout error if it is expecting data from the bus but no slave does respond. The slave detects a timeout error if it is requesting a data acknowledge to the host controller. The slave detects a timeout if it has transmitted a wakeup signal and it detects no sync field within 150ms
  181. */
  182. #define LIN_ERROR_TIMEOUT_MASK (0x4U)
  183. #define LIN_ERROR_TIMEOUT_SHIFT (2U)
  184. #define LIN_ERROR_TIMEOUT_GET(x) (((uint32_t)(x) & LIN_ERROR_TIMEOUT_MASK) >> LIN_ERROR_TIMEOUT_SHIFT)
  185. /*
  186. * CHK_ERROR (RO)
  187. *
  188. * checksum error
  189. */
  190. #define LIN_ERROR_CHK_ERROR_MASK (0x2U)
  191. #define LIN_ERROR_CHK_ERROR_SHIFT (1U)
  192. #define LIN_ERROR_CHK_ERROR_GET(x) (((uint32_t)(x) & LIN_ERROR_CHK_ERROR_MASK) >> LIN_ERROR_CHK_ERROR_SHIFT)
  193. /*
  194. * BIT_ERROR (RO)
  195. *
  196. * bit error
  197. */
  198. #define LIN_ERROR_BIT_ERROR_MASK (0x1U)
  199. #define LIN_ERROR_BIT_ERROR_SHIFT (0U)
  200. #define LIN_ERROR_BIT_ERROR_GET(x) (((uint32_t)(x) & LIN_ERROR_BIT_ERROR_MASK) >> LIN_ERROR_BIT_ERROR_SHIFT)
  201. /* Bitfield definition for register: DATA_LEN */
  202. /*
  203. * ENH_CHECK (RW)
  204. *
  205. * 1:enhence check mode
  206. */
  207. #define LIN_DATA_LEN_ENH_CHECK_MASK (0x80U)
  208. #define LIN_DATA_LEN_ENH_CHECK_SHIFT (7U)
  209. #define LIN_DATA_LEN_ENH_CHECK_SET(x) (((uint32_t)(x) << LIN_DATA_LEN_ENH_CHECK_SHIFT) & LIN_DATA_LEN_ENH_CHECK_MASK)
  210. #define LIN_DATA_LEN_ENH_CHECK_GET(x) (((uint32_t)(x) & LIN_DATA_LEN_ENH_CHECK_MASK) >> LIN_DATA_LEN_ENH_CHECK_SHIFT)
  211. /*
  212. * DATA_LENGTH (RW)
  213. *
  214. * data length
  215. */
  216. #define LIN_DATA_LEN_DATA_LENGTH_MASK (0xFU)
  217. #define LIN_DATA_LEN_DATA_LENGTH_SHIFT (0U)
  218. #define LIN_DATA_LEN_DATA_LENGTH_SET(x) (((uint32_t)(x) << LIN_DATA_LEN_DATA_LENGTH_SHIFT) & LIN_DATA_LEN_DATA_LENGTH_MASK)
  219. #define LIN_DATA_LEN_DATA_LENGTH_GET(x) (((uint32_t)(x) & LIN_DATA_LEN_DATA_LENGTH_MASK) >> LIN_DATA_LEN_DATA_LENGTH_SHIFT)
  220. /* Bitfield definition for register: BAUDRATE_CTL_LOW */
  221. /*
  222. * BT_DIV_LOW (RW)
  223. *
  224. * bit div register 7:0
  225. */
  226. #define LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_MASK (0xFFU)
  227. #define LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_SHIFT (0U)
  228. #define LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_SET(x) (((uint32_t)(x) << LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_SHIFT) & LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_MASK)
  229. #define LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_GET(x) (((uint32_t)(x) & LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_MASK) >> LIN_BAUDRATE_CTL_LOW_BT_DIV_LOW_SHIFT)
  230. /* Bitfield definition for register: BARDRATE_CTL_HIGH */
  231. /*
  232. * PRESCL (RW)
  233. *
  234. * prescl register
  235. */
  236. #define LIN_BARDRATE_CTL_HIGH_PRESCL_MASK (0xC0U)
  237. #define LIN_BARDRATE_CTL_HIGH_PRESCL_SHIFT (6U)
  238. #define LIN_BARDRATE_CTL_HIGH_PRESCL_SET(x) (((uint32_t)(x) << LIN_BARDRATE_CTL_HIGH_PRESCL_SHIFT) & LIN_BARDRATE_CTL_HIGH_PRESCL_MASK)
  239. #define LIN_BARDRATE_CTL_HIGH_PRESCL_GET(x) (((uint32_t)(x) & LIN_BARDRATE_CTL_HIGH_PRESCL_MASK) >> LIN_BARDRATE_CTL_HIGH_PRESCL_SHIFT)
  240. /*
  241. * BT_MUL (RW)
  242. *
  243. * bt_mul register
  244. */
  245. #define LIN_BARDRATE_CTL_HIGH_BT_MUL_MASK (0x3EU)
  246. #define LIN_BARDRATE_CTL_HIGH_BT_MUL_SHIFT (1U)
  247. #define LIN_BARDRATE_CTL_HIGH_BT_MUL_SET(x) (((uint32_t)(x) << LIN_BARDRATE_CTL_HIGH_BT_MUL_SHIFT) & LIN_BARDRATE_CTL_HIGH_BT_MUL_MASK)
  248. #define LIN_BARDRATE_CTL_HIGH_BT_MUL_GET(x) (((uint32_t)(x) & LIN_BARDRATE_CTL_HIGH_BT_MUL_MASK) >> LIN_BARDRATE_CTL_HIGH_BT_MUL_SHIFT)
  249. /*
  250. * BT_DIV_HIGH (RW)
  251. *
  252. * bit div register 8
  253. */
  254. #define LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_MASK (0x1U)
  255. #define LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_SHIFT (0U)
  256. #define LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_SET(x) (((uint32_t)(x) << LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_SHIFT) & LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_MASK)
  257. #define LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_GET(x) (((uint32_t)(x) & LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_MASK) >> LIN_BARDRATE_CTL_HIGH_BT_DIV_HIGH_SHIFT)
  258. /* Bitfield definition for register: ID */
  259. /*
  260. * ID (RW)
  261. *
  262. * id register
  263. */
  264. #define LIN_ID_ID_MASK (0x3FU)
  265. #define LIN_ID_ID_SHIFT (0U)
  266. #define LIN_ID_ID_SET(x) (((uint32_t)(x) << LIN_ID_ID_SHIFT) & LIN_ID_ID_MASK)
  267. #define LIN_ID_ID_GET(x) (((uint32_t)(x) & LIN_ID_ID_MASK) >> LIN_ID_ID_SHIFT)
  268. /* Bitfield definition for register: TV */
  269. /*
  270. * INITIAL_MODE (RW)
  271. *
  272. * initial_mode
  273. */
  274. #define LIN_TV_INITIAL_MODE_MASK (0x80U)
  275. #define LIN_TV_INITIAL_MODE_SHIFT (7U)
  276. #define LIN_TV_INITIAL_MODE_SET(x) (((uint32_t)(x) << LIN_TV_INITIAL_MODE_SHIFT) & LIN_TV_INITIAL_MODE_MASK)
  277. #define LIN_TV_INITIAL_MODE_GET(x) (((uint32_t)(x) & LIN_TV_INITIAL_MODE_MASK) >> LIN_TV_INITIAL_MODE_SHIFT)
  278. /*
  279. * MASTER_MODE (RW)
  280. *
  281. * master_mode
  282. */
  283. #define LIN_TV_MASTER_MODE_MASK (0x40U)
  284. #define LIN_TV_MASTER_MODE_SHIFT (6U)
  285. #define LIN_TV_MASTER_MODE_SET(x) (((uint32_t)(x) << LIN_TV_MASTER_MODE_SHIFT) & LIN_TV_MASTER_MODE_MASK)
  286. #define LIN_TV_MASTER_MODE_GET(x) (((uint32_t)(x) & LIN_TV_MASTER_MODE_MASK) >> LIN_TV_MASTER_MODE_SHIFT)
  287. /*
  288. * BUS_INACTIVITY_TIME (RW)
  289. *
  290. * slave only. LIN bus idle timeout register: 00-4s 01-6s 10-8s 11-10s
  291. */
  292. #define LIN_TV_BUS_INACTIVITY_TIME_MASK (0xCU)
  293. #define LIN_TV_BUS_INACTIVITY_TIME_SHIFT (2U)
  294. #define LIN_TV_BUS_INACTIVITY_TIME_SET(x) (((uint32_t)(x) << LIN_TV_BUS_INACTIVITY_TIME_SHIFT) & LIN_TV_BUS_INACTIVITY_TIME_MASK)
  295. #define LIN_TV_BUS_INACTIVITY_TIME_GET(x) (((uint32_t)(x) & LIN_TV_BUS_INACTIVITY_TIME_MASK) >> LIN_TV_BUS_INACTIVITY_TIME_SHIFT)
  296. /*
  297. * WUP_REPEAT_TIME (RW)
  298. *
  299. * slave only. wakeup repeat interval time 00-180ms 01-200ms 10-220ms 11-240ms
  300. */
  301. #define LIN_TV_WUP_REPEAT_TIME_MASK (0x3U)
  302. #define LIN_TV_WUP_REPEAT_TIME_SHIFT (0U)
  303. #define LIN_TV_WUP_REPEAT_TIME_SET(x) (((uint32_t)(x) << LIN_TV_WUP_REPEAT_TIME_SHIFT) & LIN_TV_WUP_REPEAT_TIME_MASK)
  304. #define LIN_TV_WUP_REPEAT_TIME_GET(x) (((uint32_t)(x) & LIN_TV_WUP_REPEAT_TIME_MASK) >> LIN_TV_WUP_REPEAT_TIME_SHIFT)
  305. /* DATABYTE register group index macro definition */
  306. #define LIN_DATABYTE_DATA_BYTE0 (0UL)
  307. #define LIN_DATABYTE_DATA_BYTE1 (1UL)
  308. #define LIN_DATABYTE_DATA_BYTE2 (2UL)
  309. #define LIN_DATABYTE_DATA_BYTE3 (3UL)
  310. #define LIN_DATABYTE_DATA_BYTE4 (4UL)
  311. #define LIN_DATABYTE_DATA_BYTE5 (5UL)
  312. #define LIN_DATABYTE_DATA_BYTE6 (6UL)
  313. #define LIN_DATABYTE_DATA_BYTE7 (7UL)
  314. #endif /* HPM_LIN_H */