HAL SMARTCARD use cases

acquire_release

@startuml

participant "User 1" as p1

participant "User 2" as p2

participant "HAL SMARTCARD driver" as p3

participant "HAL OS wrapper" as p4



p1-[#green]->p3 : <color #Green> HAL_SMARTCARD_AcquireBus() </color>

p3-[#green]->p4 : <color #Green> HAL_OS_SemaphoreTake </color>

p4-[#green]-->p3

p3-[#green]-->p1: <color #Green> HAL_OK </color>

note over p3

Bus acquired by user 1. Any Process can be executed. For instance : HAL_SMARTCARD_Receive()

end note

p2-[#red]->p3 : <color #Red> HAL_SMARTCARD_AcquireBus() </color>

p3-[#red]->p4 : <color #Red> HAL_OS_SemaphoreTake </color>

p1-[#green]->p3 : <color #Green> HAL_SMARTCARD_ReleaseBus() </color>

p3-[#green]-->p1:<color #Green>  HAL_OK </color>

p4-[#red]-->p3

p3-[#red]-->p2: <color #Red> HAL_OK </color>

note over p3

Bus acquired by user 1. Any Process can be executed. For instance : HAL_SMARTCARD_Receive()

end note

@enduml

Called functions:

full_deinit

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "System Driver" as p3



== SMARTCARD HAL DeInitialization ==

p1->p2: HAL_SMARTCARD_DeInit

note over p2

global_state = HAL_SMARTCARD_STATE_RESET

end note

p2-[#green]-->p1: <color #Green> HAL_OK </color>



== SMARTCARD system DeInitialization ==

p1->p3: ForceReset_SMARTCARD

p1->p3: ReleaseReset_SMARTCARD

p1->p3: Disable SMARTCARD clock

p1->p3: DeInitialization of GPIOs

alt #lightgrey if USE_HAL_SMARTCARD_DMA == 1

p1->p3: Disable DMA

end

alt #lightgrey if interrupts needed == 1

p1->p3: Disable needed Interrupts

end

@enduml

Called functions:

full_init

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "System Driver" as p3



== SMARTCARD HAL Initialization ==

p1->p2: HAL_SMARTCARD_Init

note over p2

global_state = HAL_SMARTCARD_STATE_INIT

end note

alt USE_HAL_SMARTCARD_CLK_ENABLE_MODEL == USE_CLK_ENABLE

p2->p3: Enable the SMARTCARD clock

end

p2-[#green]-->p1: <color #Green> HAL_OK </color>



== SMARTCARD System Initialization ==

note over p1

SMARTCARD System initialization can be called before

SMARTCARD HAL initialization

end note

alt #lightgrey if USE_HAL_SMARTCARD_CLK_ENABLE_MODEL == HAL_CLK_ENABLE_NO

p1->p3: Enable the SMARTCARD clock

end



p1->p3: Initialization of GPIOs



alt #lightgrey if USE_HAL_SMARTCARD_DMA == 1

p1->p3: Initialization of DMA

end



alt #lightgrey if interrupts needed == 1

p1->p3: Enable NVIC

end



== SMARTCARD Configuration ==

p1->p2: HAL_SMARTCARD_SetConfig

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2-[#green]-->p1: <color #Green> HAL_OK </color>



note over p1

Driver global state is HAL_SMARTCARD_STATE_IDLE

User can start any process or execute any configuration

end note



== Advanced SMARTCARD Configuration ==

p1->p2: HAL_SMARTCARD_SetConfig{feature}

p2-[#green]-->p1: <color #Green> HAL_OK </color>

p1->p2: HAL_SMARTCARD_EnableXXX

p2-[#green]-->p1: <color #Green> HAL_OK </color>

@enduml

Called functions:

prerequisite

@startuml

participant "User Application" as p1

participant "System Driver" as p2



== Prerequisite ==

p1->p2: HAL_Init

p2-->p1

p1->p2: Configure system clock

p2-->p1

@enduml

Called functions:

process_abort

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "DMA" as p3

== SMARTCARD HAL Abort ==

p1->p2: HAL_SMARTCARD_Abort()

note over p2

global_state = HAL_SMARTCARD_STATE_ABORT

end note

p2->p3: HAL_DMA_Abort(timeout_ms)



alt successful case

p3-[#green]-->p2: <color #Green> HAL_OK </color>

p2-[#green]-->p1: <color #Green> HAL_OK </color>

else timeout

p3-[#03234b]->p2: <color #03234b> HAL_TIMEOUT </color>

p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>

end

note over p1

Driver global state is HAL_SMARTCARD_STATE_IDLE

User can start any process or execute any configuration

end note

@enduml

Called functions:

process_abortIT

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "DMA" as p3

participant "DMA_IRQHandler" as p4



== SMARTCARD HAL Abort IT ==

p1->p2: HAL_SMARTCARD_Abort_IT()

note over p2

global_state = HAL_SMARTCARD_STATE_ABORT

end note

p2->p3: HAL_DMA_Abort_IT()

p3-[#green]-->p2: <color #Green> HAL_OK </color>

p2-[#green]-->p1: <color #Green> HAL_OK </color>

p4<--: DMAx interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: SMARTCARD_Rx/TxAbortCallback

note over p2

Driver global state is HAL_SMARTCARD_STATE_IDLE

User can start any process or execute any configuration

end note

p2->p1: HAL_SMARTCARD_AbortCpltCallBack

p1-->p2

p2-->p3

p3-->p4

p4-->





@enduml

Called functions:

process_tx_polling

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2



== SMARTCARD HAL Transmit Polling ==

p1->p2: HAL_SMARTCARD_Transmit(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte, uint32_t timeout_ms)



note over p2

global_state = HAL_SMARTCARD_STATE_TX_ACTIVE

end note



alt successful case

p2-[#green]-->p1: <color #Green> HAL_OK </color>

else invalid param

p2-[#8c0078]->p1: <color #8c0078> HAL_INVALID_PARAM </color>

else busy

p2-[#ffd200]->p1: <color #ffd200> HAL_BUSY </color>

note over p1

Another Process is running...

Please wait and retry

end note

else timeout

p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>

end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

note over p1

Driver global state is HAL_SMARTCARD_STATE_IDLE

User can start any process or execute any configuration

end note

@enduml

Called functions:

process_rx_polling

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2



== SMARTCARD HAL Receive Polling ==

p1->p2: HAL_SMARTCARD_Receive(hal_smartcard_handle_t *hsmartcard, void *p_data, uint32_t size_byte, uint32_t timeout_ms)



note over p2

global_state = HAL_SMARTCARD_STATE_RX_ACTIVE

end note



alt successful case

p2-[#green]-->p1: <color #Green> HAL_OK </color>

else invalid param

p2-[#8c0078]->p1: <color #8c0078> HAL_INVALID_PARAM </color>

else busy

p2-[#ffd200]->p1: <color #ffd200> HAL_BUSY </color>

note over p1

Another Process is running...

Please wait and retry

end note

else timeout

p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>

end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

note over p1

Driver global state is HAL_SMARTCARD_STATE_IDLE

User can start any process or execute any configuration

end note

@enduml

Called functions:

process_rx_it

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "SMARTCARD_IRQHandler" as p3



== SMARTCARD HAL Receive IT ==

p1->p2: HAL_SMARTCARD_Receive_IT(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)

note over p2

global_state = HAL_SMARTCARD_STATE_RX_ACTIVE

end note

p2-[#green]-->p1: <color #Green> HAL_OK </color>



alt successful case

p3<-: SMARTCARD data interrupt

p3->p2: HAL_SMARTCARD_IRQHandler

note over p2: All data (size_byte == hsmartcard->rx_xfer_count) have been received

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_RxCpltCallback()



else error

p3<-: SMARTCARD error interrupt

p3->p2:HAL_SMARTCARD_IRQHandler

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_ErrorCallback



end



alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

@enduml

Called functions:

process_rx_dma

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "DMA" as p3

participant "DMAx_IRQHandler" as p4



== SMARTCARD HAL Receive DMA ==

p1->p2: HAL_SMARTCARD_Receive_DMA(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)

note over p2

global_state = HAL_SMARTCARD_STATE_RX_ACTIVE

end note

p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt

note over p3

interrupt dma can be :

HAL_SMARTCARD_OPT_DMA_RX_IT_HT

HAL_SMARTCARD_OPT_DMA_RX_IT_DEFAULT

end note

p3-[#green]-->p2: <color #Green> HAL_OK </color>

p2-[#green]-->p1: <color #Green> HAL_OK </color>



alt successful case

p4<-: DMAx complete interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferCpltCallback

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_RxCpltCallback()

note over p1

All data(size_byte =hsmartcard->rx_xfer_count) have been received

end note



else error



p4<-: DMAx error interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferErrorCallback

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_ErrorCallback



end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

@enduml

Called functions:

process_tx_it

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "SMARTCARD_IRQHandler" as p3



== SMARTCARD HAL Transmit IT ==

p1->p2: HAL_SMARTCARD_Transmit_IT(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)

note over p2

global_state = HAL_SMARTCARD_STATE_TX_ACTIVE

end note

p2-[#green]-->p1: <color #Green> HAL_OK </color>



alt successful case

p3<-: SMARTCARD Transmit Complete (TC)

p3->p2: HAL_SMARTCARD_IRQHandler

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_TxCpltCallback



else error

p3<-: SMARTCARD error interrupt

p3->p2:HAL_SMARTCARD_IRQHandler

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_ErrorCallback

end



alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

@enduml

Called functions:

process_tx_dma

@startuml

participant "User Application" as p1

participant "HAL SMARTCARD driver" as p2

participant "SMARTCARD_IRQHandler" as p5

participant "DMA" as p3

participant "DMAx_IRQHandler" as p4



== SMARTCARD HAL Transmit DMA ==

p1->p2: HAL_SMARTCARD_Transmit_DMA(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)

note over p2

global_state = HAL_SMARTCARD_STATE_TX_ACTIVE

end note

p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt

p3-[#green]-->p2: <color #Green> HAL_OK </color>

p2-[#green]-->p1: <color #Green> HAL_OK </color>



alt successful case

p4<-: DMAx complete interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferCpltCallback

p2->p2: Enable SMARTCARD Transmit Complete IRQ (TCIE)

p2-->p3

p3-->p4

p4-->



p5<-: SMARTCARD Transmit Complete (TC)

p5->p2: HAL_SMARTCARD_IRQHandler

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_TxCpltCallback



else error



p4<-: DMAx error interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferErrorCallback

note over p2

global_state = HAL_SMARTCARD_STATE_IDLE

end note

p2->p1: HAL_SMARTCARD_ErrorCallback



end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1

p1->p2: HAL_SMARTCARD_GetLastErrorCodes()

p2-->p1: (HAL_SMARTCARD_ERROR_XXX)

end

@enduml

Called functions: