universal driver access module

This commit is contained in:
tkl
2016-07-27 16:00:08 +02:00
parent 37214bf716
commit cdb315da32
6 changed files with 200 additions and 29 deletions

View File

@@ -0,0 +1,130 @@
/*
* driver.c
*
* Created on: Jul 27, 2016
* Author: tkl
*/
#include <stddef.h>
#include "driver.h"
#include "adc.h"
#include "gpio.h"
#include "i2c.h"
#include "rtc.h"
#include "spi.h"
#include "uart.h"
int open(const struct driver *driver)
{
int ret = -1;
if(NULL == driver)
return ret;
switch(driver->driver_type) {
case DRIVER_TYPE_ADC:
ret = adc_open((const struct adc *)(driver->device_driver));
break;
case DRIVER_TYPE_GPIO:
ret = gpio_open((const struct gpio *)(driver->device_driver));
break;
case DRIVER_TYPE_I2C:
ret = i2c_open((struct i2c *)(driver->device_driver));
break;
case DRIVER_TYPE_RTC:
ret = rtc_open((const struct rtc *)(driver->device_driver));
break;
case DRIVER_TYPE_SPI:
ret = spi_open((const struct spi *)(driver->device_driver));
break;
case DRIVER_TYPE_UART:
ret = uart_open((const struct uart *)(driver->device_driver));
break;
}
return ret;
}
int close(const struct driver *driver)
{
int ret = -1;
if(NULL == driver)
return ret;
switch(driver->driver_type) {
case DRIVER_TYPE_ADC:
ret = adc_close((const struct adc *)(driver->device_driver));
break;
case DRIVER_TYPE_GPIO:
ret = gpio_close((const struct gpio *)(driver->device_driver));
break;
case DRIVER_TYPE_I2C:
ret = i2c_close((struct i2c *)(driver->device_driver));
break;
case DRIVER_TYPE_RTC:
ret = rtc_close((const struct rtc *)(driver->device_driver));
break;
case DRIVER_TYPE_SPI:
ret = spi_close((const struct spi *)(driver->device_driver));
break;
case DRIVER_TYPE_UART:
ret = uart_close((const struct uart *)(driver->device_driver));
break;
}
return ret;
}
int read(const struct driver *driver, char *buffer, int len)
{
int ret = -1;
if(NULL == driver)
return ret;
switch(driver->driver_type) {
case DRIVER_TYPE_ADC:
break;
case DRIVER_TYPE_GPIO:
ret = gpio_read((const struct gpio *)(driver->device_driver));
if(len > 0) {
buffer[0] = ret + 0x30;
ret = 1;
}
break;
case DRIVER_TYPE_I2C:
break;
case DRIVER_TYPE_RTC:
break;
case DRIVER_TYPE_SPI:
break;
case DRIVER_TYPE_UART:
ret = uart_read((const struct uart *)(driver->device_driver), buffer, len);
break;
}
return ret;
}
int write(const struct driver *driver, const char *buffer, int len)
{
int ret = -1;
if(NULL == driver)
return ret;
switch(driver->driver_type) {
case DRIVER_TYPE_ADC:
break;
case DRIVER_TYPE_GPIO:
if(len > 0) {
char send = 0;
if(buffer[0])
send = 1;
gpio_write((const struct gpio *)(driver->device_driver), send);
ret = 1;
}
break;
case DRIVER_TYPE_I2C:
break;
case DRIVER_TYPE_RTC:
break;
case DRIVER_TYPE_SPI:
break;
case DRIVER_TYPE_UART:
ret = uart_write((const struct uart *)(driver->device_driver), buffer, len);
break;
}
return ret;
}

View File

@@ -0,0 +1,30 @@
/*
* driver.h
*
* Created on: Jul 27, 2016
* Author: tkl
*/
#ifndef SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_
#define SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_
enum driver_type {
DRIVER_TYPE_ADC,
DRIVER_TYPE_GPIO,
DRIVER_TYPE_I2C,
DRIVER_TYPE_RTC,
DRIVER_TYPE_SPI,
DRIVER_TYPE_UART
};
struct driver {
enum driver_type driver_type;
const void *device_driver;
};
int open(const struct driver *driver);
int close(const struct driver *driver);
int read(const struct driver *driver, char *buffer, int len);
int write(const struct driver *driver, const char *buffer, int len);
#endif /* SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_ */

View File

@@ -6,6 +6,7 @@
#include <stddef.h>
#include <stdbool.h>
#include "driver.h"
#include "ringbuffer.h"
#include "irq.h"
#include "stack.h"