ChibiOS/os/xhal/dox/xhal_arch.dox

245 lines
7.3 KiB
Plaintext

/*
ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
This file is part of ChibiOS.
ChibiOS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 3 of the License.
ChibiOS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @startuml {xhal_drvsm.png} "XHAL Drivers State Machine"
* hide empty description
*
* state UNINIT
* state STOP
* state STOPPING
* state STARTING
* state READY
* state ACTIVE
* state ERROR
* note left of STOPPING
* Optional state used when
* stopping a driver is a
* slow operation.
* end note
* note left of STARTING
* Optional state used when
* starting a driver is a
* slow operation.
* end note
* note left of ERROR
* Optional state is used by drivers
* requiring a persistent error
* condition.
* end note
*
* [*] --> UNINIT
* UNINIT --> STOP : xxxObjectInit()
* STOP --> READY : drvStart()
* STOP --> STARTING : drvStart()\nslow start
* STARTING -[dotted]-> READY : slow start\ncomplete
* READY --> READY : drvStart()\nignored
* READY --> READY : drvConfigure()
* READY --> STOP : drvStop()
* STOP --> STOP : drvStop()\nignored
* READY --> ACTIVE : start operation
* ACTIVE -[dotted]-> READY : asynchronous\nend operation\ncallback
* ACTIVE --> STOP : drvStop()\nhard abort
* ACTIVE -[dotted]-> ERROR : asynchronous\noperation error\ncallback
* ACTIVE --> STOPPING : drvStop()\nslow stop
* STOPPING -[dotted]-> STOP : slow stop\ncomplete
* ERROR --> READY : drvStart()
* ERROR --> STOP : drvStop()
* ERROR --> READY : error cleared
*
* @enduml
*
* @startuml {xhal_drvsm.png} "XHAL Drivers State Machine"
* hide empty description
*
* state RCLOSE <<choice>>
* state ACLOSE <<choice>>
* state STOP : cnt == 0
* state READY : cnt > 0
* state ACTIVE : cnt > 0
* state ERROR : cnt > 0
* note left of ACTIVE
* This state is used by drivers
* implementing asynchronous
* operations.
* end note
* note left of ERROR
* This state is used by drivers
* requiring a persistent error
* condition.
* end note
*
* [*] --> UNINIT
* UNINIT --> STOP : xxxObjectInit()
* STOP --> READY : drvOpen()\ncall start()
* READY --> READY : drvOpen() cnt++
* READY -u-> RCLOSE : drvClose() cnt--
* RCLOSE --> STOP : [cnt == 0]\ncall stop()
* RCLOSE --> READY : [cnt > 0]
* READY --> ACTIVE : start operation
* ACTIVE --> ACTIVE : drvOpen() cnt++
* ACTIVE -[dotted]-> READY : asynchronous\nend operation\ncallback
* ACTIVE --> ACLOSE : drvClose() cnt--
* ACLOSE --> STOP : [cnt == 0]\ncall stop()\noperation forcibly aborted
* ACLOSE --> ACTIVE : [cnt > 0]
* ACTIVE -[dotted]-> ERROR : asynchronous\noperation error\ncallback
* ERROR --> ERROR : drvOpen() cnt++
* ERROR --> READY : error cleared
* ERROR --> RCLOSE : drvClose()
*
* @enduml
*
* @startuml {xhal_arch.png} "XHAL Architecture"
* package "Base OOP Package" {
* interface base_interface_i {
* + {static} oopIfGetOwner()
* + {static} oopIfObjectInit()
* }
* interface sequential_stream_i extends base_interface_i{
* + {abstract} stmWrite()
* + {abstract} stmRead()
* + {abstract} stmPut()
* + {abstract} stmGet()
* }
* abstract class base_object_c {
* - vmt: void *
* # __bo_objinit_impl()
* # {abstract} __bo_dispose_impl()
* + {static} oopGetOwner()
* + {static} oopGetIf()
* + {static} oopAssert()
* + {static} oopLock()
* + {static} oopUnlock()
* }
* abstract class referenced_object_c extends base_object_c {
* - cnt: object_references_t
* # __ro_objinit_impl()
* # {abstract} __ro_dispose_impl()
* # __ro_addref_impl()
* # __ro_release_impl()
* + {abstract} roAddRef()
* + {abstract} roRelease()
* }
* abstract class synchronized_object_c extends referenced_object_c {
* - mutex: mutex_t
* # __so_objinit_impl()
* # {abstract} __so_dispose_impl()
* + soLock()
* + soUnlock()
* }
* }
* package "XHAL Common Classes" {
* interface asynchronous_channel_i extends sequential_stream_i {
* + {abstract} chnWriteTimeout()
* + {abstract} chnReadTimeout()
* + {abstract} chnPutTimeout()
* + {abstract} chnGetTimeout()
* + {abstract} chnGetAndClearFlags()
* + {abstract} chnControl()
* }
* abstract class hal_base_driver_c extends base_object_c {
* - state: driver_state_t *
* - opencnt: unsigned int
* - owner: void *
* - mutex: mutex_t *
* - id: unsigned int
* - name: const char *
* - regent: hal_regent_t
* - {abstract} __drv_start()
* - {abstract} __drv_stop()
* # __drv_objinit_impl()
* # {abstract} __drv_dispose_impl()
* # __drv_get_state()
* # __drv_set_state()
* + {static} drvInit()
* + {abstract} drvConfigure()
* + drvOpen()
* + drvClose()
* + drvGetOwnerX()
* + drvSetOwnerX()
* + drvGetNameX()
* + drvSetNameX()
* + drvLock()
* + drvUnlock()
* }
* abstract class hal_events_driver_c extends hal_base_driver_c {
* - flags: driver_flags_t
* - event: event_source_t
* # __evd_objinit_impl()
* # {abstract} __evd_dispose_impl()
* # __evd_add_flags_i()
* + evdGetFlagsI()
* + evdGetAndClearFlagsI()
* }
* abstract class hal_buffered_serial_c extends hal_events_driver_c \
* implements asynchronous_channel_i {
* - iqueue: input_queue_t
* - oqueue: output_queue_t
* # __bs_objinit_impl()
* # {abstract} __bs_dispose_impl()
* # bsIncomingDataI()
* # bsRequestDataI()
* }
* }
* package "XHAL Drivers" {
* class hal_sio_driver_c extends hal_base_driver_c \
* implements asynchronous_channel_i {
* - enabled: driver_flags_t
* - cb: siocb_t
* - synch_rx: thread_reference_t
* - synch_rxidle: thread_reference_t
* - synch_tx: thread_reference_t
* - synch_txend: thread_reference_t
* # __sio_invoke_callback()
* ~ {static} sioInit()
* + sioObjectInit()
* + {abstract} sioDispose()
* + sioSetCallbackX()
* + sioWriteEnable()
* + sioSetEnable()
* + sioClearEnable()
* + sioGetAndClearErrorFlags()
* + sioGetAndClearFlags()
* + sioGetFlags()
* + sioSynchronizeRX()
* + sioSynchronizeRXIdle()
* + sioSynchronizeTX()
* + sioSynchronizeTXEnd()
* }
* class hal_serial_driver_c extends hal_buffered_serial_c {
* ~ {static} sdInit()
* + sdObjectInit()
* + {abstract} sdDispose()
* }
* class hal_pwm_driver_c extends hal_base_driver_c {
* ~ {static} pwmInit()
* + pwmObjectInit()
* + {abstract} pwmDispose()
* }
* }
* package "XHAL Complex Drivers" {
* class hal_buffered_sio_driver_c extends hal_buffered_serial_c {
* + bsioObjectInit()
* + {abstract} bsioDispose()
* }
* hal_buffered_sio_driver_c "1" o-- hal_sio_driver_c
* }
* @enduml
*/