Driver improvements (#535)
- New drivers: - SD SPI - spi_peripheral - touch_placeholder - display_placeholder - Devicetree compiler: - Implement phandle-arrays - Implement device addresses - Add placeholder drivers to all devices with a SPI display - SPI driver: add `cs-pins` and set them to high on driver start - FileSystem: add `file_system_set_owner()` and `file_system_get_owner()` - File locking is now checking if the related `FileSystem` is part of a shared SPI bus - Add `device_get_child_count()` - SDMMC driver: Remove default of `slot` value - Fix for Crowpanel Basic 3.5" display (add delay to booting) - Fix for LilyGO T-HMI SD card mounting (delayed mounting by disabling it initially in the dts)
This commit is contained in:
committed by
GitHub
parent
e50659a3fb
commit
599fa46766
@@ -0,0 +1,5 @@
|
||||
description: Display placeholder
|
||||
|
||||
compatible: "display-placeholder"
|
||||
|
||||
properties: {}
|
||||
@@ -0,0 +1,5 @@
|
||||
description: SPI peripheral
|
||||
|
||||
compatible: "spi-peripheral"
|
||||
|
||||
properties: {}
|
||||
@@ -0,0 +1,5 @@
|
||||
description: Touch placeholder
|
||||
|
||||
compatible: "touch-placeholder"
|
||||
|
||||
properties: {}
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <tactility/bindings/bindings.h>
|
||||
#include <tactility/drivers/display_placeholder.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
DEFINE_DEVICETREE(display_placeholder, struct DisplayPlaceholderConfig)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <tactility/bindings/bindings.h>
|
||||
#include <tactility/drivers/spi_peripheral.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
DEFINE_DEVICETREE(spi_peripheral, struct SpiPeripheralConfig)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,15 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <tactility/bindings/bindings.h>
|
||||
#include <tactility/drivers/touch_placeholder.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
DEFINE_DEVICETREE(touch_placeholder, struct TouchPlaceholderConfig)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -26,6 +26,9 @@ struct DeviceType {
|
||||
|
||||
/** Represents a piece of hardware */
|
||||
struct Device {
|
||||
/** Device address. Can represent an index, a memory address, or some kind of offset */
|
||||
int32_t address;
|
||||
|
||||
/** The name of the device. Valid characters: a-z a-Z 0-9 - _ . */
|
||||
const char* name;
|
||||
|
||||
@@ -248,6 +251,13 @@ void device_for_each(void* callback_context, bool(*on_device)(struct Device* dev
|
||||
*/
|
||||
void device_for_each_child(struct Device* device, void* callback_context, bool(*on_device)(struct Device* device, void* context));
|
||||
|
||||
/**
|
||||
* @brief Get the number of child devices.
|
||||
* @param[in] device non-null device pointer
|
||||
* @return the number of children
|
||||
*/
|
||||
size_t device_get_child_count(struct Device* device);
|
||||
|
||||
/**
|
||||
* Iterate through all the known devices of a specific type
|
||||
*
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <tactility/device.h>
|
||||
|
||||
extern const struct DeviceType DISPLAY_TYPE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct DisplayPlaceholderConfig {
|
||||
uint8_t _unused;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <tactility/device.h>
|
||||
|
||||
extern const struct DeviceType SDCARD_TYPE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,19 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <tactility/device.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct SpiPeripheralConfig {
|
||||
uint8_t _unused;
|
||||
};
|
||||
|
||||
extern const struct DeviceType SPI_PERIPHERAL_TYPE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <tactility/device.h>
|
||||
|
||||
extern const struct DeviceType TOUCH_TYPE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,16 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
struct TouchPlaceholderConfig {
|
||||
uint8_t _unused;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -24,6 +24,7 @@ typedef int error_t;
|
||||
#define ERROR_NOT_SUPPORTED 10
|
||||
#define ERROR_NOT_ALLOWED 11
|
||||
#define ERROR_BUFFER_OVERFLOW 12
|
||||
#define ERROR_OUT_OF_RANGE 13
|
||||
|
||||
/** Convert an error_t to a human-readable text. Useful for logging. */
|
||||
const char* error_to_string(error_t error);
|
||||
|
||||
@@ -101,6 +101,20 @@ bool file_system_is_mounted(struct FileSystem* fs);
|
||||
*/
|
||||
error_t file_system_get_path(struct FileSystem* fs, char* out_path, size_t out_path_size);
|
||||
|
||||
/**
|
||||
* @brief Sets the owner device of the file system.
|
||||
* @param[in] fs the FileSystem object
|
||||
* @param[in] owner the owning device, or NULL
|
||||
*/
|
||||
void file_system_set_owner(struct FileSystem* fs, struct Device* owner);
|
||||
|
||||
/**
|
||||
* @brief Gets the owner device of the file system.
|
||||
* @param[in] fs the FileSystem object
|
||||
* @return the owning device, or NULL if not set
|
||||
*/
|
||||
struct Device* file_system_get_owner(struct FileSystem* fs);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -328,6 +328,10 @@ void device_for_each_child(Device* device, void* callbackContext, bool(*on_devic
|
||||
}
|
||||
}
|
||||
|
||||
size_t device_get_child_count(Device* device) {
|
||||
return device->internal->children.size();
|
||||
}
|
||||
|
||||
void device_for_each_of_type(const DeviceType* type, void* callbackContext, bool(*on_device)(Device* device, void* context)) {
|
||||
ledger_lock();
|
||||
for (auto* device : ledger.devices) {
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/display.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
const struct DeviceType DISPLAY_TYPE {
|
||||
.name = "display"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/display_placeholder.h>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/driver.h>
|
||||
#include <tactility/drivers/display.h>
|
||||
#include <tactility/module.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
static error_t start(Device*) { return ERROR_NONE; }
|
||||
static error_t stop(Device*) { return ERROR_NONE; }
|
||||
|
||||
extern Module root_module;
|
||||
|
||||
Driver display_placeholder_driver = {
|
||||
.name = "display_placeholder",
|
||||
.compatible = (const char*[]) { "display-placeholder", nullptr },
|
||||
.start_device = start,
|
||||
.stop_device = stop,
|
||||
.api = nullptr,
|
||||
.device_type = &DISPLAY_TYPE,
|
||||
.owner = &root_module,
|
||||
.internal = nullptr
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/sdcard.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
const struct DeviceType SDCARD_TYPE {
|
||||
.name = "sdcard"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/spi_peripheral.h>
|
||||
#include <tactility/driver.h>
|
||||
#include <tactility/module.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
static error_t start(Device*) { return ERROR_NONE; }
|
||||
static error_t stop(Device*) { return ERROR_NONE; }
|
||||
|
||||
const DeviceType SPI_PERIPHERAL_TYPE = {
|
||||
.name = "spi_peripheral"
|
||||
};
|
||||
|
||||
extern Module root_module;
|
||||
|
||||
Driver spi_peripheral_driver = {
|
||||
.name = "spi_peripheral",
|
||||
.compatible = (const char*[]) { "spi-peripheral", nullptr },
|
||||
.start_device = start,
|
||||
.stop_device = stop,
|
||||
.api = nullptr,
|
||||
.device_type = &SPI_PERIPHERAL_TYPE,
|
||||
.owner = &root_module,
|
||||
.internal = nullptr
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/touch.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
const struct DeviceType TOUCH_TYPE {
|
||||
.name = "touch"
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
#include <tactility/drivers/touch_placeholder.h>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/driver.h>
|
||||
#include <tactility/drivers/touch.h>
|
||||
#include <tactility/module.h>
|
||||
|
||||
extern "C" {
|
||||
|
||||
static error_t start(Device*) { return ERROR_NONE; }
|
||||
static error_t stop(Device*) { return ERROR_NONE; }
|
||||
|
||||
extern Module root_module;
|
||||
|
||||
Driver touch_placeholder_driver = {
|
||||
.name = "touch_placeholder",
|
||||
.compatible = (const char*[]) { "touch-placeholder", nullptr },
|
||||
.start_device = start,
|
||||
.stop_device = stop,
|
||||
.api = nullptr,
|
||||
.device_type = &TOUCH_TYPE,
|
||||
.owner = &root_module,
|
||||
.internal = nullptr
|
||||
};
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
#include <algorithm>
|
||||
#include <tactility/device.h>
|
||||
#include <tactility/concurrent/mutex.h>
|
||||
#include <tactility/concurrent/recursive_mutex.h>
|
||||
#include <tactility/filesystem/file_system.h>
|
||||
@@ -10,6 +11,7 @@
|
||||
struct FileSystem {
|
||||
const FileSystemApi* api;
|
||||
void* data;
|
||||
Device* owner;
|
||||
};
|
||||
|
||||
// Global list of file systems and its mutex
|
||||
@@ -42,6 +44,7 @@ FileSystem* file_system_add(const FileSystemApi* fs_api, void* data) {
|
||||
check(fs != nullptr);
|
||||
fs->api = fs_api;
|
||||
fs->data = data;
|
||||
fs->owner = nullptr;
|
||||
ledger.file_systems.push_back(fs);
|
||||
|
||||
ledger.unlock();
|
||||
@@ -90,4 +93,12 @@ error_t file_system_get_path(FileSystem* fs, char* out_path, size_t out_path_siz
|
||||
return fs->api->get_path(fs->data, out_path, out_path_size);
|
||||
}
|
||||
|
||||
void file_system_set_owner(FileSystem* fs, Device* owner) {
|
||||
fs->owner = owner;
|
||||
}
|
||||
|
||||
Device* file_system_get_owner(FileSystem* fs) {
|
||||
return fs->owner;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,6 +14,12 @@ extern const ModuleSymbol KERNEL_SYMBOLS[];
|
||||
static error_t start() {
|
||||
extern Driver root_driver;
|
||||
if (driver_construct_add(&root_driver) != ERROR_NONE) return ERROR_RESOURCE;
|
||||
extern Driver display_placeholder_driver;
|
||||
if (driver_construct_add(&display_placeholder_driver) != ERROR_NONE) return ERROR_RESOURCE;
|
||||
extern Driver touch_placeholder_driver;
|
||||
if (driver_construct_add(&touch_placeholder_driver) != ERROR_NONE) return ERROR_RESOURCE;
|
||||
extern Driver spi_peripheral_driver;
|
||||
if (driver_construct_add(&spi_peripheral_driver) != ERROR_NONE) return ERROR_RESOURCE;
|
||||
return ERROR_NONE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user