mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-02-05 17:28:23 +08:00
测试commit
This commit is contained in:
parent
eb9a4c7494
commit
d4cb80ee03
21
package/PikaStdDevice/LICENSE
Normal file
21
package/PikaStdDevice/LICENSE
Normal 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.
|
@ -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): ...
|
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
@ -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();
|
||||
}
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
@ -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);
|
||||
}
|
@ -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();
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
@ -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
|
30
package/PikaStdDevice/README.md
Normal file
30
package/PikaStdDevice/README.md
Normal file
@ -0,0 +1,30 @@
|
||||
# PHP
|
||||
|
||||
嵌入式Python速成班,基于PikaPython,简称为PHP(PikaPython 黄埔)
|
||||
|
||||
## 第一期
|
||||
|
||||
- [开班公告(报名截止至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
|
||||
- 4G:FS800
|
||||
- rs485
|
||||
- 蜂鸣器
|
||||
- nand FLASH
|
||||
- 继电器
|
||||
- 12V供电
|
||||
- 温度传感器
|
||||
- 光敏电阻
|
||||
|
||||
![9bd0a46068c3f96db0ad85e40709d6d](assets/9bd0a46068c3f96db0ad85e40709d6d.png)
|
||||
|
||||
LCD拓展板:
|
||||
|
||||
- 240*320 LCD屏
|
||||
- 按键*4
|
||||
|
||||
![3769ab4d3c57bd9d48ca4e07b48603a](assets/3769ab4d3c57bd9d48ca4e07b48603a.png)
|
@ -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;
|
||||
}
|
@ -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
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
@ -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)
|
||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user