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