Add portable NFC module

This commit is contained in:
2026-07-20 10:48:38 +08:00
commit 4ed123f87c
25 changed files with 3965 additions and 0 deletions

View 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;
}