添加 *io
对其他端口的支持¶
digitalio
提供定义良好的跨端口硬件抽象层,用于支持不同的设备及其驱动程序。它由 Common HAL 支持,这是一个 C api,适用于以类似的方式支持不同的硬件。通过共享此 C api,开发人员可以轻松支持新硬件并将功能跨端口到新硬件。
这些说明同样适用于analogio
, busio
, pulseio
和 touchio
。多数司机依靠analogio
, digitalio
并 busio
因此与那些开始。
文件布局¶
常见的 HAL 相关文件位于以下位置:
shared-bindings
Python <-> C 绑定的共享主页,其中包括已创建接口的内联 RST 文档。常用的 hal 函数定义在相应 C 文件的 .h 文件中。shared-module
建立在通用 HAL 上并由所有端口使用的 C 代码的共享主目录。此代码仅使用中common_hal
定义的方法shared-bindings
。<port>/common-hal
通用 HAL 的特定于端口的实现。
每个文件夹的子结构为 /他们应该匹配 1:1。__init__.c
用于不是类的模块全局变量(类似于 __init__.py
)。
添加支持¶
修改构建¶
第一步是将shared-bindings
您希望支持的模块的构建挂钩。以下是此步骤的示例atmel-samd/Makefile
:
SRC_BINDINGS = \
board/__init__.c \
microcontroller/__init__.c \
microcontroller/Pin.c \
analogio/__init__.c \
analogio/AnalogIn.c \
analogio/AnalogOut.c \
digitalio/__init__.c \
digitalio/DigitalInOut.c \
pulseio/__init__.c \
pulseio/PulseIn.c \
pulseio/PulseOut.c \
pulseio/PWMOut.c \
busio/__init__.c \
busio/I2C.c \
busio/SPI.c \
busio/UART.c \
neopixel_write/__init__.c \
time/__init__.c \
usb_hid/__init__.c \
usb_hid/Device.c
SRC_BINDINGS_EXPANDED = $(addprefix shared-bindings/, $(SRC_BINDINGS)) \
$(addprefix common-hal/, $(SRC_BINDINGS))
# Add the resulting objects to the full list
OBJ += $(addprefix $(BUILD)/, $(SRC_BINDINGS_EXPANDED:.c=.o))
# Add the sources for QSTR generation
SRC_QSTR += $(SRC_C) $(SRC_BINDINGS_EXPANDED) $(STM_SRC_C)
该 Makefile
定义模块生成并添加源包括shared-bindings
版本和 common-hal
该端口特定目录内的版本。您可以注释掉某些子文件夹以减少要添加的模块数量,但不要注释掉单个类。那就不会编译了。
挂接模块¶
内置模块通常在mpconfigport.h
. 要添加支持,您应该具有以下内容:
extern const struct _mp_obj_module_t microcontroller_module;
extern const struct _mp_obj_module_t analogio_module;
extern const struct _mp_obj_module_t digitalio_module;
extern const struct _mp_obj_module_t pulseio_module;
extern const struct _mp_obj_module_t busio_module;
extern const struct _mp_obj_module_t board_module;
extern const struct _mp_obj_module_t time_module;
extern const struct _mp_obj_module_t neopixel_write_module;
#define MICROPY_PORT_BUILTIN_MODULES \
{ MP_OBJ_NEW_QSTR(MP_QSTR_microcontroller), (mp_obj_t)µcontroller_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_analogio), (mp_obj_t)&analogio_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_digitalio), (mp_obj_t)&digitalio_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_pulseio), (mp_obj_t)&pulseio_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_busio), (mp_obj_t)&busio_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_board), (mp_obj_t)&board_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_time), (mp_obj_t)&time_module }, \
{ MP_OBJ_NEW_QSTR(MP_QSTR_neopixel_write),(mp_obj_t)&neopixel_write_module } \
实现通用 HAL¶
在移植的这一点上,还没有任何东西可以编译,因为还有工作要做来修复丢失的源、编译问题和链接问题。我建议从另一个实现它的端口的 common-hal 目录开始,例如atmel-samd
或 esp8266
,删除函数内容并删除任何 return 语句。完成后,您应该能够干净地编译并导入模块,但没有任何效果(尽管您越来越近了)。
最后一步实际上是以特定于端口的方式实现每个功能。这个我帮不了你。:-) 如果您对 Common HAL 函数的工作方式有任何疑问,请查看 .h 文件中的相应 .h 文件shared-bindings
.
测试¶
呜呼!你快完成了。实现所有内容后,许多驱动程序和示例代码应该可以正常工作。有许多为 Adafruit 的 Feather 生态系统编写的驱动程序和示例。以下是开始的地方: