Create hal-device module, fix GPIO, fix tests, fix TactilityC (#471)

* **New Features**
  * Added a HAL device module providing device enumeration, type queries and a HAL↔kernel bridge.

* **Improvements**
  * Integrated HAL module into startup; standardized module names, includes and lifecycle logging; safer file append behavior; broader build support.

* **API Changes**
  * Driver lifecycle now uses explicit add/remove semantics; C and HAL device type/lookup APIs clarified.

* **Chores**
  * Added module README and Apache‑2.0 license; updated build configuration to include the new module.

* **Fixes**
  * Updated tests and object file handling to behave correctly.
This commit is contained in:
Ken Van Hoeylandt
2026-02-01 01:05:16 +01:00
committed by GitHub
parent 5993ceb232
commit 3fe1dc0312
74 changed files with 836 additions and 211 deletions
+35 -27
View File
@@ -58,28 +58,6 @@ static DriverLedger& get_ledger() {
#define driver_lock(driver) mutex_lock(&get_driver_private(driver)->mutex);
#define driver_unlock(driver) mutex_unlock(&get_driver_private(driver)->mutex);
static void driver_add(Driver* driver) {
LOG_I(TAG, "add %s", driver->name);
ledger.lock();
ledger.drivers.push_back(driver);
ledger.unlock();
}
static error_t driver_remove(Driver* driver) {
LOG_I(TAG, "remove %s", driver->name);
ledger.lock();
const auto iterator = std::ranges::find(ledger.drivers, driver);
if (iterator == ledger.drivers.end()) {
ledger.unlock();
return ERROR_NOT_FOUND;
}
ledger.drivers.erase(iterator);
ledger.unlock();
return ERROR_NONE;
}
extern "C" {
error_t driver_construct(Driver* driver) {
@@ -87,7 +65,6 @@ error_t driver_construct(Driver* driver) {
if (driver->driver_private == nullptr) {
return ERROR_OUT_OF_MEMORY;
}
driver_add(driver);
return ERROR_NONE;
}
@@ -104,10 +81,6 @@ error_t driver_destruct(Driver* driver) {
}
get_driver_private(driver)->destroying = true;
if (driver_remove(driver) != ERROR_NONE) {
LOG_W(TAG, "Failed to remove driver from ledger: %s", driver->name);
}
driver_unlock(driver);
delete get_driver_private(driver);
driver->driver_private = nullptr;
@@ -115,6 +88,41 @@ error_t driver_destruct(Driver* driver) {
return ERROR_NONE;
}
error_t driver_add(Driver* driver) {
LOG_I(TAG, "add %s", driver->name);
ledger.lock();
ledger.drivers.push_back(driver);
ledger.unlock();
return ERROR_NONE;
}
error_t driver_remove(Driver* driver) {
LOG_I(TAG, "remove %s", driver->name);
ledger.lock();
const auto iterator = std::ranges::find(ledger.drivers, driver);
if (iterator == ledger.drivers.end()) {
ledger.unlock();
return ERROR_NOT_FOUND;
}
ledger.drivers.erase(iterator);
ledger.unlock();
return ERROR_NONE;
}
error_t driver_construct_add(struct Driver* driver) {
if (driver_construct(driver) != ERROR_NONE) return ERROR_RESOURCE;
if (driver_add(driver) != ERROR_NONE) return ERROR_RESOURCE;
return ERROR_NONE;
}
error_t driver_remove_destruct(struct Driver* driver) {
if (driver_remove(driver) != ERROR_NONE) return ERROR_RESOURCE;
if (driver_destruct(driver) != ERROR_NONE) return ERROR_RESOURCE;
return ERROR_NONE;
}
bool driver_is_compatible(Driver* driver, const char* compatible) {
if (compatible == nullptr || driver->compatible == nullptr) {
return false;