babyos驱动编写说明
目前BabyOS里的驱动还需要所有开发者一起补充。在此说明添加驱动的步骤,协助开发者以及BabyOS用户添加驱动。
首先同步几个词的意思:
以下描述,增加名为XXXX的驱动, 硬件接口是I2C
1. 创建源文件
驱动文件的命名规则:b_drv_xxxx
创建 bos/drivers/b_drv_xxxx.c bos/drivers/inc/b_drv_xxxx.h
将模板代码复制进源文件:
c文件:驱动c文件模板 ‒ BabyOS V0.3.2 文档
h文件:驱动h文件模板 — BabyOS V0.3.2 文档
将XXXX和xxxx替换为真实驱动名的大写和小写
2. 基于模板修改
2.1. 如果驱动不需要私有数据,则去掉如下内容:
// h文件
typedef struct
{
;
} bXXXXPrivate_t;
// c文件
与bXXXXPrivate_t相关的内容去掉
2.2. 模板将open/close/open/read/wirte均实现,可根据实际情况进行删减。
2.3. 根据实际硬件接口修改数据结构,硬件接口的命名规则:bXXXX_HalIf_t
typedef bHalI2CIf_t bXXXX_HalIf_t; // 根据实际情况修改
2.4. 模板中宏的介绍
//定义硬件接口的数组
bDRIVER_HALIF_TABLE(bXXXX_HalIf_t, DRIVER_NAME);
// 定义私有数据数组
static bXXXXPrivate_t bXXXXRunInfo[bDRIVER_HALIF_NUM(bXXXX_HalIf_t, DRIVER_NAME)];
// 从驱动中获取硬件接口
bDRIVER_GET_HALIF(_if, bXXXX_HalIf_t, pdrv);
// 从驱动中获取私有数据
bDRIVER_GET_PRIVATE(_priv, bXXXXPrivate_t, pdrv);
// 初始化pdrv里的数据
bDRIVER_STRUCT_INIT(pdrv, DRIVER_NAME, bXXXX_Init);
// 将私有数据赋值给pdrv里的指针
// pdrv->drv_no 在执行bInit()时已经赋值
pdrv->_private._p = &bXXXXRunInfo[pdrv->drv_no];
// 将驱动初始化信息放入代码段中
bDRIVER_REG_INIT(B_DRIVER_XXXX, bXXXX_Init);
3. 增加驱动信息
3.1. bos/drivers/inc/b_driver.h 中bDriverNumber_t 里添加 B_DRIVER_XXXX
3.2. b_os.h 里添加头文件 #include “drivers/inc/b_drv_xxxx.h”
3.3. _config/b_hal_if.h 增加硬件接口的定义
宏的命名规则:HAL_XXXX_IF
#define HAL_XXXX_IF {第1个XXXX设备的硬件接口},{第2个XXXX设备的硬件接口},{第3个XXXX设备的硬件接口}
4. 实现驱动代码
4.1. 驱动里面操作硬件的接口来自于HAL层,如果设备的硬件接口HAL层没有,则扩展HAL层
4.2. 如果有控制设备的需要调用bCtl最终执行的是_bXXXXCtl。这个接口涉及命令和参数,其具体内容在bos/drivers/inc/b_driver_cmd.h 里定义。便于使用者在这里查找支持的命令以及对应的参数。
4.3. _bXXXXRead和_bXXXXWrite的返回值需要注意,是返回实际读到和写入的字节数。
5. 验证驱动
5.1. 注册设备,在_config/b_device_list.h 里注册设备。
5.2. 编写例子测试程序验证实现的接口。
5.3. 调试完成后bos内容推送至babyos仓库,例子推送到example仓库。
当前的分支管理策略如下,开发者新增功能时新建分支,开发完成后由管理员合入dev以及后续的master分支。
欢迎一起投喂BabyOS,为其新增驱动代码。如遇到问题可随时沟通!
也希望开发者将调试的驱动推送到仓库与大家共享。