babyos驱动编写说明

目前BabyOS里的驱动还需要所有开发者一起补充。在此说明添加驱动的步骤,协助开发者以及BabyOS用户添加驱动。

首先同步几个词的意思:

driver_word

以下描述,增加名为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分支。

branch_m

欢迎一起投喂BabyOS,为其新增驱动代码。如遇到问题可随时沟通!

也希望开发者将调试的驱动推送到仓库与大家共享。