Add portable NFC module
This commit is contained in:
186
nfc/platform/quectel/nfc_platform_ql.c
Normal file
186
nfc/platform/quectel/nfc_platform_ql.c
Normal file
@@ -0,0 +1,186 @@
|
||||
#include "nfc_platform.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "ql_gpio.h"
|
||||
#include "ql_iic.h"
|
||||
#include "ql_rtos.h"
|
||||
|
||||
int vprintf(const char *fmt, va_list args);
|
||||
|
||||
static PIN_DIRECTION_E map_direction(nfc_platform_gpio_direction_t direction)
|
||||
{
|
||||
return direction == NFC_PLATFORM_GPIO_OUT ? PIN_DIRECTION_OUT : PIN_DIRECTION_IN;
|
||||
}
|
||||
|
||||
static PIN_PULL_E map_pull(nfc_platform_gpio_pull_t pull)
|
||||
{
|
||||
switch (pull) {
|
||||
case NFC_PLATFORM_GPIO_PULL_UP:
|
||||
return PIN_PULL_PU;
|
||||
case NFC_PLATFORM_GPIO_PULL_DOWN:
|
||||
return PIN_PULL_PD;
|
||||
case NFC_PLATFORM_GPIO_PULL_DISABLE:
|
||||
default:
|
||||
return PIN_PULL_DISABLE;
|
||||
}
|
||||
}
|
||||
|
||||
static PIN_LEVEL_E map_level(nfc_platform_gpio_level_t level)
|
||||
{
|
||||
return level == NFC_PLATFORM_GPIO_HIGH ? PIN_LEVEL_HIGH : PIN_LEVEL_LOW;
|
||||
}
|
||||
|
||||
static PIN_EDGE_E map_edge(nfc_platform_irq_edge_t edge)
|
||||
{
|
||||
switch (edge) {
|
||||
case NFC_PLATFORM_IRQ_RISING_EDGE:
|
||||
return PIN_RISING_EDGE;
|
||||
case NFC_PLATFORM_IRQ_FALLING_EDGE:
|
||||
return PIN_FALLING_EDGE;
|
||||
case NFC_PLATFORM_IRQ_BOTH_EDGE:
|
||||
return PIN_BOTH_EDGE;
|
||||
case NFC_PLATFORM_IRQ_NONE:
|
||||
default:
|
||||
return PIN_NO_EDGE;
|
||||
}
|
||||
}
|
||||
|
||||
void nfc_platform_log(const char *fmt, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vprintf(fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void nfc_platform_sleep_ms(uint32_t ms)
|
||||
{
|
||||
ql_rtos_task_sleep_ms(ms);
|
||||
}
|
||||
|
||||
int nfc_platform_i2c_init(uint8_t bus, uint32_t fast_mode)
|
||||
{
|
||||
return ql_i2c_init(bus, fast_mode);
|
||||
}
|
||||
|
||||
int nfc_platform_i2c_write(uint8_t bus,
|
||||
uint8_t slave_addr,
|
||||
uint16_t reg,
|
||||
const uint8_t *data,
|
||||
uint32_t len)
|
||||
{
|
||||
return ql_i2c_write(bus, slave_addr, reg, (unsigned char *)data, len);
|
||||
}
|
||||
|
||||
int nfc_platform_i2c_read(uint8_t bus,
|
||||
uint8_t slave_addr,
|
||||
uint16_t reg,
|
||||
uint8_t *data,
|
||||
uint32_t len)
|
||||
{
|
||||
return ql_i2c_read(bus, slave_addr, reg, data, len);
|
||||
}
|
||||
|
||||
int nfc_platform_gpio_init(uint32_t pin,
|
||||
nfc_platform_gpio_direction_t direction,
|
||||
nfc_platform_gpio_pull_t pull,
|
||||
nfc_platform_gpio_level_t initial_level)
|
||||
{
|
||||
return ql_gpio_init((GPIO_PIN_NUMBER_E)pin,
|
||||
map_direction(direction),
|
||||
map_pull(pull),
|
||||
map_level(initial_level));
|
||||
}
|
||||
|
||||
int nfc_platform_gpio_set_level(uint32_t pin, nfc_platform_gpio_level_t level)
|
||||
{
|
||||
return ql_gpio_set_level((GPIO_PIN_NUMBER_E)pin, map_level(level));
|
||||
}
|
||||
|
||||
int nfc_platform_gpio_get_level(uint32_t pin, uint8_t *level)
|
||||
{
|
||||
PIN_LEVEL_E pin_level = PIN_LEVEL_LOW;
|
||||
int ret;
|
||||
|
||||
if (level == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ql_gpio_get_level((GPIO_PIN_NUMBER_E)pin, &pin_level);
|
||||
*level = (pin_level == PIN_LEVEL_HIGH) ? 1 : 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int nfc_platform_irq_register(uint32_t pin,
|
||||
nfc_platform_irq_edge_t edge,
|
||||
nfc_platform_gpio_pull_t pull,
|
||||
void *arg,
|
||||
nfc_platform_irq_handler_t handler)
|
||||
{
|
||||
(void)arg;
|
||||
return ql_eint_register((GPIO_PIN_NUMBER_E)pin,
|
||||
map_edge(edge),
|
||||
map_pull(pull),
|
||||
NULL,
|
||||
(void *)handler);
|
||||
}
|
||||
|
||||
int nfc_platform_irq_enable_wakeup(uint32_t pin, nfc_platform_irq_edge_t edge)
|
||||
{
|
||||
return ql_eint_enable_wakeup((GPIO_PIN_NUMBER_E)pin, map_edge(edge));
|
||||
}
|
||||
|
||||
int nfc_platform_irq_disable_wakeup(uint32_t pin)
|
||||
{
|
||||
return ql_eint_disable_wakeup((GPIO_PIN_NUMBER_E)pin);
|
||||
}
|
||||
|
||||
int nfc_platform_sem_create(nfc_platform_sem_t *sem, uint32_t initial_count)
|
||||
{
|
||||
ql_sem_t ql_sem = NULL;
|
||||
int ret;
|
||||
|
||||
if (sem == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ql_rtos_semaphore_create(&ql_sem, initial_count);
|
||||
*sem = ql_sem;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int nfc_platform_sem_wait(nfc_platform_sem_t sem, uint32_t timeout_ms)
|
||||
{
|
||||
return ql_rtos_semaphore_wait((ql_sem_t)sem, timeout_ms);
|
||||
}
|
||||
|
||||
int nfc_platform_sem_release(nfc_platform_sem_t sem)
|
||||
{
|
||||
return ql_rtos_semaphore_release((ql_sem_t)sem);
|
||||
}
|
||||
|
||||
int nfc_platform_task_create(nfc_platform_task_t *task,
|
||||
uint32_t stack_size,
|
||||
uint32_t priority,
|
||||
const char *name,
|
||||
nfc_platform_task_entry_t entry,
|
||||
void *arg)
|
||||
{
|
||||
ql_task_t ql_task = NULL;
|
||||
int ret;
|
||||
|
||||
if (task == NULL || entry == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ret = ql_rtos_task_create(&ql_task,
|
||||
stack_size,
|
||||
(uint8_t)priority,
|
||||
(char *)name,
|
||||
entry,
|
||||
arg);
|
||||
*task = ql_task;
|
||||
return ret;
|
||||
}
|
||||
Reference in New Issue
Block a user