Skip to content

Finding Drivers and Libraries

The directory structure of libraries in SJSU-Dev2 is hierarchical where each layer indicates a logical separation from the lowest layer, the CPU/Platform, to the peripherals (systems in the periphery of CPU but not the CPU), to the HAL, which signifies devices and systems external to the platform, and finally to the application. The application layer tends to utilize a combination of elements in the layers below. utility/ and newlib are orthogonal to the hierarchy thus they can be access by an layer of the code base.

Tree showing code base structure

library/
├── platforms/
├── peripherals/
├── devices/
├── systems/
├── testing/
├── newlib/
├── third_party/
└── utility/

utility

Contains system agnostic utility functions and classes for things like bit manipulation, math functions, debugging libraries, logging, etc. Can be used by any library layer of the code.

platforms

Contains source files for initializing the microcontroller as well as platform specific system definitions. This layer typically includes a startup.cpp, which initializes the system then calls main(). You shouldn't need to include anything from this layer.

platforms/
├── platform_0/
├── platform_1/
├── ...
├── platform_N/
└── common_l0_methods.hpp

peripherals

Contains drivers for controlling peripherals internal to a microcontroller, like GPIO, SPI, UART, I2C, ADC, PWM, etc...

peripherals/
├── platform_0/
├── platform_1/
├── ...
├── platform_N/
├── interface_1.hpp
├── interface_2.hpp
├── ...
└── interface_N.hpp

The folders of L1 are named after the platform. For example peripherals/lpc40xx contains device drivers for the lpc40xx series of MCUs. peripherals/lpc40xx/gpio.hpp would be the driver for the lpc40xx gpio peripheral.

The files in L1, not within a platform folder are the peripheral interfaces. For example, peripherals/gpio.hpp contains the sjsu::Gpio interface as well as some supporting libraries. sjsu::Gpio will contain the class methods that all drivers MUST implement. So you can be assured that calling sjsu::Gpio::SetHigh() behaves in a consistent manor on all platforms.

devices

HAL stands for Hardware Abstraction Layer, and contains drivers for controlling devices and systems external to the MCU. These can be sensors, displays, switches, memory, etc. devices device drivers will almost always require L1 peripherals in order to operate. For example, an LCD driver will need a set of Gpios in order to operate.

devices/
├── actuators/
├── audio/
├── boards/
├── communication/
├── memory/
├── power/
├── sensors/
├── switches/
└── etc.../

The format of the folder is similar to L1, but rather than having directories for each platform, they are separated into categories.

systems

Holds high layer software systems like graphics engines, task objects, task schedulers, and command line interfaces and command line objects.

systems/
├── high_layer_module_0.hpp
├── high_layer_module_1.hpp
├── ...
├── high_layer_module_N.hpp
└── high_layer_modules_directory/

testing

Holds high layer software systems like graphics engines, task objects, task schedulers, and command lines. These should only be included for unit testing purposes.

testing/
├── factory_test.hpp
├── freertos_mocks.cpp
├── main_test.cpp
└── testing_frameworks.hpp

third_party

Contains third party projects that are used by the SJSU-Dev2 libraries.

third_party/
├── doctest
├── fakeit
├── fatfs
├── fff
├── font8x8
├── FreeRTOS
├── microrl
├── printf
└── third_party.mk