SemiDrive SSDK Appication Program Interface PTG3.0
sdrv_lin.h
Go to the documentation of this file.
1
9#ifndef INCLUDE_DRV_SDRV_LIN_H
10#define INCLUDE_DRV_SDRV_LIN_H
11
12#include <compiler.h>
13#if CONFIG_MAINFUNCTION_ENABLE
14#include <mainfunction/mainfunction.h>
15#endif
16#include <sdrv_common.h>
17#include <sdrv_uart.h>
18#include <types.h>
19
20#ifndef ASSEMBLY
21
22__BEGIN_CDECLS
23
24/* Lin module is half duplex */
25#define SDRV_HALF_DUPLEX 1U
26/* Lin module use software flow control */
27#define SDRV_SOFTWARE_FC 1U
28/* Lin data frame param */
29#define SDRV_CHAR_8_BITS 0U
30#define SDRV_STOP_1_BIT 0U
31#define SDRV_NO_PARITY 0U
32
33/* Lin break is detected as 13 bit time low level on RX/TX line */
34#define SDRV_LIN_TXBREAK_LEN (13U)
35#define SDRV_LIN_RXBREAK_LEN (10U)
36#define SDRV_LIN_TXBREAK_BIT(bit) (((bit)-8U) + 1U)
37#define SDRV_LIN_RXBREAK_BIT(bit) (((bit)-9U) + 1U)
38
39/* Trigger a transfer by write 0xA53C to register */
40#define SDRV_DOORBELL_TRIGGER 0xA53CU
41/* Abort a transfer by write 0xA53C to register */
42#define SDRV_DOORBELL_ABORT 0xA5C3U
43
44/* Auto baud detect param */
45#define ABR_PATTERN 0U
46#define SDRV_LIN_ABR_PATTERN_CHAR 0x55U
47
48/* Sleep/Wakeup frame id */
49#define LIN_SLEEP_ID 0x3cU
50#define LIN_WAKEUP_ID 0x3dU
51
52/* The count of timeout */
53#define WaitForever 0xFFFFFFFFU
54#define NoWait 0x00U
55#define SDRV_LIN_OPERATION_TIMEOUT 0x200000U
56
57/* The mask of timeout value, PCR7-> PCMDTO. */
58#define SDRV_LIN_PCR7_PCMDTO_MASK 0x0000001FU
59/* The mask of id value, PSR4-> LINPID -> ID. */
60#define SDRV_LIN_PSR4_LINPID_ID_MASK 0x0000003FU
61
63#define SDRV_UART_INTR_TX_FOVF \
64 (1U << 4)
65#define SDRV_UART_INTR_RX_FOVF \
66 (1U << 5)
67#define SDRV_LIN_INTR_PARITYERR \
68 (1U << 8)
70#define SDRV_LIN_INTR_FRAMEERR \
71 (1U << 9)
73#define SDRV_LIN_INTR_BAUDRATEERR \
74 (1U << 10)
75#define SDRV_LIN_INTR_NOISERERR \
76 (1U << 11)
78#define SDRV_LIN_INTR_ABRPASS \
79 (1U << 18)
80#define SDRV_LIN_INTR_ABRFAIL \
81 (1U << 19)
82#define SDRV_LIN_INTR_STARTBITERR \
83 (1U << 20)
84#define SDRV_LIN_INTR_APBCMDDONE \
85 (1U << 21)
86#define SDRV_LIN_INTR_APBCMDABORT \
87 (1U << 22)
88#define SDRV_LIN_INTR_PIDPASS (1U << 23)
89#define SDRV_LIN_INTR_PIDERR (1U << 24)
90#define SDRV_LIN_INTR_RXCHKSUMPASS (1U << 25)
91#define SDRV_LIN_INTR_RXCHKSUMERR (1U << 26)
93/* Sdrv lin frame and fifo error interrupt. */
94#define SDEV_LIN_INTR_FRAME_FIFO_ERR \
95 (SDRV_UART_INTR_TX_FOVF | SDRV_UART_INTR_RX_FOVF | \
96 SDRV_LIN_INTR_PARITYERR | SDRV_LIN_INTR_FRAMEERR | \
97 SDRV_LIN_INTR_NOISERERR | SDRV_LIN_INTR_STARTBITERR)
98
99/* Sdrv lin abr interrupt. */
100#define SDRV_LIN_INTR_ABR (SDRV_LIN_INTR_ABRPASS | SDRV_LIN_INTR_ABRFAIL)
101
125};
126
127typedef struct sdrv_lin sdrv_lin_t;
129
130/* lin callback function type */
131typedef void (*lin_callback_t)(struct sdrv_lin *ctrl,
132 lin_interrupt_type_e linstate, void *userdata);
133
137typedef enum lin_mode {
141
145typedef enum lin_cs_mode {
146 LIN_CLASSIC_CS = 0U, /* Classic checksum */
147 LIN_ENHANCED_CS = 1U, /* Enhanced checksum */
149
153typedef enum lin_ch_status {
158
162typedef enum lin_ret_status {
168 SDRV_STATUS_INVALID_PARAM, /* The param is invalid. */
172 1U),
174
178typedef enum lin_sub_status {
189
193struct sdrv_lin {
194 /* Lin module information. */
195 uint32_t base;
196 int irq;
197 uint32_t clk_freq;
199 /* Lin channel information. */
200 uint32_t baud;
203 volatile uint8_t current_id;
207 void *userdata;
208 volatile uint32_t abr_state;
209 volatile bool
212 /* Lin transfer information. */
213 const uint8_t *tx_buff;
214 uint8_t tx_size;
215 volatile uint8_t tx_remain;
216 volatile uint32_t tx_state;
218 uint8_t *rx_buff;
219 uint8_t rx_size;
220 volatile uint8_t rx_remain;
221 volatile uint32_t rx_state;
223#if CONFIG_MAINFUNCTION_ENABLE
224 /* Lin mainfunction information. */
225 module_mainfunction_t
226 *module_node;
227 volatile mainfunction_ret_status_t
228 module_mainfunction_state;
230#endif
231};
232
236typedef struct sdrv_lin_config {
237 uint32_t base;
238 int irq;
239 uint32_t baud;
240 uint32_t clk_freq;
244 /* Auto baudrate detect configurations, these configurations are optional.
245 * Default configuration : Disable auto baudrate detect
246 */
247 uint8_t abr_en;
251 /* Transfer timeout configurations, these configurations are optional.
252 * If user set transfer_timeout as true, should set timeout_value too.
253 * The range of timeout_value is 0x00 ~ 0x1F.
254 * timeout_value <-> timeout cycle(w_sclk_div) <-> timeout ms(clk 83MHz)
255 * 0x00 2^35 cycle 1/83000000*(2^35) = 413s
256 * 0x01 2^34 cycle 206s
257 * ... ... ...
258 * 0x1F 2^3 cycle 0.1us
259 *
260 * Example/Recommand:
261 * w_sclk_div is 83MHz, 1 cycle is 0.012us.
262 * Baud(bit) <-> timeout_value <-> timeout ms(clk 83MHz)
263 * 1K ~ 2K 0x0B(2^24 cycle) 202ms
264 * 2K ~ 5K 0x0C(2^23 cycle) 101ms
265 * 5k ~ 10k 0x0D(2^22 cycle) 50ms
266 * 10k ~ 15k 0x0E(2^21 cycle) 25ms
267 * 15k ~ 20k 0x0F(2^20 cycle) 12ms
268 */
273 /* Use mainfunction polling mode to transmit/receive lin frame.
274 * Default configuration is false.
275 */
277 uint32_t
281
282typedef struct sdrv_lin_pdu {
283 uint8_t id;
285 uint8_t size;
286 uint8_t *data;
288
304 const sdrv_lin_config_t *cfg,
305 lin_callback_t callback,
306 void *userdata);
307
316
331
342
362 sdrv_lin_pdu_t *lin_pdu,
363 uint32_t times);
364
378 uint8_t *bytes_remaining);
379
393 size_t size, uint32_t times);
394
413 sdrv_lin_pdu_t *lin_pdu);
414
428 uint8_t *bytes_remaining);
429
440
449
459
473
484
498
510
520void sdrv_lin_intr_ctrl(sdrv_lin_t *ctrl, uint32_t mask, bool value);
521
532
542
551void sdrv_lin_intr_status_clear(sdrv_lin_t *ctrl, uint32_t mask);
552
562int sdrv_lin_irq_handler(uint32_t irq, void *ctrl);
563
564#if CONFIG_MAINFUNCTION_ENABLE
572void sdrv_lin_mainfunction_handler(void *ctrl);
573#endif
574
575__END_CDECLS
576
577#endif
578
579#endif
SemiDrive driver common header file.
@ SDRV_STATUS_GROUP_LIN
Definition: sdrv_common.h:35
@ SDRV_STATUS_INVALID_PARAM
Definition: sdrv_common.h:76
@ SDRV_STATUS_FAIL
Definition: sdrv_common.h:73
@ SDRV_STATUS_OK
Definition: sdrv_common.h:72
@ SDRV_STATUS_TIMEOUT
Definition: sdrv_common.h:75
@ SDRV_STATUS_BUSY
Definition: sdrv_common.h:74
#define SDRV_ERROR_STATUS(group, code)
Construct a status code value from a group and code number. All the error statuses are negetive numbe...
Definition: sdrv_common.h:17
enum lin_mode lin_mode_e
LIN mode.
struct sdrv_lin_pdu sdrv_lin_pdu_t
lin_cs_mode
LIN checksum mode.
Definition: sdrv_lin.h:145
@ LIN_ENHANCED_CS
Definition: sdrv_lin.h:147
@ LIN_CLASSIC_CS
Definition: sdrv_lin.h:146
lin_sub_status
LIN frame status.
Definition: sdrv_lin.h:178
@ SDRV_LIN_STATE_ABR_READY
Definition: sdrv_lin.h:185
@ SDRV_LIN_STATE_ABR_BUSY
Definition: sdrv_lin.h:186
@ SDRV_LIN_STATE_RX
Definition: sdrv_lin.h:183
@ SDRV_LIN_STATE_ABR_FAIL
Definition: sdrv_lin.h:187
@ SDRV_LIN_STATE_RX_ERROR
Definition: sdrv_lin.h:184
@ SDRV_LIN_STATE_BUSY
Definition: sdrv_lin.h:180
@ SDRV_LIN_STATE_TX
Definition: sdrv_lin.h:181
@ SDRV_LIN_STATE_TX_ERROR
Definition: sdrv_lin.h:182
@ SDRV_LIN_STATE_IDLE
Definition: sdrv_lin.h:179
enum lin_ret_status lin_ret_status_e
LIN return status.
uint32_t sdrv_lin_intr_status_get(sdrv_lin_t *ctrl)
Get Sdrv lin Interrupt flag status.
int sdrv_lin_irq_handler(uint32_t irq, void *ctrl)
Sdrv LIN default IRQ handle function.
lin_ret_status_e sdrv_lin_goto_sleep_internal(sdrv_lin_t *ctrl)
LIN require this node goto sleep.
lin_interrupt_type
Lin interrupt event type.
Definition: sdrv_lin.h:105
@ SDRV_LIN_RX_BAUDRATE_ERR
Definition: sdrv_lin.h:121
@ SDRV_LIN_RX_PIDPASS
Definition: sdrv_lin.h:116
@ SDRV_LIN_ABR_PASS
Definition: sdrv_lin.h:107
@ SDRV_LIN_TX_COMPLETE
Definition: sdrv_lin.h:109
@ SDRV_LIN_RX_STARTBIT_ERR
Definition: sdrv_lin.h:118
@ SDRV_LIN_RX_ERROR
Definition: sdrv_lin.h:114
@ SDRV_LIN_RX_CHECKSUM_ERR
Definition: sdrv_lin.h:115
@ SDRV_LIN_RX_PARITY_ERR
Definition: sdrv_lin.h:119
@ SDRV_LIN_NO_EVENT
Definition: sdrv_lin.h:106
@ SDRV_LIN_TX_TIMEOUT
Definition: sdrv_lin.h:110
@ SDRV_LIN_ABR_FAIL
Definition: sdrv_lin.h:108
@ SDRV_LIN_RX_PIDERR
Definition: sdrv_lin.h:117
@ SDRV_LIN_RX_NOISE_ERR
Definition: sdrv_lin.h:122
@ SDRV_LIN_TX_ERROR
Definition: sdrv_lin.h:111
@ SDRV_LIN_RX_RXFOVF_ERR
Definition: sdrv_lin.h:123
@ SDRV_LIN_RX_TIMEOUT
Definition: sdrv_lin.h:113
@ SDRV_LIN_RX_COMPLETE
Definition: sdrv_lin.h:112
@ SDRV_LIN_TX_TXFOVF_ERR
Definition: sdrv_lin.h:124
@ SDRV_LIN_RX_FRAME_ERR
Definition: sdrv_lin.h:120
enum lin_ch_status lin_ch_status_e
LIN Channel status.
struct sdrv_lin_config sdrv_lin_config_t
LIN controller configure.
lin_mode
LIN mode.
Definition: sdrv_lin.h:137
@ LIN_SLAVE
Definition: sdrv_lin.h:139
@ LIN_MASTER
Definition: sdrv_lin.h:138
uint32_t sdrv_lin_intr_get(sdrv_lin_t *ctrl)
Get Sdrv LIN Interrupt enable/disable status.
lin_ret_status_e sdrv_lin_controller_init(sdrv_lin_t *ctrl, const sdrv_lin_config_t *cfg, lin_callback_t callback, void *userdata)
LIN controller init.
void(* lin_callback_t)(struct sdrv_lin *ctrl, lin_interrupt_type_e linstate, void *userdata)
Definition: sdrv_lin.h:131
lin_ret_status_e sdrv_lin_wakeup_internal(sdrv_lin_t *ctrl)
LIN node wakeup.
void sdrv_lin_intr_ctrl(sdrv_lin_t *ctrl, uint32_t mask, bool value)
Enable/Disable Sdrv LIN Interrupt.
lin_ret_status_e sdrv_lin_receiveframe(sdrv_lin_t *ctrl, sdrv_lin_pdu_t *lin_pdu)
LIN receive frame.
void sdrv_lin_deinit(sdrv_lin_t *ctrl)
LIN deinit.
void sdrv_lin_intr_status_clear(sdrv_lin_t *ctrl, uint32_t mask)
Clear Sdrv lin Interrupt flag status.
enum lin_interrupt_type lin_interrupt_type_e
Definition: sdrv_lin.h:128
lin_ret_status_e sdrv_lin_set_baudrate(sdrv_lin_t *ctrl, uint32_t baud)
Configure lin baud rate.
uint8_t sdrv_lin_get_id(sdrv_lin_t *ctrl)
get lin current id.
lin_ret_status_e sdrv_lin_wakeup(sdrv_lin_t *ctrl)
LIN remote node wakeup.
lin_ch_status_e sdrv_lin_get_status(sdrv_lin_t *ctrl)
Get LIN node status .
enum lin_sub_status lin_sub_status_e
LIN frame status.
lin_ret_status_e sdrv_lin_transmit_status_get(sdrv_lin_t *ctrl, uint8_t *bytes_remaining)
Get LIN transmit status.
lin_ret_status_e sdrv_lin_transmitframe(sdrv_lin_t *ctrl, sdrv_lin_pdu_t *lin_pdu, uint32_t times)
LIN transmit frame.
lin_ret_status_e sdrv_lin_get_fifodata(sdrv_lin_t *ctrl, uint8_t *data, size_t size, uint32_t times)
LIN get rx fifo data.
lin_ch_status
LIN Channel status.
Definition: sdrv_lin.h:153
@ LIN_CH_OPERATIONAL_STATE
Definition: sdrv_lin.h:156
@ LIN_CH_UNINITIAL_STATE
Definition: sdrv_lin.h:154
@ LIN_CH_SLEEP_STATE
Definition: sdrv_lin.h:155
void sdrv_lin_clear_transfer_status(sdrv_lin_t *ctrl)
Clear LIN tranfer status .
lin_ret_status
LIN return status.
Definition: sdrv_lin.h:162
@ STATUS_INVALID_PARAM
Definition: sdrv_lin.h:167
@ STATUS_TIMEOUT
Definition: sdrv_lin.h:165
@ STATUS_FAIL
Definition: sdrv_lin.h:164
@ STATUS_BUSY
Definition: sdrv_lin.h:166
@ STATUS_UNINIT
Definition: sdrv_lin.h:171
@ STATUS_SLEEP
Definition: sdrv_lin.h:169
@ STATUS_SUCCESS
Definition: sdrv_lin.h:163
lin_sub_status_e sdrv_lin_get_transfer_status(sdrv_lin_t *ctrl)
Get LIN tranfer status .
lin_ret_status_e sdrv_lin_goto_sleep(sdrv_lin_t *ctrl)
LIN require slave node goto sleep.
enum lin_cs_mode lin_cs_mode_e
LIN checksum mode.
lin_ret_status_e sdrv_lin_receive_status_get(sdrv_lin_t *ctrl, uint8_t *bytes_remaining)
Get LIN async receive status.
SemiDrive UART driver header file.
enum sdrv_abr_max sdrv_abr_max_e
Sdrv UART the character count that abr expect to recv and match.
LIN controller configure.
Definition: sdrv_lin.h:236
uint32_t base
Definition: sdrv_lin.h:237
uint8_t timeout_value
Definition: sdrv_lin.h:271
lin_cs_mode_e checksum
Definition: sdrv_lin.h:242
lin_mode_e mode
Definition: sdrv_lin.h:241
uint8_t abr_en
Definition: sdrv_lin.h:247
uint32_t clk_freq
Definition: sdrv_lin.h:240
uint32_t period_ms
Definition: sdrv_lin.h:278
uint32_t baud
Definition: sdrv_lin.h:239
bool mainfunction_polling
Definition: sdrv_lin.h:276
int irq
Definition: sdrv_lin.h:238
bool transfer_timeout
Definition: sdrv_lin.h:269
sdrv_abr_max_e match_num
Definition: sdrv_lin.h:249
Definition: sdrv_lin.h:282
uint8_t id
Definition: sdrv_lin.h:283
lin_cs_mode_e checksum
Definition: sdrv_lin.h:284
uint8_t * data
Definition: sdrv_lin.h:286
uint8_t size
Definition: sdrv_lin.h:285
LIN controller struct.
Definition: sdrv_lin.h:193
uint8_t tx_size
Definition: sdrv_lin.h:214
uint8_t * rx_buff
Definition: sdrv_lin.h:218
uint32_t base
Definition: sdrv_lin.h:195
volatile uint8_t current_id
Definition: sdrv_lin.h:203
uint8_t rx_size
Definition: sdrv_lin.h:219
volatile uint8_t tx_remain
Definition: sdrv_lin.h:215
lin_cs_mode_e checksum
Definition: sdrv_lin.h:202
lin_mode_e mode
Definition: sdrv_lin.h:201
uint32_t clk_freq
Definition: sdrv_lin.h:197
volatile bool rx_error_invalid
Definition: sdrv_lin.h:210
volatile lin_interrupt_type_e current_event
Definition: sdrv_lin.h:204
volatile uint8_t rx_remain
Definition: sdrv_lin.h:220
volatile uint32_t abr_state
Definition: sdrv_lin.h:208
volatile uint32_t rx_state
Definition: sdrv_lin.h:221
volatile uint32_t tx_state
Definition: sdrv_lin.h:216
uint32_t baud
Definition: sdrv_lin.h:200
const uint8_t * tx_buff
Definition: sdrv_lin.h:213
volatile lin_ch_status_e channel_sta
Definition: sdrv_lin.h:205
int irq
Definition: sdrv_lin.h:196
lin_callback_t callback
Definition: sdrv_lin.h:206
void * userdata
Definition: sdrv_lin.h:207