# babyos驱动编写说明 目前BabyOS里的驱动还需要所有开发者一起补充。在此说明添加驱动的步骤,协助开发者以及BabyOS用户添加驱动。 首先同步几个词的意思: ![driver_word](../_static/driver_word.jpg) 以下描述,增加名为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 文档](https://babyos.cn/doc/code/附_驱动c文件模板.html) h文件:[驱动h文件模板 — BabyOS V0.3.2 文档](https://babyos.cn/doc/code/附_驱动h文件模板.html) 将XXXX和xxxx替换为真实驱动名的大写和小写 ## 2. 基于模板修改 2.1. 如果驱动不需要私有数据,则去掉如下内容: ```C // h文件 typedef struct { ; } bXXXXPrivate_t; // c文件 与bXXXXPrivate_t相关的内容去掉 ``` 2.2. 模板将open/close/open/read/wirte均实现,可根据实际情况进行删减。 2.3. 根据实际硬件接口修改数据结构,硬件接口的命名规则:*bXXXX_HalIf_t* ```C typedef bHalI2CIf_t bXXXX_HalIf_t; // 根据实际情况修改 ``` 2.4. 模板中宏的介绍 ```C //定义硬件接口的数组 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](../_static/branch_m.jpg) 欢迎一起投喂BabyOS,为其新增驱动代码。如遇到问题可随时沟通! 也希望开发者将调试的驱动推送到仓库与大家共享。