测试commit

This commit is contained in:
asdf 2023-07-22 13:57:25 +08:00
parent eb9a4c7494
commit d4cb80ee03
20 changed files with 51 additions and 2915 deletions

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 李昂
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,510 +0,0 @@
"""
## PikaStdDevice
PikaStdDevice is a standard and abstract device module for PikaScript.
PikaStdDevice supplies the standard device API for users.
Document: https://pikadoc-en.readthedocs.io/en/latest/PikaStdDevice%20%E6%A0%87%E5%87%86%E8%AE%BE%E5%A4%87.html
"""
from PikaObj import *
class GPIO(BaseDev):
def __init__(self): ...
def setPin(self, pinName: str):
"""
Use the name of the pin to select the GPIO pin.
example: `"PA0"`, `"PA1"` ...
"""
def setId(self, id: int):
"""
Use the id of the pin to select the GPIO pin.
example: 0, 1 ...
"""
def getId(self) -> int:
"""
Get the id of the pin.
"""
def getPin(self) -> str:
"""
Get the name of the pin.
"""
def setMode(self, mode: str):
"""
Set the mode of the pin.
example: "in", "out" ...
"""
def getMode(self) -> str:
"""
Get the mode of the pin.
"""
def setPull(self, pull: str):
"""
Set the pull of the pin.
example: `"up"`, `"down"`, `"none"` ...
"""
def enable(self):
"""Enable the pin."""
def disable(self):
"""Disable the pin."""
def high(self):
"""Set the pin to high."""
def low(self):
"""Set the pin to low."""
def read(self) -> int:
"""Read the pin value."""
SIGNAL_RISING: int
SIGNAL_FALLING: int
SIGNAL_ANY: int
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print("cb1", signal)
io.setCallBack(cb1, io.SIGNAL_RISING)
```
The `signal` parameter is the signal type.
The callback function will be called when the signal is triggered.
"""
def close(self): ...
def platformHigh(self): ...
def platformLow(self): ...
def platformEnable(self): ...
def platformDisable(self): ...
def platformSetMode(self): ...
def platformRead(self): ...
def Time() -> time:
""" use time module instead """
class ADC(BaseDev):
def __init__(self): ...
def setPin(self, pin: str):
"""
Use the name of the pin to select the ADC pin.
example: `"PA0"`, `"PA1"` ...
"""
def enable(self):
"""Enable the ADC."""
def disable(self):
"""Disable the ADC."""
def read(self) -> float:
"""Read the ADC value."""
def close(self): ...
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformRead(self): ...
@abstractmethod
def platformDisable(self): ...
class DAC(BaseDev):
def __init__(self): ...
def setPin(self, pin: str):
"""
Use the name of the pin to select the DAC pin.
example: `"PA0"`, `"PA1"` ...
"""
def enable(self):
"""Enable the DAC."""
def disable(self):
"""Disable the DAC."""
def write(self, val: float):
"""write the DAC value."""
def close(self): ...
class UART:
def __init__(self): ...
def setBaudRate(self, baudRate: int):
"""Set the baud rate."""
def setId(self, id: int):
"""Set the id of the UART."""
STOP_BITS_1: int
STOP_BITS_2: int
STOP_BITS_1_5: int
def setStopBits(self, stopBits: int):
"""Set the stop bits of the UART."""
PARITY_NONE: int
PARITY_EVEN: int
PARITY_ODD: int
def setParity(self, parity: int):
"""Set the parity of the UART."""
FLOW_CONTROL_NONE: int
FLOW_CONTROL_RTS: int
FLOW_CONTROL_CTS: int
FLOW_CONTROL_RTS_CTS: int
def setFlowControl(self, flowControl: int):
"""Set the flow control of the UART."""
def setDataBits(self, dataBits: int):
"""Set the data bits of the UART."""
def enable(self):
"""Enable the UART."""
def disable(self):
"""Disable the UART."""
def write(self, data: str):
"""Write string to the UART."""
def writeBytes(self, data: bytes, length: int):
"""Write bytes to the UART."""
def read(self, length: int) -> str:
"""Read string from the UART."""
def readBytes(self, length: int) -> bytes:
"""Read bytes from the UART."""
def setPinTX(self, pin: str):
"""
Remap the TX pin.
"""
def setPinRX(self, pin: str):
"""
Remap the RX pin.
"""
def setPinCTS(self, pin: str):
"""
Remap the CTS pin.
"""
def setPinRTS(self, pin: str):
"""
Remap the RTS pin.
"""
def close(self): ...
SIGNAL_RX: int
SIGNAL_TX: int
def setCallBack(self, eventCallBack: any, filter: int):
"""
Add a callback function to the pin.
Example:
``` python
def cb1(signal):
print(uart.read(-1))
io.setCallBack(cb1, uart.SIGNAL_RX)
```
"""
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformWrite(self): ...
@abstractmethod
def platformWriteBytes(self): ...
@abstractmethod
def platformRead(self): ...
@abstractmethod
def platformReadBytes(self): ...
@abstractmethod
def platformDisable(self): ...
class IIC(BaseDev):
def __init__(self): ...
def setPinSCL(self, pin: str):
"""Set the SCL pin."""
def setPinSDA(self, pin: str):
"""Set the SDA pin."""
def setDeviceAddr(self, addr: int):
"""Set the device address."""
def enable(self):
"""Enable the IIC."""
def disable(self):
"""Disable the IIC."""
def write(self, addr: int, data: str):
"""Write string to the IIC."""
def writeBytes(self, addr: int, data: bytes, length: int):
"""Write bytes to the IIC."""
def read(self, addr: int, length: int) -> str:
"""Read string from the IIC."""
def readBytes(self, addr: int, length: int) -> bytes:
"""Read bytes from the IIC."""
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformWrite(self): ...
@abstractmethod
def platformWriteBytes(self): ...
@abstractmethod
def platformRead(self): ...
@abstractmethod
def platformReadBytes(self): ...
@abstractmethod
def platformDisable(self): ...
class PWM(BaseDev):
def __init__(self): ...
def setName(self, name: str):
"""Use the device name to select the PWM pin.
exmpale: `"PWM0"`, `"PWM1"` ...
"""
def getName(self) -> str:
"""Get the device name."""
def setChannel(self, ch: int):
"""Set the channel."""
def getChannel(self) -> int:
"""Get the channel."""
def setPin(self, pin: str):
"""Use the name of the pin to select the PWM pin.
example: `"PA0"`, `"PA1"` ...
"""
def setFrequency(self, freq: int):
"""Set the frequency."""
def setFreq(self, freq: int):
"""Set the frequency."""
def setDuty(self, duty: float):
"""Set the duty."""
def enable(self):
"""Enable the PWM."""
def disable(self):
"""Disable the PWM."""
def getFrequency(self) -> int:
"""Get the frequency."""
def getDuty(self) -> float:
"""Get the duty."""
def close(self): ...
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformSetFrequency(self): ...
@abstractmethod
def platformSetDuty(self): ...
@abstractmethod
def platformDisable(self): ...
class SPI(BaseDev):
def __init__(self): ...
def setPinSCK(self, pin: str):
"""Set the SCK pin."""
def setPinMOSI(self, pin: str):
"""Set the MOSI pin."""
def setPinMISO(self, pin: str):
"""Set the MISO pin."""
def setName(self, name: str):
"""Use the device name to select the SPI pin.
exmpale: `"SPI0"`, `"SPI1"` ...
"""
def setId(self, id: int):
"""Set the id of the SPI.
example: `0`, `1` ...
"""
def setPolarity(self, polarity: int):
"""Set the polarity."""
def setPhase(self, phase: int):
"""Set the phase."""
def setBaudRate(self, baudRate: int):
"""Set the baud rate."""
def enable(self):
"""Enable the SPI."""
def disable(self):
"""Disable the SPI."""
def write(self, data: str):
"""Write string to the SPI."""
def writeBytes(self, data: bytes, length: int):
"""Write bytes to the SPI."""
def read(self, length: int) -> str:
"""Read string from the SPI."""
def readBytes(self, length: int) -> bytes:
"""Read bytes from the SPI."""
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformWrite(self): ...
@abstractmethod
def platformWriteBytes(self): ...
@abstractmethod
def platformRead(self): ...
@abstractmethod
def platformReadBytes(self): ...
@abstractmethod
def platformDisable(self): ...
class CAN(BaseDev):
def __init__(self): ...
def setName(self, name: str):
"""Use the device name to select the CAN pin.
exmpale: `"CAN0"`, `"CAN1"` ...
"""
def setId(self, id: int):
"""Use the id to select the CAN pin.
example: `0`, `1` ...
"""
def setBaudRate(self, baudRate: int):
"""Set the baud rate."""
def setMode(self, mode: str):
"""Set the mode.
example: `"normal"`, `"loopback"`, `"silent"`, `"silent_loopback"`
"""
def enable(self):
"""Enable the CAN."""
def disable(self):
"""Disable the CAN."""
def write(self, data: str):
"""Write string to the CAN."""
def writeBytes(self, data: bytes, length: int):
"""Write bytes to the CAN."""
def read(self, length: int) -> str:
"""Read string from the CAN."""
def readBytes(self, length: int) -> bytes:
"""Read bytes from the CAN."""
def addFilter(self, id: int, ide: int, rtr: int, mode: int, mask: int, hdr: int):
"""Add a filter."""
@abstractmethod
def platformEnable(self): ...
@abstractmethod
def platformWrite(self): ...
@abstractmethod
def platformWriteBytes(self): ...
@abstractmethod
def platformRead(self): ...
@abstractmethod
def platformReadBytes(self): ...
@abstractmethod
def platformDisable(self): ...
class BaseDev:
@PIKA_C_MACRO_IF("PIKA_EVENT_ENABLE")
def addEventCallBack(self, eventCallback: any):
""" Add an event callback. """
@abstractmethod
@PIKA_C_MACRO_IF("PIKA_EVENT_ENABLE")
def platformGetEventId(self): ...

View File

@ -1,73 +0,0 @@
#include "PikaStdDevice_ADC.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_ADC_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_ADC_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_ADC_init(PikaObj* self) {
obj_setStr(self, "pin", "PA0");
}
void PikaStdDevice_ADC___init__(PikaObj* self) {
PikaStdDevice_ADC_init(self);
}
pika_float PikaStdDevice_ADC_read(PikaObj* self) {
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getFloat(self, "val");
}
void PikaStdDevice_ADC_setPin(PikaObj* self, char* pin) {
obj_setStr(self, "pin", pin);
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_ADC, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open ADC '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_ADC_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
if (NULL == dev) {
__platform_printf("Error: open ADC '%s' failed.\r\n",
obj_getStr(self, "pin"));
return;
}
pika_hal_ADC_config cfg = {0};
cfg.continue_or_single = PIKA_HAL_ADC_SINGLE;
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_ADC_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_ADC_platformRead(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ADC_config* cfg = (pika_hal_ADC_config*)dev->ioctl_config;
uint32_t val_i = 0;
pika_hal_read(dev, &val_i, sizeof(val_i));
pika_float val = (pika_float)val_i / (pika_float)cfg->max * cfg->vref;
val = val_i * obj_setFloat(self, "val", val);
}
void PikaStdDevice_ADC_close(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_close(dev);
}

View File

@ -1,32 +0,0 @@
#include "PikaStdDevice_BaseDev.h"
#include "PikaStdDevice_common.h"
#if !PIKASCRIPT_VERSION_REQUIRE_MINIMUN(1, 10, 4)
#error "This library requires PikaScript version 1.10.4 or higher"
#endif
PikaEventListener* g_pika_device_event_listener;
void PikaStdDevice_BaseDev_addEventCallBack(PikaObj* self, Arg* eventCallBack) {
#if PIKA_EVENT_ENABLE
obj_setArg(self, "eventCallBack", eventCallBack);
/* init event_listener for the first time */
if (NULL == g_pika_device_event_listener) {
pika_eventListener_init(&g_pika_device_event_listener);
}
if (PIKA_RES_OK != obj_runNativeMethod(self, "platformGetEventId", NULL)) {
obj_setErrorCode(self, 1);
__platform_printf("Error: Method %s no found.\r\n",
"platformGetEventId");
}
uint32_t eventId = obj_getInt(self, "eventId");
pika_eventListener_registEvent(g_pika_device_event_listener, eventId, self);
#else
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
#endif
}
void PikaStdDevice_BaseDev_platformGetEventId(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}

View File

@ -1,84 +0,0 @@
#include "PikaStdDevice_CAN.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_CAN___init__(PikaObj* self) {}
void PikaStdDevice_CAN_addFilter(PikaObj* self,
int hdr,
int id,
int ide,
int mask,
int mode,
int rtr) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_CAN_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_CAN_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_CAN_setMode(PikaObj* self, char* mode) {
obj_setStr(self, "mode", mode);
}
void PikaStdDevice_CAN_setName(PikaObj* self, char* name) {
obj_setStr(self, "name", name);
}
void PikaStdDevice_CAN_setBaudRate(PikaObj* self, int baudRate) {
obj_setInt(self, "baudRate", baudRate);
}
char* PikaStdDevice_CAN_read(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getStr(self, "readData");
}
Arg* PikaStdDevice_CAN_readBytes(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformReadBytes", NULL);
return arg_copy(obj_getArg(self, "readData"));
}
void PikaStdDevice_CAN_write(PikaObj* self, char* data) {
obj_setStr(self, "writeData", data);
obj_runNativeMethod(self, "platformWrite", NULL);
}
void PikaStdDevice_CAN_writeBytes(PikaObj* self, uint8_t* data, int length) {
obj_setBytes(self, "writeData", data, length);
obj_runNativeMethod(self, "platformWriteBytes", NULL);
}
void PikaStdDevice_CAN_platformDisable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_platformEnable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_platformRead(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_platformWrite(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_platformReadBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_CAN_platformWriteBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}

View File

@ -1,52 +0,0 @@
#include "PikaStdDevice_DAC.h"
#include "PikaStdDevice_common.h"
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_DAC, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open DAC '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_DAC_enable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_DAC_config cfg = {0};
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_DAC_setPin(PikaObj* self, char* pin) {
obj_setStr(self, "pin", pin);
}
void PikaStdDevice_DAC_disable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_DAC_init(PikaObj* self) {
obj_setStr(self, "pin", "PA0");
}
void PikaStdDevice_DAC___init__(PikaObj* self) {
PikaStdDevice_DAC_init(self);
}
void PikaStdDevice_DAC_write(PikaObj* self, pika_float val) {
pika_dev* dev = _get_dev(self);
pika_hal_DAC_config* cfg = (pika_hal_DAC_config*)dev->ioctl_config;
uint32_t val_i = (val / cfg->vref) * cfg->max;
pika_hal_write(dev, &val_i, sizeof val_i);
}
void PikaStdDevice_DAC_close(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_close(dev);
}

View File

@ -1,172 +0,0 @@
#include "PikaStdDevice_GPIO.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_GPIO_init(PikaObj* self) {
obj_setInt(self, "isEnable", 0);
obj_setStr(self, "pin", "none");
obj_setStr(self, "mode", "out");
obj_setInt(self, "isOn", 0);
obj_setStr(self, "pull", "none");
obj_setInt(self, "id", -999);
obj_setPtr(self, "pika_dev", NULL);
}
int PikaStdDevice_GPIO_getId(PikaObj* self) {
return obj_getInt(self, "id");
}
void PikaStdDevice_GPIO_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_GPIO___init__(PikaObj* self) {
PikaStdDevice_GPIO_init(self);
obj_setInt(self, "SIGNAL_RISING", PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
obj_setInt(self, "SIGNAL_FALLING", PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING);
obj_setInt(self, "SIGNAL_ANY", PIKA_HAL_GPIO_EVENT_SIGNAL_ANY);
}
void PikaStdDevice_GPIO_disable(PikaObj* self) {
obj_setInt(self, "isEnable", 0);
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_GPIO_enable(PikaObj* self) {
obj_setInt(self, "isEnable", 1);
obj_runNativeMethod(self, "platformEnable", NULL);
}
char* PikaStdDevice_GPIO_getMode(PikaObj* self) {
return obj_getStr(self, "mode");
}
char* PikaStdDevice_GPIO_getPin(PikaObj* self) {
return obj_getStr(self, "pin");
}
void PikaStdDevice_GPIO_low(PikaObj* self) {
obj_setInt(self, "isOn", 0);
obj_runNativeMethod(self, "platformLow", NULL);
}
void PikaStdDevice_GPIO_high(PikaObj* self) {
obj_setInt(self, "isOn", 1);
obj_runNativeMethod(self, "platformHigh", NULL);
}
int PikaStdDevice_GPIO_read(PikaObj* self) {
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getInt(self, "readBuff");
}
void PikaStdDevice_GPIO_setMode(PikaObj* self, char* mode) {
if (strEqu(mode, "out") || strEqu(mode, "in")) {
obj_setStr(self, "mode", mode);
obj_runNativeMethod(self, "platformSetMode", NULL);
} else {
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error] GPIO mode should be 'out' or 'in'.");
}
}
void PikaStdDevice_GPIO_setPull(PikaObj* self, char* pull) {
if (strEqu(pull, "up") || strEqu(pull, "down") || strEqu(pull, "none")) {
obj_setStr(self, "pull", pull);
} else {
obj_setErrorCode(self, 1);
obj_setSysOut(self,
"[error] GPIO pull should be 'up', 'down' or 'none'.");
}
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_GPIO_setPin(PikaObj* self, char* pinName) {
obj_setStr(self, "pin", pinName);
}
void PikaStdDevice_GPIO_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_GPIO_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_GPIO_platformLow(PikaObj* self) {
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_write(dev, &val, sizeof(val));
}
void PikaStdDevice_GPIO_platformHigh(PikaObj* self) {
pika_dev* dev = _get_dev(self);
uint32_t val = 1;
pika_hal_write(dev, &val, sizeof(val));
}
void PikaStdDevice_GPIO_platformSetMode(PikaObj* self) {
char* mode = obj_getStr(self, "mode");
pika_hal_GPIO_config cfg = {0};
if (strEqu(mode, "in")) {
cfg.dir = PIKA_HAL_GPIO_DIR_IN;
} else {
cfg.dir = PIKA_HAL_GPIO_DIR_OUT;
}
pika_dev* dev = _get_dev(self);
char* pull = obj_getStr(self, "pull");
if (strEqu(pull, "up")) {
cfg.pull = PIKA_HAL_GPIO_PULL_UP;
}
if (strEqu(pull, "down")) {
cfg.pull = PIKA_HAL_GPIO_PULL_DOWN;
}
if (strEqu(pull, "none")) {
cfg.pull = PIKA_HAL_GPIO_PULL_NONE;
}
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
}
void PikaStdDevice_GPIO_platformRead(PikaObj* self) {
pika_dev* dev = _get_dev(self);
uint32_t val = 0;
pika_hal_read(dev, &val, sizeof(val));
obj_setInt(self, "readBuff", val);
}
void PikaStdDevice_GPIO_setCallBack(PikaObj* self,
Arg* eventCallback,
int filter) {
#if PIKA_EVENT_ENABLE
pika_dev* dev = _get_dev(self);
_PikaStdDevice_setCallBack(self, eventCallback, (uintptr_t)dev);
/* regist event to pika_hal */
pika_hal_GPIO_config cfg_cb = {0};
cfg_cb.event_callback = (void*)_PikaStdDevice_event_handler;
cfg_cb.event_callback_filter = filter;
cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
#else
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
#endif
}
void PikaStdDevice_GPIO_close(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_close(dev);
}

View File

@ -1,85 +0,0 @@
#include "PikaStdDevice_IIC.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_IIC_init(PikaObj* self) {
obj_setInt(self, "deviceAddr", 0);
obj_setStr(self, "SCLpin", "PA0");
obj_setStr(self, "SDApin", "PA1");
}
void PikaStdDevice_IIC___init__(PikaObj* self) {
PikaStdDevice_IIC_init(self);
}
void PikaStdDevice_IIC_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_IIC_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_IIC_setDeviceAddr(PikaObj* self, int addr) {
obj_setInt(self, "deviceAddr", addr);
}
void PikaStdDevice_IIC_setPinSCL(PikaObj* self, char* pin) {
obj_setStr(self, "SCLpin", pin);
}
void PikaStdDevice_IIC_setPinSDA(PikaObj* self, char* pin) {
obj_setStr(self, "SDApin", pin);
}
void PikaStdDevice_IIC_write(PikaObj* self, int addr, char* data) {
obj_setStr(self, "writeData", data);
obj_setInt(self, "writeAddr", addr);
obj_runNativeMethod(self, "platformWrite", NULL);
}
void PikaStdDevice_IIC_writeBytes(PikaObj* self,
int addr,
uint8_t* data,
int length) {
obj_setBytes(self, "writeData", data, length);
obj_setInt(self, "writeAddr", addr);
obj_runNativeMethod(self, "platformWriteBytes", NULL);
}
char* PikaStdDevice_IIC_read(PikaObj* self, int addr, int length) {
obj_setInt(self, "length", length);
obj_setInt(self, "readAddr", addr);
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getStr(self, "readData");
}
Arg* PikaStdDevice_IIC_readBytes(PikaObj* self, int addr, int length) {
obj_setInt(self, "length", length);
obj_setInt(self, "readAddr", addr);
obj_runNativeMethod(self, "platformReadBytes", NULL);
return arg_copy(obj_getArg(self, "readData"));
}
void PikaStdDevice_IIC_platformWrite(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_IIC_platformEnable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_IIC_platformDisable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_IIC_platformRead(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_IIC_platformReadBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_IIC_platformWriteBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}

View File

@ -1,112 +0,0 @@
#include "PikaStdDevice_PWM.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_PWM_init(PikaObj* self) {
obj_setStr(self, "pin", "none");
obj_setStr(self, "name", "none");
obj_setInt(self, "freq", 1000);
obj_setInt(self, "ch", 0);
obj_setFloat(self, "duty", 0.5f);
}
void PikaStdDevice_PWM___init__(PikaObj* self) {
PikaStdDevice_PWM_init(self);
}
void PikaStdDevice_PWM_setPin(PikaObj* self, char* pin) {
obj_setStr(self, "pin", pin);
}
void PikaStdDevice_PWM_setFrequency(PikaObj* self, int freq) {
obj_setInt(self, "freq", freq);
obj_runNativeMethod(self, "platformSetFrequency", NULL);
}
void PikaStdDevice_PWM_setDuty(PikaObj* self, pika_float duty) {
obj_setFloat(self, "duty", duty);
obj_runNativeMethod(self, "platformSetDuty", NULL);
}
void PikaStdDevice_PWM_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_PWM_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
pika_float PikaStdDevice_PWM_getDuty(PikaObj* self) {
return obj_getFloat(self, "duty");
}
int PikaStdDevice_PWM_getFrequency(PikaObj* self) {
return obj_getInt(self, "freq");
}
char* PikaStdDevice_PWM_getName(PikaObj* self) {
return obj_getStr(self, "name");
}
void PikaStdDevice_PWM_setName(PikaObj* self, char* name) {
obj_setStr(self, "name", name);
}
void PikaStdDevice_PWM_setChannel(PikaObj* self, int ch) {
obj_setInt(self, "ch", ch);
}
int PikaStdDevice_PWM_getChannel(PikaObj* self) {
return obj_getInt(self, "ch");
}
void PikaStdDevice_PWM_setFreq(PikaObj* self, int freq) {
PikaStdDevice_PWM_setFrequency(self, freq);
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
dev = pika_hal_open(PIKA_HAL_PWM, obj_getStr(self, "pin"));
if (NULL == dev) {
__platform_printf("Error: open PWM '%s' failed.\r\n",
obj_getStr(self, "pin"));
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_PWM_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
}
void PikaStdDevice_PWM_platformSetDuty(PikaObj* self) {
pika_float duty = obj_getFloat(self, "duty"); // 0.0 ~ 1.0
uint32_t freq = obj_getInt(self, "freq"); // Hz
pika_hal_PWM_config cfg = {0};
/* ns */
cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
}
void PikaStdDevice_PWM_platformSetFrequency(PikaObj* self) {
uint32_t freq = obj_getInt(self, "freq"); // Hz
pika_float duty = obj_getFloat(self, "duty"); // 0.0 ~ 1.0
pika_hal_PWM_config cfg = {0};
/* ns */
cfg.period = (uint32_t)(1000000000.0f / freq);
cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
}
void PikaStdDevice_PWM_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_PWM_close(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_close(dev);
}

View File

@ -1,99 +0,0 @@
#include "PikaStdDevice_SPI.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_SPI___init__(PikaObj* self) {
obj_setInt(self, "baudRate", 1000);
obj_setInt(self, "id", 0);
obj_setStr(self, "name", "none");
obj_setInt(self, "phase", 0);
obj_setStr(self, "MISOpin", "none");
obj_setStr(self, "MOSIpin", "none");
obj_setStr(self, "SCKpin", "none");
obj_setInt(self, "polarity", 0);
}
void PikaStdDevice_SPI_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_SPI_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_SPI_write(PikaObj* self, char* data) {
obj_setStr(self, "writeData", data);
obj_runNativeMethod(self, "platformWrite", NULL);
}
void PikaStdDevice_SPI_writeBytes(PikaObj* self, uint8_t* data, int length) {
obj_setBytes(self, "writeData", data, length);
obj_runNativeMethod(self, "platformWriteBytes", NULL);
}
char* PikaStdDevice_SPI_read(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getStr(self, "readData");
}
Arg* PikaStdDevice_SPI_readBytes(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformReadBytes", NULL);
return arg_copy(obj_getArg(self, "readData"));
}
void PikaStdDevice_SPI_setBaudRate(PikaObj* self, int baudRate) {
obj_setInt(self, "baudRate", baudRate);
}
void PikaStdDevice_SPI_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_SPI_setName(PikaObj* self, char* name) {
obj_setStr(self, "name", name);
}
void PikaStdDevice_SPI_setPhase(PikaObj* self, int phase) {
obj_setInt(self, "phase", phase);
}
void PikaStdDevice_SPI_setPinMISO(PikaObj* self, char* pin) {
obj_setStr(self, "MISOpin", pin);
}
void PikaStdDevice_SPI_setPinMOSI(PikaObj* self, char* pin) {
obj_setStr(self, "MOSIpin", pin);
}
void PikaStdDevice_SPI_setPinSCK(PikaObj* self, char* pin) {
obj_setStr(self, "SCKpin", pin);
}
void PikaStdDevice_SPI_setPolarity(PikaObj* self, int polarity) {
obj_setInt(self, "polarity", polarity);
}
void PikaStdDevice_SPI_platformDisable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_SPI_platformEnable(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_SPI_platformWrite(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_SPI_platformRead(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_SPI_platformWriteBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}
void PikaStdDevice_SPI_platformReadBytes(PikaObj* self) {
ABSTRACT_METHOD_NEED_OVERRIDE_ERROR();
}

View File

@ -1,262 +0,0 @@
#include "PikaStdDevice_UART.h"
#include "PikaStdDevice_common.h"
void PikaStdDevice_UART_enable(PikaObj* self) {
obj_runNativeMethod(self, "platformEnable", NULL);
}
void PikaStdDevice_UART_disable(PikaObj* self) {
obj_runNativeMethod(self, "platformDisable", NULL);
}
void PikaStdDevice_UART_init(PikaObj* self) {
/* const */
obj_setInt(self, "FLOW_CONTROL_NONE", PIKA_HAL_UART_FLOW_CONTROL_NONE);
obj_setInt(self, "FLOW_CONTROL_RTS", PIKA_HAL_UART_FLOW_CONTROL_RTS);
obj_setInt(self, "FLOW_CONTROL_CTS", PIKA_HAL_UART_FLOW_CONTROL_CTS);
obj_setInt(self, "FLOW_CONTROL_RTS_CTS",
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS);
obj_setInt(self, "SIGNAL_RX", PIKA_HAL_UART_EVENT_SIGNAL_RX);
obj_setInt(self, "SIGNAL_TX", PIKA_HAL_UART_EVENT_SIGNAL_TX);
obj_setInt(self, "STOP_BITS_1", PIKA_HAL_UART_STOP_BITS_1);
obj_setInt(self, "STOP_BITS_2", PIKA_HAL_UART_STOP_BITS_2);
obj_setInt(self, "STOP_BITS_1_5", PIKA_HAL_UART_STOP_BITS_1_5);
obj_setInt(self, "PARITY_NONE", PIKA_HAL_UART_PARITY_NONE);
obj_setInt(self, "PARITY_ODD", PIKA_HAL_UART_PARITY_ODD);
obj_setInt(self, "PARITY_EVEN", PIKA_HAL_UART_PARITY_EVEN);
/* default */
obj_setInt(self, "baudRate", 115200);
obj_setInt(self, "id", 1);
obj_setStr(self, "readBuff", "");
obj_setInt(self, "flowControl", PIKA_HAL_UART_FLOW_CONTROL_NONE);
obj_setStr(self, "TXpin", "none");
obj_setStr(self, "RXpin", "none");
obj_setStr(self, "RTSpin", "none");
obj_setStr(self, "CTSpin", "none");
obj_setInt(self, "dataBits", 8);
obj_setInt(self, "parity", PIKA_HAL_UART_PARITY_NONE);
obj_setInt(self, "stopBits", PIKA_HAL_UART_STOP_BITS_1);
}
void PikaStdDevice_UART___init__(PikaObj* self) {
PikaStdDevice_UART_init(self);
}
char* PikaStdDevice_UART_read(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformRead", NULL);
return obj_getStr(self, "readData");
}
Arg* PikaStdDevice_UART_readBytes(PikaObj* self, int length) {
obj_setInt(self, "length", length);
obj_runNativeMethod(self, "platformReadBytes", NULL);
return arg_copy(obj_getArg(self, "readData"));
}
void PikaStdDevice_UART_setBaudRate(PikaObj* self, int baudRate) {
obj_setInt(self, "baudRate", baudRate);
}
void PikaStdDevice_UART_setFlowControl(PikaObj* self, int flowControl) {
obj_setInt(self, "flowControl", flowControl);
}
void PikaStdDevice_UART_setDataBits(PikaObj* self, int dataBits) {
obj_setInt(self, "dataBits", dataBits);
}
void PikaStdDevice_UART_setParity(PikaObj* self, int parity) {
obj_setInt(self, "parity", parity);
}
void PikaStdDevice_UART_setStopBits(PikaObj* self, int stopBits) {
obj_setInt(self, "stopBits", stopBits);
}
void PikaStdDevice_UART_setId(PikaObj* self, int id) {
obj_setInt(self, "id", id);
}
void PikaStdDevice_UART_write(PikaObj* self, char* data) {
obj_setStr(self, "writeData", data);
obj_runNativeMethod(self, "platformWrite", NULL);
}
void PikaStdDevice_UART_writeBytes(PikaObj* self, uint8_t* data, int length) {
obj_setBytes(self, "writeData", data, length);
obj_runNativeMethod(self, "platformWriteBytes", NULL);
}
static pika_dev* _get_dev(PikaObj* self) {
pika_dev* dev = obj_getPtr(self, "pika_dev");
if (NULL != dev) {
return dev;
}
int id = obj_getInt(self, "id");
char id_str[32] = {0};
sprintf(id_str, "UART%d", id);
dev = pika_hal_open(PIKA_HAL_UART, id_str);
if (NULL == dev) {
__platform_printf("Error: open UART '%s' failed.\r\n", id_str);
}
obj_setPtr(self, "pika_dev", dev);
return dev;
}
void PikaStdDevice_UART_platformEnable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
if (NULL == dev) {
__platform_printf("Error: open UART '%d' failed.\r\n",
(int)obj_getInt(self, "id"));
return;
}
pika_hal_UART_config cfg = {0};
cfg.baudrate = obj_getInt(self, "baudRate");
cfg.flow_control = obj_getInt(self, "flowControl");
cfg.stop_bits = obj_getInt(self, "stopBits");
cfg.parity = obj_getInt(self, "parity");
cfg.data_bits = obj_getInt(self, "dataBits");
if (!strEqu(obj_getStr(self, "TXpin"), "none")) {
cfg.TX = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "TXpin"));
if (NULL == cfg.TX) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "TXpin"));
}
}
if (!strEqu(obj_getStr(self, "RXpin"), "none")) {
cfg.RX = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "RXpin"));
if (NULL == cfg.RX) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "RXpin"));
}
}
if (!strEqu(obj_getStr(self, "RTSpin"), "none")) {
cfg.RTS = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "RTSpin"));
if (NULL == cfg.RTS) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "RTSpin"));
}
}
if (!strEqu(obj_getStr(self, "CTSpin"), "none")) {
cfg.CTS = pika_hal_open(PIKA_HAL_GPIO, obj_getStr(self, "CTSpin"));
if (NULL == cfg.CTS) {
__platform_printf("Error: open GPIO '%s' failed.\r\n",
obj_getStr(self, "CTSpin"));
}
}
int err = -1;
err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
if (err != 0) {
__platform_printf("Error: config UART '%d' failed.\r\n",
(int)obj_getInt(self, "id"));
return;
}
err = pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
if (err != 0) {
__platform_printf("Error: enable UART '%d' failed.\r\n",
(int)obj_getInt(self, "id"));
return;
}
}
void PikaStdDevice_UART_platformRead(PikaObj* self) {
int len = obj_getInt(self, "length");
obj_setBytes(self, "_readData", NULL, len + 1);
char* buff = (char*)obj_getBytes(self, "_readData");
pika_dev* dev = _get_dev(self);
int len_get = pika_hal_read(dev, buff, len);
buff[len_get] = 0;
obj_setStr(self, "readData", buff);
}
void PikaStdDevice_UART_platformWrite(PikaObj* self) {
char* data = obj_getStr(self, "writeData");
pika_dev* dev = _get_dev(self);
pika_hal_write(dev, data, strlen(data));
}
void PikaStdDevice_UART_platformDisable(PikaObj* self) {
pika_dev* dev = _get_dev(self);
if (NULL == dev) {
__platform_printf("Error: open UART '%d' failed.\r\n",
(int)obj_getInt(self, "id"));
return;
}
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
}
void PikaStdDevice_UART_platformReadBytes(PikaObj* self) {
int len = obj_getInt(self, "length");
obj_setBytes(self, "_readData", NULL, len + 1);
uint8_t* buff = obj_getBytes(self, "_readData");
pika_dev* dev = _get_dev(self);
int len_get = pika_hal_read(dev, buff, len);
obj_setBytes(self, "readData", buff, len_get);
}
void PikaStdDevice_UART_platformWriteBytes(PikaObj* self) {
uint8_t* data = obj_getBytes(self, "writeData");
int len = obj_getBytesSize(self, "writeData");
pika_dev* dev = _get_dev(self);
pika_hal_write(dev, data, len);
}
void PikaStdDevice_UART_setCallBack(PikaObj* self,
Arg* eventCallBack,
int filter) {
#if PIKA_EVENT_ENABLE
pika_dev* dev = _get_dev(self);
_PikaStdDevice_setCallBack(self, eventCallBack, (uintptr_t)dev);
/* regist event to pika_hal */
pika_hal_UART_config cfg_cb = {0};
cfg_cb.event_callback = (void*)_PikaStdDevice_event_handler;
cfg_cb.event_callback_filter = filter;
cfg_cb.event_callback_ena = PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE;
pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg_cb);
#else
obj_setErrorCode(self, 1);
obj_setSysOut(self, "[error] PIKA_EVENT_ENABLE is disabled.");
#endif
}
void PikaStdDevice_UART_close(PikaObj* self) {
pika_dev* dev = _get_dev(self);
pika_hal_UART_config* cfg = (pika_hal_UART_config*)dev->ioctl_config;
if (NULL != cfg->TX) {
pika_hal_close(cfg->TX);
cfg->TX = NULL;
}
if (NULL != cfg->RX) {
pika_hal_close(cfg->RX);
cfg->RX = NULL;
}
if (NULL != cfg->RTS) {
pika_hal_close(cfg->RTS);
cfg->RTS = NULL;
}
if (NULL != cfg->CTS) {
pika_hal_close(cfg->CTS);
cfg->CTS = NULL;
}
pika_hal_close(dev);
}
void PikaStdDevice_UART_setPinCTS(PikaObj* self, char* pin) {
obj_setStr(self, "CTSpin", pin);
}
void PikaStdDevice_UART_setPinRTS(PikaObj* self, char* pin) {
obj_setStr(self, "RTSpin", pin);
}
void PikaStdDevice_UART_setPinRX(PikaObj* self, char* pin) {
obj_setStr(self, "RXpin", pin);
}
void PikaStdDevice_UART_setPinTX(PikaObj* self, char* pin) {
obj_setStr(self, "TXpin", pin);
}

View File

@ -1,31 +0,0 @@
#include "PikaStdDevice_common.h"
extern PikaEventListener* g_pika_device_event_listener;
void _PikaStdDevice_event_handler(pika_dev* dev, int signal) {
pika_eventListener_sendSignal(g_pika_device_event_listener, (uintptr_t)dev,
signal);
}
void _PikaStdDevice_setCallBack(PikaObj* self,
Arg* eventCallback,
uint32_t eventId) {
obj_setArg(self, "eventCallBack", eventCallback);
/* init event_listener for the first time */
if (NULL == g_pika_device_event_listener) {
pika_eventListener_init(&g_pika_device_event_listener);
}
/* regist event to event listener */
pika_eventListener_registEvent(g_pika_device_event_listener, eventId, self);
}
extern volatile PikaObj* __pikaMain;
PikaObj* PikaStdDevice_Time(PikaObj* self) {
PikaObj* time = obj_getPtr((PikaObj*)__pikaMain, "time");
if (NULL == time) {
obj_setErrorCode(self, -1);
obj_setSysOut(self, "Error: please install and import 'time' module");
return NULL;
}
obj_refcntInc(time);
return time;
}

View File

@ -1,12 +0,0 @@
#ifndef _PIKA_STDDEVICE_COMMON_H
#define _PIKA_STDDEVICE_COMMON_H
#include "PikaObj.h"
#include "PikaVM.h"
#include "pika_hal.h"
void _PikaStdDevice_setCallBack(PikaObj* self,
Arg* eventCallback,
uint32_t eventId);
void _PikaStdDevice_event_handler(pika_dev* dev, int signal);
#endif

View File

@ -0,0 +1,30 @@
# PHP
嵌入式Python速成班基于PikaPython简称为PHPPikaPython 黄埔)
## 第一期
- [开班公告报名截止至2023年6月30日](https://mp.weixin.qq.com/s?__biz=MzU4NzUzMDc1OA==&mid=2247484801&idx=1&sn=194d567cb5c8174f43007a0a0427b11a&chksm=fdebd2e8ca9c5bfeeff134aa906acb3de2496ea1faed3bba8ba61139705ea427d577183a2e19&token=955099065&lang=zh_CN#rd)
- [开发板资料(开源硬件)](Phase1/Hardware)
开发板底版:
- 主控ESP32S3
- 4GFS800
- rs485
- 蜂鸣器
- nand FLASH
- 继电器
- 12V供电
- 温度传感器
- 光敏电阻
![9bd0a46068c3f96db0ad85e40709d6d](assets/9bd0a46068c3f96db0ad85e40709d6d.png)
LCD拓展板
- 240*320 LCD屏
- 按键*4
![3769ab4d3c57bd9d48ca4e07b48603a](assets/3769ab4d3c57bd9d48ca4e07b48603a.png)

View File

@ -1,325 +0,0 @@
#include "pika_hal.h"
#include "PikaObj.h"
#define PIKA_HAL_TABLE_FILE_API
#include "pika_hal_table.h"
static const pika_dev_impl pika_dev_impl_list[] = {
#define PIKA_HAL_TABLE_IMPL
#include "pika_hal_table.h"
};
#define _PIKA_DEV_TYPE_MAX \
(sizeof pika_dev_impl_list / sizeof pika_dev_impl_list[0])
static pika_dev_impl* _pika_dev_get_impl(PIKA_HAL_DEV_TYPE type) {
if (type >= _PIKA_DEV_TYPE_MAX) {
return NULL;
}
return (pika_dev_impl*)&pika_dev_impl_list[type];
}
static size_t _pika_hal_dev_config_size(PIKA_HAL_DEV_TYPE dev_type) {
#define PIKA_HAL_TABLE_DEV_CONFIG_SIZE
#include "pika_hal_table.h"
return 0;
}
pika_dev* pika_hal_open(PIKA_HAL_DEV_TYPE dev_type, char* name) {
if (NULL == name) {
__platform_printf("Error: dev_open name is NULL.\r\n");
return NULL;
}
int ret = -1;
pika_dev* dev = NULL;
if (dev_type >= _PIKA_DEV_TYPE_MAX) {
__platform_printf("Error: dev_type invalied.\r\n");
goto __exit;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev_type);
dev = (pika_dev*)pikaMalloc(sizeof(pika_dev));
if (dev == NULL) {
goto __exit;
}
memset(dev, 0, sizeof(pika_dev));
dev->type = dev_type;
dev->ioctl_config = pikaMalloc(_pika_hal_dev_config_size(dev_type));
if (dev->ioctl_config == NULL) {
goto __exit;
}
memset(dev->ioctl_config, 0, _pika_hal_dev_config_size(dev_type));
ret = impl->open(dev, name);
__exit:
if (0 == ret) {
return dev;
}
/* error */
__platform_printf("Error: dev_open failed.\r\n");
if (dev && dev->ioctl_config) {
pikaFree(dev->ioctl_config, _pika_hal_dev_config_size(dev_type));
dev->ioctl_config = NULL;
}
if (dev) {
pikaFree(dev, sizeof(pika_dev));
}
return NULL;
}
int pika_hal_close(pika_dev* dev) {
int ret = -1;
if (dev == NULL) {
goto __exit;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
if (impl->close == NULL) {
goto __exit;
}
ret = impl->close(dev);
__exit:
if (NULL != dev && NULL != dev->ioctl_config) {
pikaFree(dev->ioctl_config, _pika_hal_dev_config_size(dev->type));
dev->ioctl_config = NULL;
}
if (NULL != dev) {
pikaFree(dev, sizeof(pika_dev));
}
return ret;
}
int pika_hal_read(pika_dev* dev, void* buf, size_t len) {
if (dev == NULL) {
return -1;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
if (impl->read == NULL) {
return -1;
}
return impl->read(dev, buf, len);
}
int pika_hal_write(pika_dev* dev, void* buf, size_t len) {
if (dev == NULL) {
return -1;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
if (impl->write == NULL) {
return -1;
}
return impl->write(dev, buf, len);
}
static const int _pika_hal_cmd_arg_cnt[] = {
[PIKA_HAL_IOCTL_CONFIG] = 1,
[PIKA_HAL_IOCTL_ENABLE] = 0,
[PIKA_HAL_IOCTL_DISABLE] = 0,
};
#define _PIKA_HAL_CMD_ARG_CNT_MAX \
(sizeof _pika_hal_cmd_arg_cnt / sizeof _pika_hal_cmd_arg_cnt[0])
static int _pika_hal_get_arg_cnt(PIKA_HAL_IOCTL_CMD cmd) {
return _pika_hal_cmd_arg_cnt[PIKA_HAL_IOCTL_CONFIG];
}
int _pika_hal_ioctl_merge_config(pika_dev* dev, void* config_in) {
#define PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG
#include "pika_hal_table.h"
return -1;
}
int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
int ret = -1;
PIKA_HAL_IOCTL_CMD cmd_origin = cmd;
if (dev == NULL) {
return -1;
}
cmd = _pika_hal_get_arg_cnt(cmd_origin);
if (cmd < 0) {
return -1;
}
pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
if (impl->ioctl == NULL) {
return -1;
}
void* arg_in = NULL;
if (cmd != 0) {
va_list args;
va_start(args, cmd);
arg_in = va_arg(args, void*);
if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
ret = _pika_hal_ioctl_merge_config(dev, arg_in);
} else {
ret = 0;
}
va_end(args);
if (0 != ret) {
return ret;
}
}
if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
} else {
ret = impl->ioctl(dev, cmd_origin, arg_in);
}
if (ret == 0) {
if (cmd_origin == PIKA_HAL_IOCTL_ENABLE) {
dev->is_enabled = 1;
}
if (cmd_origin == PIKA_HAL_IOCTL_DISABLE) {
dev->is_enabled = 0;
}
}
return ret;
}
#define _IOCTL_CONFIG_USE_DEFAULT(item, default) \
if (src->item == 0) { \
if (dst->item == 0) { \
/* use default value */ \
dst->item = default; \
} else { \
/* keep exist value */ \
} \
} else { \
/* use input value */ \
dst->item = src->item; \
}
#define _IOCTL_CONFIG_USE_DEFAULT_STR(item, default) \
if (src->item[0] == '\0') { \
if (dst->item[0] == '\0') { \
/* use default value */ \
strcpy(dst->item, default); \
} else { \
/* keep exist value */ \
} \
} else { \
/* use input value */ \
strcpy(dst->item, src->item); \
}
int pika_hal_GPIO_ioctl_merge_config(pika_hal_GPIO_config* dst,
pika_hal_GPIO_config* src) {
// printf("before merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
_IOCTL_CONFIG_USE_DEFAULT(dir, PIKA_HAL_GPIO_DIR_IN);
// printf("after merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
_IOCTL_CONFIG_USE_DEFAULT(pull, PIKA_HAL_GPIO_PULL_NONE);
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_GPIO_SPEED_10M);
_IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
return 0;
}
int pika_hal_UART_ioctl_merge_config(pika_hal_UART_config* dst,
pika_hal_UART_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(baudrate, PIKA_HAL_UART_BAUDRATE_115200);
_IOCTL_CONFIG_USE_DEFAULT(data_bits, PIKA_HAL_UART_DATA_BITS_8);
_IOCTL_CONFIG_USE_DEFAULT(stop_bits, PIKA_HAL_UART_STOP_BITS_1);
_IOCTL_CONFIG_USE_DEFAULT(parity, PIKA_HAL_UART_PARITY_NONE);
_IOCTL_CONFIG_USE_DEFAULT(flow_control, PIKA_HAL_UART_FLOW_CONTROL_NONE);
_IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
PIKA_HAL_UART_EVENT_SIGNAL_RX);
_IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
_IOCTL_CONFIG_USE_DEFAULT(TX, NULL);
_IOCTL_CONFIG_USE_DEFAULT(RX, NULL);
_IOCTL_CONFIG_USE_DEFAULT(RTS, NULL);
_IOCTL_CONFIG_USE_DEFAULT(CTS, NULL);
return 0;
}
int pika_hal_SPI_ioctl_merge_config(pika_hal_SPI_config* dst,
pika_hal_SPI_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(lsb_or_msb, PIKA_HAL_SPI_MSB);
_IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_SPI_MASTER);
_IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_SPI_MODE_0);
_IOCTL_CONFIG_USE_DEFAULT(data_width, PIKA_HAL_SPI_DATA_WIDTH_8);
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_SPI_SPEED_2M);
_IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_SPI_TIMEOUT_1000MS);
return 0;
}
int pika_hal_SOFT_SPI_ioctl_merge_config(pika_hal_SOFT_SPI_config* dst,
pika_hal_SOFT_SPI_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(lsb_or_msb, PIKA_HAL_SPI_MSB);
_IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_SPI_MASTER);
_IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_SPI_MODE_0);
_IOCTL_CONFIG_USE_DEFAULT(data_width, PIKA_HAL_SPI_DATA_WIDTH_8);
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_SPI_SPEED_2M);
_IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_SPI_TIMEOUT_1000MS);
_IOCTL_CONFIG_USE_DEFAULT(CS, NULL);
_IOCTL_CONFIG_USE_DEFAULT(SCK, NULL);
_IOCTL_CONFIG_USE_DEFAULT(MOSI, NULL);
_IOCTL_CONFIG_USE_DEFAULT(MISO, NULL);
return 0;
}
int pika_hal_IIC_ioctl_merge_config(pika_hal_IIC_config* dst,
pika_hal_IIC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(address_width, PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT);
_IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_IIC_MASTER);
_IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_ena, PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_size, PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT);
dst->mem_addr = src->mem_addr;
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_IIC_SPEED_100K);
_IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_IIC_TIMEOUT_1000MS);
return 0;
}
int pika_hal_SOFT_IIC_ioctl_merge_config(pika_hal_SOFT_IIC_config* dst,
pika_hal_SOFT_IIC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(SDA, NULL);
_IOCTL_CONFIG_USE_DEFAULT(SCL, NULL);
_IOCTL_CONFIG_USE_DEFAULT(address_width, PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT);
_IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_IIC_MASTER);
_IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_ena, PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE);
_IOCTL_CONFIG_USE_DEFAULT(mem_addr_size, PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT);
dst->mem_addr = src->mem_addr;
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_IIC_SPEED_100K);
_IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_IIC_TIMEOUT_1000MS);
return 0;
}
int pika_hal_PWM_ioctl_merge_config(pika_hal_PWM_config* dst,
pika_hal_PWM_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_PWM_PERIOD_1MS * 10);
// _IOCTL_CONFIG_USE_DEFAULT(duty, 0);
dst->duty = src->duty;
return 0;
}
int pika_hal_ADC_ioctl_merge_config(pika_hal_ADC_config* dst,
pika_hal_ADC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_ADC_RESOLUTION_12);
_IOCTL_CONFIG_USE_DEFAULT(sampling_freq, PIKA_HAL_ADC_SAMPLING_FREQ_100);
_IOCTL_CONFIG_USE_DEFAULT(continue_or_single, PIKA_HAL_ADC_SINGLE);
_IOCTL_CONFIG_USE_DEFAULT(vref, (pika_float)3.3);
_IOCTL_CONFIG_USE_DEFAULT(max, 8192);
return 0;
}
int pika_hal_DAC_ioctl_merge_config(pika_hal_DAC_config* dst,
pika_hal_DAC_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_DAC_SPEED_1K * 8);
_IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_DAC_RESOLUTION_12);
_IOCTL_CONFIG_USE_DEFAULT(vref, (pika_float)3.3);
_IOCTL_CONFIG_USE_DEFAULT(max, 3300000);
return 0;
}
int pika_hal_WIFI_ioctl_merge_config(pika_hal_WIFI_config* dst,
pika_hal_WIFI_config* src) {
_IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_WIFI_MODE_STA);
_IOCTL_CONFIG_USE_DEFAULT(channel, PIKA_HAL_WIFI_CHANNEL_0);
_IOCTL_CONFIG_USE_DEFAULT(max_connection, PIKA_HAL_WIFI_MAX_CONNECTION_4);
_IOCTL_CONFIG_USE_DEFAULT_STR(ap_ssid, "pikapython.com");
_IOCTL_CONFIG_USE_DEFAULT_STR(ap_bssid, "");
_IOCTL_CONFIG_USE_DEFAULT_STR(ap_password, "pikapython.com");
return 0;
}

View File

@ -1,499 +0,0 @@
#ifndef _PIKA_DEV_HAL_H
#define _PIKA_DEV_HAL_H
#include <stddef.h>
#include <stdint.h>
#include "PikaObj.h"
/*
* pika_hal is a C Device HAL lib for PikaScript modules.
* the API of pika_hal is similar to the posix file API.
*/
typedef enum {
#define PIKA_HAL_TABLE_DEV_TYPE
#include "pika_hal_table.h"
} PIKA_HAL_DEV_TYPE;
typedef struct {
PIKA_HAL_DEV_TYPE type;
PIKA_BOOL is_enabled;
void* ioctl_config;
void* platform_data;
} pika_dev;
typedef enum {
PIKA_HAL_IOCTL_CONFIG,
PIKA_HAL_IOCTL_ENABLE,
PIKA_HAL_IOCTL_DISABLE,
PIKA_HAL_IOCTL_WIFI_GET_ACTIVE,
PIKA_HAL_IOCTL_WIFI_GET_STATUS,
PIKA_HAL_IOCTL_WIFI_SCAN,
PIKA_HAL_IOCTL_WIFI_CONNECT,
PIKA_HAL_IOCTL_WIFI_DISCONNECT,
PIKA_HAL_IOCTL_WIFI_SET_IFCONFIG,
PIKA_HAL_IOCTL_WIFI_GET_IFCONFIG,
_ = 0xFFFFFFFF, // make sure it is 4 byte width
} PIKA_HAL_IOCTL_CMD;
/* posix file like API */
pika_dev* pika_hal_open(PIKA_HAL_DEV_TYPE dev_type, char* name);
int pika_hal_close(pika_dev* dev);
int pika_hal_read(pika_dev* dev, void* buf, size_t len);
int pika_hal_write(pika_dev* dev, void* buf, size_t len);
int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...);
typedef enum {
_PIKA_HAL_GPIO_DIR_UNUSED = 0,
PIKA_HAL_GPIO_DIR_IN,
PIKA_HAL_GPIO_DIR_OUT,
} PIKA_HAL_GPIO_DIR;
typedef enum {
_PIKA_HAL_GPIO_PULL_UNUSED = 0,
PIKA_HAL_GPIO_PULL_NONE,
PIKA_HAL_GPIO_PULL_UP,
PIKA_HAL_GPIO_PULL_DOWN,
} PIKA_HAL_GPIO_PULL;
typedef enum {
_PIKA_HAL_GPIO_SPEED_UNUSED = 0,
PIKA_HAL_GPIO_SPEED_1M = 1000000,
PIKA_HAL_GPIO_SPEED_2M = 2000000,
PIKA_HAL_GPIO_SPEED_5M = 5000000,
PIKA_HAL_GPIO_SPEED_10M = 10000000,
PIKA_HAL_GPIO_SPEED_20M = 20000000,
PIKA_HAL_GPIO_SPEED_50M = 50000000,
PIKA_HAL_GPIO_SPEED_100M = 100000000,
} PIKA_HAL_GPIO_SPEED;
typedef enum {
_PIKA_HAL_EVENT_CALLBACK_ENA_UNUSED = 0,
PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE,
PIKA_HAL_EVENT_CALLBACK_ENA_DISABLE,
} PIKA_HAL_EVENT_CALLBACK_ENA;
typedef enum {
_PIKA_HAL_GPIO_EVENT_SIGNAL_UNUSED = 0,
PIKA_HAL_GPIO_EVENT_SIGNAL_RISING,
PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING,
PIKA_HAL_GPIO_EVENT_SIGNAL_ANY,
} PIKA_HAL_GPIO_EVENT_SIGNAL;
typedef struct {
PIKA_HAL_GPIO_DIR dir;
PIKA_HAL_GPIO_PULL pull;
PIKA_HAL_GPIO_SPEED speed;
void (*event_callback)(pika_dev* dev, PIKA_HAL_GPIO_EVENT_SIGNAL signal);
PIKA_HAL_GPIO_EVENT_SIGNAL event_callback_filter;
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
} pika_hal_GPIO_config;
typedef enum {
_PIKA_HAL_UART_BAUDRATE_UNUSED = 0,
PIKA_HAL_UART_BAUDRATE_9600 = 9600,
PIKA_HAL_UART_BAUDRATE_19200 = 19200,
PIKA_HAL_UART_BAUDRATE_38400 = 38400,
PIKA_HAL_UART_BAUDRATE_57600 = 57600,
PIKA_HAL_UART_BAUDRATE_115200 = 115200,
PIKA_HAL_UART_BAUDRATE_2000000 = 2000000,
PIKA_HAL_UART_BAUDRATE_10000000 = 10000000,
} PIKA_HAL_UART_BAUDRATE;
typedef enum {
_PIKA_HAL_UART_DATA_BITS_UNUSED = 0,
PIKA_HAL_UART_DATA_BITS_5 = 5,
PIKA_HAL_UART_DATA_BITS_6 = 6,
PIKA_HAL_UART_DATA_BITS_7 = 7,
PIKA_HAL_UART_DATA_BITS_8 = 8,
} PIKA_HAL_UART_DATA_BITS;
typedef enum {
_PIKA_HAL_UART_STOP_BITS_UNUSED = 0,
PIKA_HAL_UART_STOP_BITS_1 = 1,
PIKA_HAL_UART_STOP_BITS_2 = 2,
PIKA_HAL_UART_STOP_BITS_1_5 = 3,
} PIKA_HAL_UART_STOP_BITS;
typedef enum {
_PIKA_HAL_UART_PARITY_UNUSED = 0,
PIKA_HAL_UART_PARITY_NONE,
PIKA_HAL_UART_PARITY_ODD,
PIKA_HAL_UART_PARITY_EVEN,
} PIKA_HAL_UART_PARITY;
typedef enum {
_PIKA_HAL_UART_EVENT_SIGNAL_UNUSED = 0,
PIKA_HAL_UART_EVENT_SIGNAL_RX,
PIKA_HAL_UART_EVENT_SIGNAL_TX,
PIKA_HAL_UART_EVENT_SIGNAL_ANY,
} PIKA_HAL_UART_EVENT_SIGNAL;
typedef enum {
_PIKA_HAL_UART_FLOW_CONTROL_UNUSED = 0,
PIKA_HAL_UART_FLOW_CONTROL_NONE,
PIKA_HAL_UART_FLOW_CONTROL_RTS,
PIKA_HAL_UART_FLOW_CONTROL_CTS,
PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS,
} PIKA_HAL_UART_FLOW_CONTROL;
typedef struct {
PIKA_HAL_UART_BAUDRATE baudrate;
PIKA_HAL_UART_DATA_BITS data_bits;
PIKA_HAL_UART_STOP_BITS stop_bits;
PIKA_HAL_UART_PARITY parity;
PIKA_HAL_UART_FLOW_CONTROL flow_control;
void (*event_callback)(pika_dev* dev, PIKA_HAL_UART_EVENT_SIGNAL signal);
PIKA_HAL_UART_EVENT_SIGNAL event_callback_filter;
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
pika_dev* TX;
pika_dev* RX;
pika_dev* RTS;
pika_dev* CTS;
} pika_hal_UART_config;
typedef uint32_t PIKA_HAL_IIC_SLAVE_ADDR;
typedef uint32_t PIKA_HAL_IIC_MEM_ADDR;
typedef enum PIKA_HAL_IIC_MEM_ADDR_SIZE {
_PIKA_HAL_IIC_MEM_ADDR_SIZE_UNUSED = 0,
PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT = 1,
PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT = 2,
PIKA_HAL_IIC_MEM_ADDR_SIZE_24BIT = 3,
PIKA_HAL_IIC_MEM_ADDR_SIZE_32BIT = 4,
} PIKA_HAL_IIC_MEM_ADDR_SIZE;
typedef enum PIKA_HAL_IIC_MEM_ADDR_ENA {
_PIKA_HAL_IIC_MEM_ADDR_ENA_UNUSED = 0,
PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE,
PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE,
} PIKA_HAL_IIC_MEM_ADDR_ENA;
typedef enum {
_PIKA_HAL_IIC_SPEED_UNUSED = 0,
PIKA_HAL_IIC_SPEED_100K = 100000,
PIKA_HAL_IIC_SPEED_400K = 400000,
PIKA_HAL_IIC_SPEED_1M = 1000000,
} PIKA_HAL_IIC_SPEED;
typedef enum PIKA_HAL_IIC_MASTER_OR_SLAVE {
_PIKA_HAL_IIC_MASTER_OR_SLAVE_UNUSED = 0,
PIKA_HAL_IIC_MASTER,
PIKA_HAL_IIC_SLAVE,
} PIKA_HAL_IIC_MASTER_OR_SLAVE;
typedef enum PIKA_HAL_IIC_ADDRESS_WIDTH {
_PIKA_HAL_IIC_ADDRESS_WIDTH_UNUSED = 0,
PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT = 7,
PIKA_HAL_IIC_ADDRESS_WIDTH_10BIT = 10,
} PIKA_HAL_IIC_ADDRESS_WIDTH;
typedef enum PIKA_HAL_IIC_TIMEOUT {
_PIKA_HAL_IIC_TIMEOUT_UNUSED = 0,
PIKA_HAL_IIC_TIMEOUT_1MS = 1,
PIKA_HAL_IIC_TIMEOUT_2MS = 2,
PIKA_HAL_IIC_TIMEOUT_5MS = 5,
PIKA_HAL_IIC_TIMEOUT_10MS = 10,
PIKA_HAL_IIC_TIMEOUT_20MS = 20,
PIKA_HAL_IIC_TIMEOUT_50MS = 50,
PIKA_HAL_IIC_TIMEOUT_100MS = 100,
PIKA_HAL_IIC_TIMEOUT_200MS = 200,
PIKA_HAL_IIC_TIMEOUT_500MS = 500,
PIKA_HAL_IIC_TIMEOUT_1000MS = 1000,
} PIKA_HAL_IIC_TIMEOUT;
typedef struct {
PIKA_HAL_IIC_ADDRESS_WIDTH address_width;
PIKA_HAL_IIC_MASTER_OR_SLAVE master_or_slave;
PIKA_HAL_IIC_SLAVE_ADDR slave_addr;
PIKA_HAL_IIC_MEM_ADDR_ENA mem_addr_ena;
PIKA_HAL_IIC_MEM_ADDR mem_addr;
PIKA_HAL_IIC_MEM_ADDR_SIZE mem_addr_size;
PIKA_HAL_IIC_SPEED speed;
PIKA_HAL_IIC_TIMEOUT timeout;
} pika_hal_IIC_config;
typedef struct {
pika_dev* SDA;
pika_dev* SCL;
PIKA_HAL_IIC_ADDRESS_WIDTH address_width;
PIKA_HAL_IIC_MASTER_OR_SLAVE master_or_slave;
PIKA_HAL_IIC_SLAVE_ADDR slave_addr;
PIKA_HAL_IIC_MEM_ADDR_ENA mem_addr_ena;
PIKA_HAL_IIC_MEM_ADDR mem_addr;
PIKA_HAL_IIC_MEM_ADDR_SIZE mem_addr_size;
PIKA_HAL_IIC_SPEED speed;
PIKA_HAL_IIC_TIMEOUT timeout;
} pika_hal_SOFT_IIC_config;
typedef enum PIKA_HAL_SPI_TIMEOUT {
_PIKA_HAL_SPI_TIMEOUT_UNUSED = 0,
PIKA_HAL_SPI_TIMEOUT_1MS = 1,
PIKA_HAL_SPI_TIMEOUT_2MS = 2,
PIKA_HAL_SPI_TIMEOUT_5MS = 5,
PIKA_HAL_SPI_TIMEOUT_10MS = 10,
PIKA_HAL_SPI_TIMEOUT_20MS = 20,
PIKA_HAL_SPI_TIMEOUT_50MS = 50,
PIKA_HAL_SPI_TIMEOUT_100MS = 100,
PIKA_HAL_SPI_TIMEOUT_200MS = 200,
PIKA_HAL_SPI_TIMEOUT_500MS = 500,
PIKA_HAL_SPI_TIMEOUT_1000MS = 1000,
} PIKA_HAL_SPI_TIMEOUT;
typedef enum {
_PIKA_HAL_SPI_LSB_OR_MSB_UNUSED = 0,
PIKA_HAL_SPI_LSB,
PIKA_HAL_SPI_MSB,
} PIKA_HAL_SPI_LSB_OR_MSB;
typedef enum {
_PIKA_HAL_SPI_MASTER_OR_SLAVE_UNUSED = 0,
PIKA_HAL_SPI_MASTER,
PIKA_HAL_SPI_SLAVE,
} PIKA_HAL_SPI_MASTER_OR_SLAVE;
typedef enum {
_PIKA_HAL_SPI_MODE_UNUSED = 0,
PIKA_HAL_SPI_MODE_0,
PIKA_HAL_SPI_MODE_1,
PIKA_HAL_SPI_MODE_2,
PIKA_HAL_SPI_MODE_3,
} PIKA_HAL_SPI_MODE;
typedef enum {
_PIKA_HAL_SPI_DATA_UNUSED = 0,
PIKA_HAL_SPI_DATA_WIDTH_8 = 8,
PIKA_HAL_SPI_DATA_WIDTH_16 = 16,
} PIKA_HAL_SPI_DATA_WIDTH;
typedef enum {
_PIKA_HAL_SPI_SPEED_UNUSED = 0,
PIKA_HAL_SPI_SPEED_1M = 1000000,
PIKA_HAL_SPI_SPEED_2M = 2000000,
PIKA_HAL_SPI_SPEED_5M = 5000000,
PIKA_HAL_SPI_SPEED_10M = 10000000,
PIKA_HAL_SPI_SPEED_20M = 20000000,
PIKA_HAL_SPI_SPEED_50M = 50000000,
PIKA_HAL_SPI_SPEED_100M = 100000000,
} PIKA_HAL_SPI_SPEED;
typedef struct {
PIKA_HAL_SPI_LSB_OR_MSB lsb_or_msb;
PIKA_HAL_SPI_MASTER_OR_SLAVE master_or_slave;
PIKA_HAL_SPI_MODE mode;
PIKA_HAL_SPI_DATA_WIDTH data_width;
PIKA_HAL_SPI_SPEED speed;
PIKA_HAL_SPI_TIMEOUT timeout;
} pika_hal_SPI_config;
typedef struct {
PIKA_HAL_SPI_LSB_OR_MSB lsb_or_msb;
PIKA_HAL_SPI_MASTER_OR_SLAVE master_or_slave;
PIKA_HAL_SPI_MODE mode;
PIKA_HAL_SPI_DATA_WIDTH data_width;
PIKA_HAL_SPI_SPEED speed;
PIKA_HAL_SPI_TIMEOUT timeout;
pika_dev* CS;
pika_dev* SCK;
pika_dev* MOSI;
pika_dev* MISO;
} pika_hal_SOFT_SPI_config;
typedef enum {
_PIKA_HAL_ADC_RESOLUTION_UNUSED = 0,
PIKA_HAL_ADC_RESOLUTION_8 = 8,
PIKA_HAL_ADC_RESOLUTION_10 = 10,
PIKA_HAL_ADC_RESOLUTION_12 = 12,
PIKA_HAL_ADC_RESOLUTION_14 = 14,
PIKA_HAL_ADC_RESOLUTION_16 = 16,
} PIKA_HAL_ADC_RESOLUTION;
typedef enum PIKA_HAL_ADC_SAMPLING_FREQ {
_PIKA_HAL_ADC_SAMPLING_FREQ_UNUSED = 0,
PIKA_HAL_ADC_SAMPLING_FREQ_100 = 100,
PIKA_HAL_ADC_SAMPLING_FREQ_1K = 1000,
PIKA_HAL_ADC_SAMPLING_FREQ_10K = 10000,
PIKA_HAL_ADC_SAMPLING_FREQ_100K = 100000,
PIKA_HAL_ADC_SAMPLING_FREQ_1M = 1000000,
PIKA_HAL_ADC_SAMPLING_FREQ_10M = 10000000,
} PIKA_HAL_ADC_SAMPLING_FREQ;
typedef enum PIKA_HAL_ADC_CONTINUOU_OR_SINGLE {
_PIKA_HAL_ADC_CONTINUOU_OR_SINGLE_UNUSED = 0,
PIKA_HAL_ADC_SINGLE,
PIKA_HAL_ADC_CONTINUOU,
} PIKA_HAL_ADC_CONTINUOU_OR_SINGLE;
typedef pika_float PIKA_HAL_ADC_VREF;
typedef uint32_t PIKA_HAL_ADC_MAX;
typedef struct {
PIKA_HAL_ADC_RESOLUTION sampling_resolution;
PIKA_HAL_ADC_SAMPLING_FREQ sampling_freq;
PIKA_HAL_ADC_CONTINUOU_OR_SINGLE continue_or_single;
PIKA_HAL_ADC_MAX max;
PIKA_HAL_ADC_VREF vref;
} pika_hal_ADC_config;
typedef enum {
_PIKA_HAL_DAC_RESOLUTION_UNUSED = 0,
PIKA_HAL_DAC_RESOLUTION_8 = 8,
PIKA_HAL_DAC_RESOLUTION_10 = 10,
PIKA_HAL_DAC_RESOLUTION_12 = 12,
PIKA_HAL_DAC_RESOLUTION_14 = 14,
PIKA_HAL_DAC_RESOLUTION_16 = 16,
} PIKA_HAL_DAC_RESOLUTION;
typedef enum PIKA_HAL_DAC_SPEED {
_PIKA_HAL_DAC_SPEED_UNUSED = 0,
PIKA_HAL_DAC_SPEED_100 = 100,
PIKA_HAL_DAC_SPEED_1K = 1000,
PIKA_HAL_DAC_SPEED_10K = 10000,
PIKA_HAL_DAC_SPEED_100K = 100000,
PIKA_HAL_DAC_SPEED_1M = 1000000,
PIKA_HAL_DAC_SPEED_10M = 10000000,
PIKA_HAL_DAC_SPEED_20M = 20000000,
PIKA_HAL_DAC_SPEED_50M = 50000000,
PIKA_HAL_DAC_SPEED_100M = 100000000,
} PIKA_HAL_DAC_SPEED;
typedef pika_float PIKA_HAL_DAC_VREF;
typedef uint32_t PIKA_HAL_DAC_MAX;
typedef struct pika_hal_DAC_config {
PIKA_HAL_DAC_RESOLUTION sampling_resolution;
PIKA_HAL_DAC_SPEED speed;
PIKA_HAL_DAC_MAX max;
PIKA_HAL_DAC_VREF vref;
} pika_hal_DAC_config;
typedef enum {
_PIKA_HAL_DAC_UNUSED = 0,
PIKA_HAL_PWM_CHANNEL_0,
PIKA_HAL_PWM_CHANNEL_1,
PIKA_HAL_PWM_CHANNEL_2,
PIKA_HAL_PWM_CHANNEL_3,
PIKA_HAL_PWM_CHANNEL_4,
PIKA_HAL_PWM_CHANNEL_5,
PIKA_HAL_PWM_CHANNEL_6,
PIKA_HAL_PWM_CHANNEL_7,
} PIKA_HAL_PWM_CHANNEL;
typedef enum {
PIKA_HAL_PWM_PERIOD_1NS = 1,
PIKA_HAL_PWM_PERIOD_1US = 1000,
PIKA_HAL_PWM_PERIOD_1MS = 1000000,
PIKA_HAL_PWM_PERIOD_1S = 1000000000,
} PIKA_HAL_PWM_PERIOD;
typedef enum {
PIKA_HAL_PWM_DUTY_1NS = 1,
PIKA_HAL_PWM_DUTY_1US = 1000,
PIKA_HAL_PWM_DUTY_1MS = 1000000,
PIKA_HAL_PWM_DUTY_1S = 1000000000,
} PIKA_HAL_PWM_DUTY;
typedef struct {
PIKA_HAL_PWM_PERIOD period;
PIKA_HAL_PWM_DUTY duty;
} pika_hal_PWM_config;
typedef enum {
_PIKA_HAL_WIFI_MODE_UNUSED = 0,
PIKA_HAL_WIFI_MODE_STA,
PIKA_HAL_WIFI_MODE_AP,
} PIKA_HAL_WIFI_MODE;
typedef enum {
_PIKA_HAL_WIFI_STATUS_UNUSED = 0,
PIKA_HAL_WIFI_STATUS_IDLE,
PIKA_HAL_WIFI_STATUS_CONNECTING,
PIKA_HAL_WIFI_STATUS_WRONG_PASSWORD,
PIKA_HAL_WIFI_STATUS_NO_AP_FOUND,
PIKA_HAL_WIFI_STATUS_CONNECT_FAIL,
PIKA_HAL_WIFI_STATUS_GOT_IP,
} PIKA_HAL_WIFI_STATUS;
typedef enum {
_PIKA_HAL_WIFI_CHANNEL_UNUSED = 0,
PIKA_HAL_WIFI_CHANNEL_0,
PIKA_HAL_WIFI_CHANNEL_1,
PIKA_HAL_WIFI_CHANNEL_2,
PIKA_HAL_WIFI_CHANNEL_3,
PIKA_HAL_WIFI_CHANNEL_4,
PIKA_HAL_WIFI_CHANNEL_5,
PIKA_HAL_WIFI_CHANNEL_6,
PIKA_HAL_WIFI_CHANNEL_7,
PIKA_HAL_WIFI_CHANNEL_8,
PIKA_HAL_WIFI_CHANNEL_9,
PIKA_HAL_WIFI_CHANNEL_10,
PIKA_HAL_WIFI_CHANNEL_11,
} PIKA_HAL_WIFI_CHANNEL;
typedef enum {
_PIKA_HAL_WIFI_MAX_CONNECTION = 0,
PIKA_HAL_WIFI_MAX_CONNECTION_1,
PIKA_HAL_WIFI_MAX_CONNECTION_2,
PIKA_HAL_WIFI_MAX_CONNECTION_3,
PIKA_HAL_WIFI_MAX_CONNECTION_4,
PIKA_HAL_WIFI_MAX_CONNECTION_5,
PIKA_HAL_WIFI_MAX_CONNECTION_6,
PIKA_HAL_WIFI_MAX_CONNECTION_7,
PIKA_HAL_WIFI_MAX_CONNECTION_8,
PIKA_HAL_WIFI_MAX_CONNECTION_9,
PIKA_HAL_WIFI_MAX_CONNECTION_10
} PIKA_HAL_WIFI_MAX_CONNECTION;
#define PIKA_HAL_WIFI_PARAM_MAX_LEN 32
typedef struct pika_hal_WIFI_config {
PIKA_HAL_WIFI_MODE mode;
PIKA_HAL_WIFI_CHANNEL channel;
PIKA_HAL_WIFI_MAX_CONNECTION max_connection;
char ap_ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char ap_bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char ap_password[PIKA_HAL_WIFI_PARAM_MAX_LEN];
} pika_hal_WIFI_config;
typedef struct pika_hal_WIFI_connect_config {
char ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char password[PIKA_HAL_WIFI_PARAM_MAX_LEN];
} pika_hal_WIFI_connect_config;
typedef struct pika_hal_WIFI_ifconfig {
char ip[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char netmask[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char gateway[PIKA_HAL_WIFI_PARAM_MAX_LEN];
char dns[PIKA_HAL_WIFI_PARAM_MAX_LEN];
} pika_hal_WIFI_ifconfig;
typedef struct pika_hal_WIFI_record {
char ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
uint8_t bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
size_t bssid_len;
int channel;
int rssi;
int authmode;
} pika_hal_WIFI_record;
typedef struct pika_hal_WIFI_scan_result {
int count;
pika_hal_WIFI_record records[];
} pika_hal_WIFI_scan_result;
typedef struct pika_dev_impl {
int (*open)(pika_dev* dev, char* name);
int (*close)(pika_dev* dev);
int (*read)(pika_dev* dev, void* buf, size_t count);
int (*write)(pika_dev* dev, void* buf, size_t count);
int (*ioctl)(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* cfg);
} pika_dev_impl;
/* platform API */
#define PIKA_HAL_TABLE_PLATFORM_API
#include "pika_hal_table.h"
/* config merge headers */
#define PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG_HEADER
#include "pika_hal_table.h"
#endif

View File

@ -1,276 +0,0 @@
#include "pika_hal.h"
#include <stdint.h>
static void _IIC_SDA_input(pika_hal_SOFT_IIC_config* iic_cfg) {
pika_hal_GPIO_config cfg_SDA = {0};
cfg_SDA.dir = PIKA_HAL_GPIO_DIR_IN;
pika_hal_ioctl(iic_cfg->SDA, PIKA_HAL_IOCTL_CONFIG, &cfg_SDA);
}
static void _IIC_SDA_output(pika_hal_SOFT_IIC_config* iic_cfg) {
pika_hal_GPIO_config cfg_SDA = {0};
cfg_SDA.dir = PIKA_HAL_GPIO_DIR_OUT;
pika_hal_ioctl(iic_cfg->SDA, PIKA_HAL_IOCTL_CONFIG, &cfg_SDA);
}
static int _GPIO_write(pika_dev* dev, uint32_t val) {
return pika_hal_write(dev, &val, sizeof(val));
}
static uint32_t _GPIO_read(pika_dev* dev) {
uint32_t val = 0;
pika_hal_read(dev, &val, sizeof(val));
return val;
}
static void _IIC_Delay(void) {
pika_sleep_ms(3);
}
static void _IIC_Start(pika_hal_SOFT_IIC_config* cfg) {
pika_debug("iic start");
_IIC_SDA_output(cfg);
_GPIO_write(cfg->SDA, 1);
_GPIO_write(cfg->SCL, 1);
_IIC_Delay();
_GPIO_write(cfg->SDA, 0);
_IIC_Delay();
_GPIO_write(cfg->SCL, 0);
}
static void _IIC_Stop(pika_hal_SOFT_IIC_config* cfg) {
pika_debug("iic stop");
_IIC_SDA_output(cfg);
_GPIO_write(cfg->SDA, 0);
_GPIO_write(cfg->SCL, 1);
_IIC_Delay();
_GPIO_write(cfg->SDA, 1);
_IIC_Delay();
}
static pika_bool _IIC_SendByte(pika_hal_SOFT_IIC_config* cfg, uint8_t byte) {
pika_debug(" - iic write: 0x%02X", byte);
_IIC_SDA_output(cfg);
for (int i = 0; i < 8; i++) {
_GPIO_write(cfg->SCL, 0);
_IIC_Delay();
if (byte & 0x80) {
_GPIO_write(cfg->SDA, 1);
} else {
_GPIO_write(cfg->SDA, 0);
}
_IIC_Delay();
_GPIO_write(cfg->SCL, 1);
_IIC_Delay();
byte <<= 1;
}
// 在发送完字节后检查ACK信号
_GPIO_write(cfg->SCL, 0);
_IIC_Delay();
_IIC_SDA_input(cfg); // 设置SDA为输入
_GPIO_write(cfg->SCL, 1); // 将SCL线设置为高让从设备发送ACK信号
int timeout = 1000;
uint32_t ack = 0;
do {
_IIC_Delay();
ack = !_GPIO_read(cfg->SDA); // 如果从设备发送了ACK信号SDA线会被拉低
} while (ack == 0 && timeout-- > 0);
// pika_debug("ack timeout:%d", timeout);
if (timeout <= 0) {
pika_platform_printf("Error: IIC write byte timeout\r\n");
}
_GPIO_write(cfg->SCL, 0); // 将SCL线设置为低完成一个I2C周期
return ack;
}
static void _IIC_Ack(pika_hal_SOFT_IIC_config* cfg) {
_GPIO_write(cfg->SCL, 0); // 拉低时钟线
_IIC_SDA_output(cfg); // 设置SDA为输出
_GPIO_write(cfg->SDA, 0); // 拉低数据线
_IIC_Delay();
_GPIO_write(cfg->SCL, 1); // 产生时钟
_IIC_Delay();
_GPIO_write(cfg->SCL, 0); // 拉低时钟线
}
static void _IIC_NAck(pika_hal_SOFT_IIC_config* cfg) {
_GPIO_write(cfg->SCL, 0); // 拉低时钟线
_IIC_SDA_output(cfg); // 设置SDA为输出
_GPIO_write(cfg->SDA, 1); // 数据线拉高
_IIC_Delay();
_GPIO_write(cfg->SCL, 1); // 产生时钟
_IIC_Delay();
_GPIO_write(cfg->SCL, 0); // 拉低时钟线
}
static uint8_t _IIC_ReadByte(pika_hal_SOFT_IIC_config* cfg, uint8_t ack) {
uint8_t byte = 0;
_IIC_SDA_input(cfg);
for (int i = 0; i < 8; i++) {
_GPIO_write(cfg->SCL, 1);
_IIC_Delay();
byte <<= 1;
if (_GPIO_read(cfg->SDA)) {
byte |= 0x01;
}
_GPIO_write(cfg->SCL, 0);
_IIC_Delay();
}
// 在读取完一个字节后发送ACK信号
if (ack) {
_IIC_Ack(cfg); // 如果ack为真发送ACK信号
} else {
_IIC_NAck(cfg); // 如果ack为假发送NACK信号
}
pika_debug(" - iic read: 0x%02X", byte);
return byte;
}
int pika_hal_platform_SOFT_IIC_write(pika_dev* dev, void* buf, size_t count) {
pika_hal_SOFT_IIC_config* iic_cfg =
(pika_hal_SOFT_IIC_config*)dev->ioctl_config;
uint8_t* data = (uint8_t*)buf;
_IIC_Start(iic_cfg);
uint8_t addr_write = (iic_cfg->slave_addr << 1) | 0x00; // 方向位为0代表写
// pika_debug("iic addr_write: 0x%02X", addr_write);
_IIC_SendByte(iic_cfg, addr_write); // 方向位为0代表写
// 如果启用了mem_addr_ena将设备地址和内存地址发送到I2C总线
if (iic_cfg->mem_addr_ena == PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE) {
if (iic_cfg->mem_addr_size == PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT) {
_IIC_SendByte(iic_cfg, iic_cfg->mem_addr & 0xFF);
} else if (iic_cfg->mem_addr_size == PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT) {
_IIC_SendByte(iic_cfg, (iic_cfg->mem_addr >> 8) & 0xFF);
_IIC_SendByte(iic_cfg, iic_cfg->mem_addr & 0xFF);
}
}
for (int i = 0; i < count; i++) {
_IIC_SendByte(iic_cfg, data[i]);
}
_IIC_Stop(iic_cfg);
return count;
}
int pika_hal_platform_SOFT_IIC_read(pika_dev* dev, void* buf, size_t count) {
pika_hal_SOFT_IIC_config* iic_cfg =
(pika_hal_SOFT_IIC_config*)dev->ioctl_config;
uint8_t* data = (uint8_t*)buf;
_IIC_Start(iic_cfg);
// 如果启用了mem_addr_ena先写设备地址和内存地址
if (iic_cfg->mem_addr_ena == PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE) {
uint8_t addr_write =
(iic_cfg->slave_addr << 1) | 0x00; // 方向位为0代表写
// pika_debug("iic addr_write: 0x%02X", addr_write);
_IIC_SendByte(iic_cfg, addr_write); // 方向位为0代表写
if (iic_cfg->mem_addr_size == PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT) {
_IIC_SendByte(iic_cfg, iic_cfg->mem_addr & 0xFF);
} else if (iic_cfg->mem_addr_size == PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT) {
_IIC_SendByte(iic_cfg, (iic_cfg->mem_addr >> 8) & 0xFF);
_IIC_SendByte(iic_cfg, iic_cfg->mem_addr & 0xFF);
}
_IIC_Start(iic_cfg);
}
uint8_t addr_read = (iic_cfg->slave_addr << 1) | 0x01; // 方向位为1代表读
// pika_debug("iic addr_read: 0x%02X", addr_read);
_IIC_SendByte(iic_cfg, addr_read); // 方向位为1代表读
for (int i = 0; i < count - 1; i++) {
// data[i] = _IIC_ReadByte(iic_cfg, 1);
data[i] = _IIC_ReadByte(iic_cfg, 1);
}
data[count - 1] = _IIC_ReadByte(iic_cfg, 0);
_IIC_Stop(iic_cfg);
return count;
}
int pika_hal_platform_SOFT_IIC_open(pika_dev* dev, char* name) {
return 0;
}
int pika_hal_platform_SOFT_IIC_close(pika_dev* dev) {
pika_hal_SOFT_IIC_config* cfg =
(pika_hal_SOFT_IIC_config*)dev->ioctl_config;
if (cfg->SDA != NULL) {
pika_hal_close(cfg->SDA);
}
if (cfg->SCL != NULL) {
pika_hal_close(cfg->SCL);
}
return 0;
}
int pika_hal_platform_SOFT_IIC_ioctl_config(pika_dev* dev,
pika_hal_SOFT_IIC_config* cfg) {
if (cfg->SDA == NULL || cfg->SCL == NULL) {
__platform_printf(
"Error: SOFT IIC config error, SDA and SCL must be set\r\n");
return -1;
}
// 检查软件IIC配置项是否正确
if (cfg->master_or_slave != PIKA_HAL_IIC_MASTER &&
cfg->master_or_slave != PIKA_HAL_IIC_SLAVE) {
__platform_printf(
"Error: SOFT IIC config error, master_or_slave must be set\r\n");
return -1;
}
if (cfg->address_width != PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT &&
cfg->address_width != PIKA_HAL_IIC_ADDRESS_WIDTH_10BIT) {
__platform_printf(
"Error: SOFT IIC config error, address_width must be set\r\n");
return -1;
}
if (cfg->mem_addr_ena != PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE &&
cfg->mem_addr_ena != PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE) {
__platform_printf(
"Error: SOFT IIC config error, mem_addr_ena must be set\r\n");
return -1;
}
if (cfg->mem_addr_size != PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT &&
cfg->mem_addr_size != PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT) {
__platform_printf(
"Error: SOFT IIC config error, mem_addr_size must be set\r\n");
return -1;
}
// 在这里我们暂时不检查speed和timeout因为软件模拟的I2C可能无法精确控制速度和超时。
return 0;
}
int pika_hal_platform_SOFT_IIC_ioctl_enable(pika_dev* dev) {
pika_hal_SOFT_IIC_config* cfg =
(pika_hal_SOFT_IIC_config*)dev->ioctl_config;
if (cfg->SDA == NULL || cfg->SCL == NULL) {
__platform_printf(
"Error: SOFT IIC config error, SDA and SCL must be set\r\n");
return -1;
}
pika_hal_GPIO_config cfg_SDA = {0};
pika_hal_GPIO_config cfg_SCL = {0};
cfg_SDA.dir = PIKA_HAL_GPIO_DIR_OUT;
cfg_SCL.dir = PIKA_HAL_GPIO_DIR_OUT;
pika_hal_ioctl(cfg->SDA, PIKA_HAL_IOCTL_CONFIG, &cfg_SDA);
pika_hal_ioctl(cfg->SCL, PIKA_HAL_IOCTL_CONFIG, &cfg_SCL);
pika_hal_ioctl(cfg->SDA, PIKA_HAL_IOCTL_ENABLE);
pika_hal_ioctl(cfg->SCL, PIKA_HAL_IOCTL_ENABLE);
_GPIO_write(cfg->SDA, 1);
_GPIO_write(cfg->SCL, 1);
return 0;
}
int pika_hal_platform_SOFT_IIC_ioctl_disable(pika_dev* dev) {
pika_hal_SOFT_IIC_config* cfg =
(pika_hal_SOFT_IIC_config*)dev->ioctl_config;
pika_hal_ioctl(cfg->SDA, PIKA_HAL_IOCTL_DISABLE);
pika_hal_ioctl(cfg->SCL, PIKA_HAL_IOCTL_DISABLE);
return 0;
}

View File

@ -1,155 +0,0 @@
#include "pika_hal.h"
static int _GPIO_write(pika_dev* dev, uint32_t val) {
return pika_hal_write(dev, &val, sizeof(val));
}
static uint32_t _GPIO_read(pika_dev* dev) {
uint32_t val = 0;
pika_hal_read(dev, &val, sizeof(val));
return val;
}
int pika_hal_platform_SOFT_SPI_open(pika_dev* dev, char* name) {
return 0;
}
int pika_hal_platform_SOFT_SPI_close(pika_dev* dev) {
pika_hal_SOFT_SPI_config* cfg =
(pika_hal_SOFT_SPI_config*)dev->ioctl_config;
if (cfg->CS != NULL) {
pika_hal_close(cfg->CS);
}
if (cfg->SCK != NULL) {
pika_hal_close(cfg->SCK);
}
if (cfg->MOSI != NULL) {
pika_hal_close(cfg->MOSI);
}
if (cfg->MISO != NULL) {
pika_hal_close(cfg->MISO);
}
return 0;
}
int pika_hal_platform_SOFT_SPI_ioctl_config(pika_dev* dev,
pika_hal_SOFT_SPI_config* cfg) {
if (cfg->SCK == NULL || cfg->MOSI == NULL) {
__platform_printf(
"Error: SOFT SPI config error, CS, SCK, MOSI, MISO must be "
"set\r\n");
return -1;
}
return 0;
}
int pika_hal_platform_SOFT_SPI_ioctl_enable(pika_dev* dev) {
pika_hal_SOFT_SPI_config* cfg =
(pika_hal_SOFT_SPI_config*)dev->ioctl_config;
if (cfg->SCK == NULL || cfg->MOSI == NULL) {
__platform_printf(
"Error: SOFT SPI config error, CS, SCK, MOSI, MISO must be "
"set\r\n");
return -1;
}
pika_hal_GPIO_config cfg_CS = {0};
pika_hal_GPIO_config cfg_SCK = {0};
pika_hal_GPIO_config cfg_MOSI = {0};
pika_hal_GPIO_config cfg_MISO = {0};
cfg_CS.dir = PIKA_HAL_GPIO_DIR_OUT;
cfg_SCK.dir = PIKA_HAL_GPIO_DIR_OUT;
cfg_MOSI.dir = PIKA_HAL_GPIO_DIR_OUT;
cfg_MISO.dir = PIKA_HAL_GPIO_DIR_IN;
if (NULL != cfg->CS) {
pika_hal_ioctl(cfg->CS, PIKA_HAL_IOCTL_CONFIG, &cfg_CS);
}
pika_hal_ioctl(cfg->SCK, PIKA_HAL_IOCTL_CONFIG, &cfg_SCK);
pika_hal_ioctl(cfg->MOSI, PIKA_HAL_IOCTL_CONFIG, &cfg_MOSI);
if (NULL != cfg->MISO) {
pika_hal_ioctl(cfg->MISO, PIKA_HAL_IOCTL_CONFIG, &cfg_MISO);
}
if (NULL != cfg->CS) {
pika_hal_ioctl(cfg->CS, PIKA_HAL_IOCTL_ENABLE);
}
pika_hal_ioctl(cfg->SCK, PIKA_HAL_IOCTL_ENABLE);
pika_hal_ioctl(cfg->MOSI, PIKA_HAL_IOCTL_ENABLE);
if (NULL != cfg->MISO) {
pika_hal_ioctl(cfg->MISO, PIKA_HAL_IOCTL_ENABLE);
}
if (NULL != cfg->CS) {
_GPIO_write(cfg->CS, 1);
}
_GPIO_write(cfg->SCK, 1);
_GPIO_write(cfg->MOSI, 1);
return 0;
}
int pika_hal_platform_SOFT_SPI_ioctl_disable(pika_dev* dev) {
pika_hal_SOFT_SPI_config* cfg =
(pika_hal_SOFT_SPI_config*)dev->ioctl_config;
if (NULL != cfg->CS) {
pika_hal_ioctl(cfg->CS, PIKA_HAL_IOCTL_DISABLE);
}
pika_hal_ioctl(cfg->SCK, PIKA_HAL_IOCTL_DISABLE);
pika_hal_ioctl(cfg->MOSI, PIKA_HAL_IOCTL_DISABLE);
if (NULL != cfg->MISO) {
pika_hal_ioctl(cfg->MISO, PIKA_HAL_IOCTL_DISABLE);
}
return 0;
}
static inline int SPIv_WriteData(pika_hal_SOFT_SPI_config* cfg, uint8_t Data) {
unsigned char i = 0;
for (i = 8; i > 0; i--) {
if (Data & 0x80)
_GPIO_write(cfg->MOSI, 1);
else
_GPIO_write(cfg->MOSI, 0);
_GPIO_write(cfg->SCK, 0);
_GPIO_write(cfg->SCK, 1);
Data <<= 1;
}
return 0;
}
int pika_hal_platform_SOFT_SPI_write(pika_dev* dev, void* buf, size_t count) {
pika_hal_SOFT_SPI_config* cfg =
(pika_hal_SOFT_SPI_config*)dev->ioctl_config;
uint8_t* data = (uint8_t*)buf;
if (NULL != cfg->CS) {
_GPIO_write(cfg->CS, 0);
}
for (int i = 0; i < count; i++) {
SPIv_WriteData(cfg, data[i]);
}
if (NULL != cfg->CS) {
_GPIO_write(cfg->CS, 1);
}
return count;
}
int pika_hal_platform_SOFT_SPI_read(pika_dev* dev, void* buf, size_t count) {
pika_hal_SOFT_SPI_config* cfg =
(pika_hal_SOFT_SPI_config*)dev->ioctl_config;
if (NULL == cfg->MISO) {
__platform_printf("Error: SOFT SPI config error, MISO must be set\r\n");
return -1;
}
uint8_t* data = (uint8_t*)buf;
if (NULL != cfg->CS) {
_GPIO_write(cfg->CS, 0);
}
for (int i = 0; i < count; i++) {
data[i] = 0;
for (int j = 0; j < 8; j++) {
_GPIO_write(cfg->SCK, 0);
_GPIO_write(cfg->SCK, 1);
data[i] |= (_GPIO_read(cfg->MISO) << (7 - j));
}
}
_GPIO_write(cfg->CS, 1);
return count;
}

View File

@ -1,15 +0,0 @@
#include "pika_hal_table_rule.h"
/* clang-format off */
pika_hal_table_add(GPIO)
pika_hal_table_add(UART)
pika_hal_table_add(IIC)
pika_hal_table_add(SPI)
pika_hal_table_add(ADC)
pika_hal_table_add(DAC)
pika_hal_table_add(PWM)
pika_hal_table_add(SOFT_SPI)
pika_hal_table_add(SOFT_IIC)
pika_hal_table_add(WIFI)

View File

@ -1,121 +0,0 @@
#undef pika_hal_table_add
#if defined(PIKA_HAL_TABLE_FILE_API)
#define pika_hal_table_add(dev_name) \
PIKA_WEAK int pika_hal_platform_##dev_name##_open(pika_dev* dev, \
char* name) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_close(pika_dev* dev) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_read(pika_dev* dev, \
void* buf, size_t len) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_write( \
pika_dev* dev, void* buf, size_t len) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_ioctl_enable(pika_dev* dev) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_ioctl_disable( \
pika_dev* dev) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_ioctl_config( \
pika_dev* dev, pika_hal_##dev_name##_config* cfg) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
PIKA_WEAK int pika_hal_platform_##dev_name##_ioctl_others( \
pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* arg) { \
WEAK_FUNCTION_NEED_OVERRIDE_ERROR() \
return -1; \
} \
int pika_hal_##dev_name##_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, \
void* arg) { \
if (NULL == dev) { \
return -1; \
} \
switch (cmd) { \
case PIKA_HAL_IOCTL_ENABLE: \
return pika_hal_platform_##dev_name##_ioctl_enable(dev); \
case PIKA_HAL_IOCTL_DISABLE: \
return pika_hal_platform_##dev_name##_ioctl_disable(dev); \
case PIKA_HAL_IOCTL_CONFIG: \
return pika_hal_platform_##dev_name##_ioctl_config( \
dev, (pika_hal_##dev_name##_config*)arg); \
default: \
return pika_hal_platform_##dev_name##_ioctl_others(dev, cmd, \
arg); \
} \
}
#endif
#if defined(PIKA_HAL_TABLE_DEV_TYPE)
#define pika_hal_table_add(dev_name) PIKA_HAL_##dev_name,
#endif
#if defined(PIKA_HAL_TABLE_IMPL)
#define pika_hal_table_add(dev_name) \
[PIKA_HAL_##dev_name] = { \
.open = pika_hal_platform_##dev_name##_open, \
.close = pika_hal_platform_##dev_name##_close, \
.read = pika_hal_platform_##dev_name##_read, \
.write = pika_hal_platform_##dev_name##_write, \
.ioctl = pika_hal_##dev_name##_ioctl, \
},
#endif
#if defined(PIKA_HAL_TABLE_PLATFORM_API)
#define pika_hal_table_add(dev_name) \
int pika_hal_platform_##dev_name##_open(pika_dev* dev, char* name); \
int pika_hal_platform_##dev_name##_close(pika_dev* dev); \
int pika_hal_platform_##dev_name##_read(pika_dev* dev, void* buf, \
size_t len); \
int pika_hal_platform_##dev_name##_write(pika_dev* dev, void* buf, \
size_t len); \
int pika_hal_platform_##dev_name##_ioctl_enable(pika_dev* dev); \
int pika_hal_platform_##dev_name##_ioctl_disable(pika_dev* dev); \
int pika_hal_platform_##dev_name##_ioctl_config( \
pika_dev* dev, pika_hal_##dev_name##_config* cfg); \
int pika_hal_platform_##dev_name##_ioctl_others( \
pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* arg);
#endif
#if defined(PIKA_HAL_TABLE_DEV_CONFIG_SIZE)
#define pika_hal_table_add(dev_name) \
if (dev_type == PIKA_HAL_##dev_name) { \
return sizeof(pika_hal_##dev_name##_config); \
}
#endif
#if defined(PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG)
#define pika_hal_table_add(dev_name) \
if (dev->type == PIKA_HAL_##dev_name) { \
return pika_hal_##dev_name##_ioctl_merge_config(dev->ioctl_config, \
config_in); \
}
#endif
#if defined(PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG_HEADER)
#define pika_hal_table_add(dev_name) \
int pika_hal_##dev_name##_ioctl_merge_config( \
pika_hal_##dev_name##_config* dst, pika_hal_##dev_name##_config* src);
#endif
#undef PIKA_HAL_TABLE_FILE_API
#undef PIKA_HAL_TABLE_DEV_TYPE
#undef PIKA_HAL_TABLE_IMPL
#undef PIKA_HAL_TABLE_PLATFORM_API
#undef PIKA_HAL_TABLE_DEV_CONFIG_SIZE
#undef PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG
#undef PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG_HEADER