From 0c79f896caf1a0ac16dd92810c4b15bfff00bdb3 Mon Sep 17 00:00:00 2001 From: Kristofer Jonsson Date: Wed, 2 Jun 2021 17:15:57 +0200 Subject: Adding documentation Adding documentation, component- and sequence diagrams how the driver library and kernel driver work. Change-Id: I4e71b5e1f5d926386efe8f103a0f4fbc8636a494 --- docs/driver_library_component.puml | 18 ++++++++ docs/driver_library_component.svg | 31 +++++++++++++ docs/driver_library_sequence.puml | 79 ++++++++++++++++++++++++++++++++ docs/driver_library_sequence.svg | 92 ++++++++++++++++++++++++++++++++++++++ docs/kernel_buffer.puml | 52 +++++++++++++++++++++ docs/kernel_buffer.svg | 65 +++++++++++++++++++++++++++ docs/kernel_inference.puml | 79 ++++++++++++++++++++++++++++++++ docs/kernel_inference.svg | 92 ++++++++++++++++++++++++++++++++++++++ docs/kernel_network.puml | 41 +++++++++++++++++ docs/kernel_network.svg | 54 ++++++++++++++++++++++ 10 files changed, 603 insertions(+) create mode 100644 docs/driver_library_component.puml create mode 100644 docs/driver_library_component.svg create mode 100644 docs/driver_library_sequence.puml create mode 100644 docs/driver_library_sequence.svg create mode 100644 docs/kernel_buffer.puml create mode 100644 docs/kernel_buffer.svg create mode 100644 docs/kernel_inference.puml create mode 100644 docs/kernel_inference.svg create mode 100644 docs/kernel_network.puml create mode 100644 docs/kernel_network.svg (limited to 'docs') diff --git a/docs/driver_library_component.puml b/docs/driver_library_component.puml new file mode 100644 index 0000000..1b640e2 --- /dev/null +++ b/docs/driver_library_component.puml @@ -0,0 +1,18 @@ +@startuml + +skinparam backgroundColor #FEFEFE + +[Inference] as inf +[Network] as net +[Buffer] as buf +[Device] as dev + +inf -> net +inf -> buf: IFM and OFM + +net --> dev +net --> buf: Network model + +buf -> dev + +@enduml \ No newline at end of file diff --git a/docs/driver_library_component.svg b/docs/driver_library_component.svg new file mode 100644 index 0000000..bcb43f9 --- /dev/null +++ b/docs/driver_library_component.svg @@ -0,0 +1,31 @@ +InferenceNetworkBufferDeviceIFM and OFMNetwork model \ No newline at end of file diff --git a/docs/driver_library_sequence.puml b/docs/driver_library_sequence.puml new file mode 100644 index 0000000..adac2f9 --- /dev/null +++ b/docs/driver_library_sequence.puml @@ -0,0 +1,79 @@ +@startuml + +skinparam backgroundColor #FEFEFE + +box "Application" #0091BD +participant "main()" as main +end box + +box "Driver library" #00C1DE +participant "Device" as ddev +participant "Buffer" as dbuf +participant "Network" as dnet +participant "Inference" as dinf +end box + +box "Kernel driver" #7D868C +participant "Device" as kdev +participant "Buffer" as kbuf +participant "Network" as knet +participant "Inference" as kinf +end box + +note over ddev + Create device +end note +activate main +main -> ddev++: Device() + ddev -> kdev++: open() + return file descriptor +return + +note over dnet + Allocate and fill network buffer +end note + +main -> dbuf++: Buffer(device) + dbuf -> kbuf++: ioctl(BUFFER_CREATE) + return file descriptor +return + +note over dnet + Create network, parse network model +end note + +main -> dnet++: Network(device, buffer) + dnet -> knet++: ioctl(NETWORK_CREATE) + return file descriptor + + dnet -> dnet: Parse network model +return + +loop Allocate and fill IFM buffers + main -> dbuf++: Buffer(device) + dbuf -> kbuf++: ioctl(BUFFER_CREATE) + return file descriptor + return +end loop + +loop Allocate OFM buffers + main -> dbuf++: Buffer(device) + dbuf -> kbuf++: ioctl(BUFFER_CREATE) + return file descriptor + return +end loop + +note over dinf + Create and run inference +end note +main -> dinf++: Inference(network, ifm, ofm) + dinf -> kinf++: ioctl(INFERENCE_CREATE) + return file descriptor +return + +main -> dinf++: wait(file descriptor) + dinf -> kinf++: poll(file descriptor) + return +return + +@enduml diff --git a/docs/driver_library_sequence.svg b/docs/driver_library_sequence.svg new file mode 100644 index 0000000..1103a05 --- /dev/null +++ b/docs/driver_library_sequence.svg @@ -0,0 +1,92 @@ +ApplicationDriver libraryKernel drivermain()main()DeviceDeviceBufferBufferNetworkNetworkInferenceInferenceDeviceDeviceBufferBufferNetworkNetworkInferenceInferenceCreate deviceDevice()open(<device node>)file descriptorAllocate and fill network bufferBuffer(device)ioctl(BUFFER_CREATE)file descriptorCreate network, parse network modelNetwork(device, buffer)ioctl(NETWORK_CREATE)file descriptorParse network modelloop[Allocate and fill IFM buffers]Buffer(device)ioctl(BUFFER_CREATE)file descriptorloop[Allocate OFM buffers]Buffer(device)ioctl(BUFFER_CREATE)file descriptorCreate and run inferenceInference(network, ifm, ofm)ioctl(INFERENCE_CREATE)file descriptorwait(file descriptor)poll(file descriptor) \ No newline at end of file diff --git a/docs/kernel_buffer.puml b/docs/kernel_buffer.puml new file mode 100644 index 0000000..dc2c744 --- /dev/null +++ b/docs/kernel_buffer.puml @@ -0,0 +1,52 @@ +@startuml + +skinparam backgroundColor #FEFEFE + +box "Application" #0091BD +participant "main()" as main +end box + +box "Driver library" #00C1DE +participant "Device" as ddev +participant "Buffer" as dbuf +participant "Network" as dnet +participant "Inference" as dinf +end box + +box "Kernel driver" #7D868C +participant "Device" as kdev +participant "Buffer" as kbuf +participant "Network" as knet +participant "Inference" as kinf +end box + +activate main + +main -> ddev++: Device() + note over kdev + Open device node + end note + + ddev -> kdev++: open() + return file descriptor +return + +main -> dbuf++: Buffer(device) + dbuf -> kdev++: ioctl(BUFFER_CREATE) + note over kbuf + Create buffer and return file descriptor + end note + + kdev -> kbuf++: create() + return file descriptor + return file descriptor + + note over kbuf + Memory map buffer + end note + + dbuf -> kbuf++: mmap(file descriptor) + return +return + +@enduml diff --git a/docs/kernel_buffer.svg b/docs/kernel_buffer.svg new file mode 100644 index 0000000..a3b2a48 --- /dev/null +++ b/docs/kernel_buffer.svg @@ -0,0 +1,65 @@ +ApplicationDriver libraryKernel drivermain()main()DeviceDeviceBufferBufferNetworkNetworkInferenceInferenceDeviceDeviceBufferBufferNetworkNetworkInferenceInferenceDevice()Open device nodeopen(<device node>)file descriptorBuffer(device)ioctl(BUFFER_CREATE)Create buffer and return file descriptorcreate()file descriptorfile descriptorMemory map buffermmap(file descriptor) \ No newline at end of file diff --git a/docs/kernel_inference.puml b/docs/kernel_inference.puml new file mode 100644 index 0000000..b521bdc --- /dev/null +++ b/docs/kernel_inference.puml @@ -0,0 +1,79 @@ +@startuml + +skinparam backgroundColor #FEFEFE + +box "Application" #0091BD +participant "main()" as main +end box + +box "Driver library" #00C1DE +participant "Device" as ddev +participant "Buffer" as dbuf +participant "Network" as dnet +participant "Inference" as dinf +end box + +box "Kernel driver" #7D868C +participant "Device" as kdev +participant "Buffer" as kbuf +participant "Network" as knet +participant "Inference" as kinf +participant "Mailbox" as kmbox +end box + +box "Cortex-M application" #E5ECEB +participant "Message process" as cmsg +end box + +activate main + +note over main + Create device + Create network + Allocate and fill IFM buffers + Allocate OFM buffers +end note + +main -> dinf++: Inference(network, ifm, ofm) + dinf -> knet++: ioctl(INFERENCE_CREATE, network, ifm, ofm) + note over kinf + Create inference + end note + + knet -> kinf++: create(network, ifm, ofm) + kinf -> kmbox++: inference() + note over kmbox + Write inference request to queue in shared memory + Send IRQ + end note + + kmbox -> cmsg: INFERENCE_REQUEST + return + return file descriptor + return file descriptor +return + +main -> dinf++: wait() + dinf -> kinf++: poll() + + cmsg -> kdev++: INFERENCE_RESPONSE + note over kdev + Inference response is handled by the IRQ bottom handler thread + Message is read from queue in shared memory + end note + + kdev -> kmbox++: read() + return + + note over kinf + Inference response handler unlocks the polling thread + end note + + kdev -> kinf++: inference_response() + return + deactivate cmsg + + return +return + +@enduml diff --git a/docs/kernel_inference.svg b/docs/kernel_inference.svg new file mode 100644 index 0000000..53ed8b0 --- /dev/null +++ b/docs/kernel_inference.svg @@ -0,0 +1,92 @@ +ApplicationDriver libraryKernel driverCortex-M applicationmain()main()DeviceDeviceBufferBufferNetworkNetworkInferenceInferenceDeviceDeviceBufferBufferNetworkNetworkInferenceInferenceMailboxMailboxMessage processMessage processCreate deviceCreate networkAllocate and fill IFM buffersAllocate OFM buffersInference(network, ifm, ofm)ioctl(INFERENCE_CREATE, network, ifm, ofm)Create inferencecreate(network, ifm, ofm)inference()Write inference request to queue in shared memorySend IRQINFERENCE_REQUESTfile descriptorfile descriptorwait()poll()INFERENCE_RESPONSEInference response is handled by the IRQ bottom handler threadMessage is read from queue in shared memoryread()Inference response handler unlocks the polling threadinference_response() \ No newline at end of file diff --git a/docs/kernel_network.puml b/docs/kernel_network.puml new file mode 100644 index 0000000..39c7f55 --- /dev/null +++ b/docs/kernel_network.puml @@ -0,0 +1,41 @@ +@startuml + +skinparam backgroundColor #FEFEFE + +box "Application" #0091BD +participant "main()" as main +end box + +box "Driver library" #00C1DE +participant "Device" as ddev +participant "Buffer" as dbuf +participant "Network" as dnet +participant "Inference" as dinf +end box + +box "Kernel driver" #7D868C +participant "Device" as kdev +participant "Buffer" as kbuf +participant "Network" as knet +participant "Inference" as kinf +end box + +activate main + +note over main + Create device + Allocate and fill network buffer +end note + +main -> dnet++: Network(device, buffer) + dnet -> kdev++: ioctl(NETWORK_CREATE, buffer) + note over knet + Create network and return file descriptor + end note + + kdev -> knet++: create(buffer) + return file descriptor + return file descriptor +return + +@enduml diff --git a/docs/kernel_network.svg b/docs/kernel_network.svg new file mode 100644 index 0000000..8b3b4a3 --- /dev/null +++ b/docs/kernel_network.svg @@ -0,0 +1,54 @@ +ApplicationDriver libraryKernel drivermain()main()DeviceDeviceBufferBufferNetworkNetworkInferenceInferenceDeviceDeviceBufferBufferNetworkNetworkInferenceInferenceCreate deviceAllocate and fill network bufferNetwork(device, buffer)ioctl(NETWORK_CREATE, buffer)Create network and return file descriptorcreate(buffer)file descriptorfile descriptor \ No newline at end of file -- cgit v1.2.1