universal driver access module
This commit is contained in:
130
source/firmware/kernel/driver/driver.c
Normal file
130
source/firmware/kernel/driver/driver.c
Normal 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;
|
||||
}
|
30
source/firmware/kernel/driver/include/driver.h
Normal file
30
source/firmware/kernel/driver/include/driver.h
Normal 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_ */
|
@@ -6,6 +6,7 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#include "driver.h"
|
||||
#include "ringbuffer.h"
|
||||
#include "irq.h"
|
||||
#include "stack.h"
|
||||
|
Reference in New Issue
Block a user