dev/driver #4
1
Makefile
1
Makefile
@ -33,6 +33,7 @@ OPT = 3
|
||||
C_FLAGS += -O$(OPT) -g$(OPT)
|
||||
C_FLAGS += -Wall -Werror
|
||||
C_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
|
||||
C_FLAGS += -DPLATFORM_$(PLATFORM)
|
||||
|
||||
LIBS += c nosys m
|
||||
|
||||
|
8
include/board.h
Normal file
8
include/board.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef __BOARD_H__
|
||||
#define __BOARD_H__
|
||||
|
||||
#if defined(BOARD_PCA10040)
|
||||
#include "platform/nrf52/nrf52-dk.h"
|
||||
#endif
|
||||
|
||||
#endif
|
10
include/delay.h
Normal file
10
include/delay.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef __DELAY_H__
|
||||
#define __DELAY_H__
|
||||
|
||||
#if defined(PLATFORM_nrf52)
|
||||
#include "nrf_delay.h"
|
||||
|
||||
#define delay_ms nrf_delay_ms
|
||||
#endif
|
||||
|
||||
#endif
|
34
include/driver.h
Normal file
34
include/driver.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef __DRIVER_H__
|
||||
#define __DRIVER_H__
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
struct driver;
|
||||
|
||||
typedef int (*fp_open_t)(const struct driver *);
|
||||
typedef int (*fp_close_t)(const struct driver *);
|
||||
typedef int (*fp_read_t)(const struct driver *, char *, unsigned int);
|
||||
typedef int (*fp_write_t)(const struct driver *, const char *, unsigned int);
|
||||
typedef int (*fp_ioctl_t)(const struct driver *, unsigned int, unsigned int argc, va_list);
|
||||
|
||||
struct driver_fp {
|
||||
fp_open_t open;
|
||||
fp_close_t close;
|
||||
fp_read_t read;
|
||||
fp_write_t write;
|
||||
fp_ioctl_t ioctl;
|
||||
};
|
||||
|
||||
struct driver {
|
||||
const char *name;
|
||||
const struct driver_fp *fp;
|
||||
const void *dev;
|
||||
};
|
||||
|
||||
int drv_open(const struct driver *drv);
|
||||
int drv_close(const struct driver *drv);
|
||||
int drv_read(const struct driver *drv, char *buffer, unsigned int length);
|
||||
int drv_write(const struct driver *drv, const char *buffer, unsigned int length);
|
||||
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...);
|
||||
|
||||
#endif
|
34
include/gpio.h
Normal file
34
include/gpio.h
Normal file
@ -0,0 +1,34 @@
|
||||
#ifndef __GPIO_H__
|
||||
#define __GPIO_H__
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "driver.h"
|
||||
|
||||
#define IOCTL_CMD_SET_DIRECTION 0
|
||||
|
||||
int gpio_open(const struct driver *drv);
|
||||
int gpio_close(const struct driver *drv);
|
||||
|
||||
int gpio_read(const struct driver *drv, char *buffer, unsigned int len);
|
||||
int gpio_write(const struct driver *drv, const char *buffer, unsigned int len);
|
||||
|
||||
enum direction {
|
||||
IN = 0,
|
||||
OUT
|
||||
};
|
||||
|
||||
struct gpio {
|
||||
int pin;
|
||||
enum direction dir;
|
||||
};
|
||||
|
||||
static const struct driver_fp gpio_fp = {
|
||||
.open = gpio_open,
|
||||
.close = gpio_close,
|
||||
.read = gpio_read,
|
||||
.write = gpio_write,
|
||||
.ioctl = NULL
|
||||
};
|
||||
|
||||
#endif
|
52
include/platform/nrf52/nrf52-dk.h
Normal file
52
include/platform/nrf52/nrf52-dk.h
Normal file
@ -0,0 +1,52 @@
|
||||
#ifndef __NRF52_DK_H__
|
||||
#define __NRF52_DK_H__
|
||||
|
||||
#include "driver.h"
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
// LED 1
|
||||
const struct gpio nrf_led_1 = {
|
||||
.pin = 17,
|
||||
.dir = OUT
|
||||
};
|
||||
const struct driver led_1 = {
|
||||
.name = "LED1",
|
||||
.fp = &gpio_fp,
|
||||
.dev = &nrf_led_1
|
||||
};
|
||||
|
||||
// LED 2
|
||||
const struct gpio nrf_led_2 = {
|
||||
.pin = 18,
|
||||
.dir = OUT
|
||||
};
|
||||
const struct driver led_2 = {
|
||||
.name = "LED2",
|
||||
.fp = &gpio_fp,
|
||||
.dev = &nrf_led_2
|
||||
};
|
||||
|
||||
// LED 3
|
||||
const struct gpio nrf_led_3 = {
|
||||
.pin = 19,
|
||||
.dir = OUT
|
||||
};
|
||||
const struct driver led_3 = {
|
||||
.name = "LED3",
|
||||
.fp = &gpio_fp,
|
||||
.dev = &nrf_led_3
|
||||
};
|
||||
|
||||
// LED 4
|
||||
const struct gpio nrf_led_4 = {
|
||||
.pin = 20,
|
||||
.dir = OUT
|
||||
};
|
||||
const struct driver led_4 = {
|
||||
.name = "LED4",
|
||||
.fp = &gpio_fp,
|
||||
.dev = &nrf_led_4
|
||||
};
|
||||
|
||||
#endif
|
@ -1,77 +1,22 @@
|
||||
/**
|
||||
* Copyright (c) 2014 - 2019, Nordic Semiconductor ASA
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form, except as embedded into a Nordic
|
||||
* Semiconductor ASA integrated circuit in a product or a software update for
|
||||
* such product, must reproduce the above copyright notice, this list of
|
||||
* conditions and the following disclaimer in the documentation and/or other
|
||||
* materials provided with the distribution.
|
||||
*
|
||||
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* 4. This software, with or without modification, must only be used with a
|
||||
* Nordic Semiconductor ASA integrated circuit.
|
||||
*
|
||||
* 5. Any software provided in binary form under this license must not be reverse
|
||||
* engineered, decompiled, modified and/or disassembled.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
/** @file
|
||||
*
|
||||
* @defgroup blinky_example_main main.c
|
||||
* @{
|
||||
* @ingroup blinky_example
|
||||
* @brief Blinky Example Application main file.
|
||||
*
|
||||
* This file contains the source code for a sample application to blink LEDs.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include "nrf_delay.h"
|
||||
#include "boards.h"
|
||||
|
||||
/**
|
||||
* @brief Function for application main entry.
|
||||
*/
|
||||
#include "delay.h"
|
||||
#include "board.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* Configure board. */
|
||||
bsp_board_init(BSP_INIT_LEDS);
|
||||
|
||||
/* Toggle LEDs. */
|
||||
while (true)
|
||||
{
|
||||
for (int i = 0; i < LEDS_NUMBER; i++)
|
||||
{
|
||||
bsp_board_led_invert(i);
|
||||
nrf_delay_ms(500);
|
||||
unsigned int cnt[4] = {0, 0, 0, 0};
|
||||
const struct driver *leds[4] = {&led_1, &led_2, &led_3, &led_4};
|
||||
for(unsigned int i = 0; i < 4; i++) {
|
||||
drv_open(leds[i]);
|
||||
}
|
||||
while(true) {
|
||||
for(unsigned int i = 0; i < 4; i++) {
|
||||
char c = (cnt[i]++ % 2) + 0x30;
|
||||
drv_write(leds[i], &c, 1);
|
||||
delay_ms(500);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*@}
|
||||
**/
|
||||
|
67
src/driver.c
Normal file
67
src/driver.c
Normal file
@ -0,0 +1,67 @@
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "driver.h"
|
||||
|
||||
int drv_open(const struct driver *drv)
|
||||
{
|
||||
int res = -1;
|
||||
assert(drv != NULL);
|
||||
|
||||
if(drv->fp->open) {
|
||||
res = drv->fp->open(drv);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int drv_close(const struct driver *drv)
|
||||
{
|
||||
int res = -1;
|
||||
assert(drv != NULL);
|
||||
|
||||
if(drv->fp->close) {
|
||||
res = drv->fp->close(drv);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int drv_read(const struct driver *drv, char *buffer, unsigned int length)
|
||||
{
|
||||
int res = -1;
|
||||
assert(drv != NULL);
|
||||
|
||||
if(drv->fp->read) {
|
||||
res = drv->fp->read(drv, buffer, length);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int drv_write(const struct driver *drv, const char *buffer, unsigned int length)
|
||||
{
|
||||
int res = -1;
|
||||
assert(drv != NULL);
|
||||
|
||||
if(drv->fp->write) {
|
||||
res = drv->fp->write(drv, buffer, length);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...)
|
||||
{
|
||||
int res = -1;
|
||||
assert(drv != NULL);
|
||||
|
||||
if(drv->fp->ioctl) {
|
||||
va_list args;
|
||||
va_start(args, argc);
|
||||
res = drv->fp->ioctl(drv, cmd, argc, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
63
src/platform/nrf52/gpio.c
Normal file
63
src/platform/nrf52/gpio.c
Normal file
@ -0,0 +1,63 @@
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
#include "nrf_gpio.h"
|
||||
|
||||
int gpio_open(const struct driver *drv)
|
||||
{
|
||||
assert(NULL != drv);
|
||||
|
||||
struct gpio *this = (struct gpio *)(drv->dev);
|
||||
|
||||
if(this->dir == OUT) {
|
||||
nrf_gpio_cfg_output((uint32_t)(this->pin));
|
||||
nrf_gpio_pin_clear(this->pin);
|
||||
}
|
||||
// FIXME: implement input configuration
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_close(const struct driver *drv)
|
||||
{
|
||||
assert(NULL != drv);
|
||||
|
||||
struct gpio *this = (struct gpio *)(drv->dev);
|
||||
nrf_gpio_pin_clear(this->pin);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gpio_read(const struct driver *drv, char *buffer, unsigned int len)
|
||||
{
|
||||
assert(NULL != drv);
|
||||
|
||||
if(len == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct gpio *this = (struct gpio *)(drv->dev);
|
||||
|
||||
uint32_t value = nrf_gpio_pin_read(this->pin);
|
||||
buffer[0] = value + 0x30; // ascii convert
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int gpio_write(const struct driver *drv, const char *buffer, unsigned int len)
|
||||
{
|
||||
assert((NULL != drv) && (NULL != buffer));
|
||||
|
||||
if(len == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct gpio *this = (struct gpio *)(drv->dev);
|
||||
|
||||
nrf_gpio_pin_write(this->pin, buffer[0] - 0x30);
|
||||
|
||||
return 1;
|
||||
}
|
Loading…
Reference in New Issue
Block a user