添加 *io对其他端口的支持

digitalio 提供定义良好的跨端口硬件抽象层,用于支持不同的设备及其驱动程序。它由 Common HAL 支持,这是一个 C api,适用于以类似的方式支持不同的硬件。通过共享此 C api,开发人员可以轻松支持新硬件并将功能跨端口到新硬件。

这些说明同样适用于analogio, busio, pulseiotouchio。多数司机依靠analogio, digitaliobusio因此与那些开始。

文件布局

常见的 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)&microcontroller_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-samdesp8266,删除函数内容并删除任何 return 语句。完成后,您应该能够干净地编译并导入模块,但没有任何效果(尽管您越来越近了)。

最后一步实际上是以特定于端口的方式实现每个功能。这个我帮不了你。:-) 如果您对 Common HAL 函数的工作方式有任何疑问,请查看 .h 文件中的相应 .h 文件shared-bindings.

测试

呜呼!你快完成了。实现所有内容后,许多驱动程序和示例代码应该可以正常工作。有许多为 Adafruit 的 Feather 生态系统编写的驱动程序和示例。以下是开始的地方: