zephyr添加驱动到设备树及遇到的一些问题

  1. 基础架构支持
    a. 添加特定于体系结构的DTS目录(如果尚未存在)。示例:ARM的 dts/arm/soc系列(已存在)
    b. 为基础SoC添加目标特定设备树文件。这些应该是.dtsi文件,以包含在特定于板的设备树文件中, 路径是/dts/arm/st/stm32l4.dtsi(SOC的基本节点);/dts/arm/st/stm32l4xxx.dtsi(注:具体soc的外设的节点,要包含基本设备树文件,一般添加基本系列SOC的设备树文件中不包含的节点和flash、sdram的分区,下面有讲)
    c. 在dts / bindings /目录中添加目标特定的YAML绑定文件。如果不存在,则创建yaml目录,一般需要添加SOC支持和外设支持,目录在/dts/bindings/xx_soc和/dts/bindings/外设.yaml

  2. 对SOC系列支持
    a. 添加一个或多个SoC系列.dtsi文件,用于描述一组设备的硬件。该文件应包含适用于使用该SoC系列的所有电路板的所有相关节点和基本配置
    b. 添加SOC系列的描述.dtsi文件中存在的节点的YAML绑定文件如下

	supported:
  - nvs
  - pwm
  - can
  - counter
  - spi
  - uart

c. 添加soc的默认配置文件,默认配置文件中的配置内容是1->b中添加的外设节点,可以不用全部添加。路径是:/soc /arm /st-stm32 /stm32l4 /Kconfig.defconfig.stm32l4xxx

  1. 对BOARD支持
    a. 添加包含SoC系列.dtsi文件的板级.dts文件,并启用该特定板所需的节点
    b. Board .dts文件应指定SRAM和FLASH设备(如果存在),目录在/dts/arm/ti/
    注意:Flash设备节点可能指定闪存分区。有关更多详细信息,请参阅 Flash分区
    c. 如果需要,添加特定于板的YAML绑定文件,文件一般目录在 /board/arm/msp432_exp432p401r_launchxl。如果电路板具有SoC系列.dtsi / .yaml文件未涵盖的其他硬件,则会发生这种情况。

  2. 对板载外设的支持
    在第三步中一般会部署板子的SDRAM和Flash分区、芯片外设的入口地址及配置选项,这些是第4步的基础。在编写好驱动文件后需要配置Kconfig.xxx(xxx是芯片架构的名字)、当前驱动总配置文件Kcongfig(供上层配置调用)

遇到的问题

  1. FATAL ERROR: Unable to parse input tree
    解决方法:一般情况是dts文件中{}对没有对齐,我的情况是在/{ … }里添加如下,注意先后顺序
   leds {
    		compatible = "gpio-leds";
    		led0:led0{
    			gpios = <&gpioa 1 0>;
    			label = "RED_LED";
    		};
    	};

	aliases {
		led0 = &led0;
		uart-0 = &uart0;
	}; 
	参考https://blog.csdn.net/renlonggg/article/details/53784509
  1. device tree error: ‘#gpio-cells’ is marked as required in’properties:’ in /home/xxh/Desktop/zephyr_pro/zephyr/dts/bindings/gpio/ti,msp432p4xx.yaml, but does not appear in
    CMake Error at /home/xxh/Desktop/zephyr_pro/zephyr/cmake/dts.cmake:176 (message): new extractor failed with return code: 1

意思是我在ti,msp432p4xx.yaml中定义了gpio-cells但是在节点定义我没有声明。
解决办法:

gpio-controller;
#gpio-cells = <2>;

gpio-controller的具体定义格式在文件/dts/bindings/gpio/gpio-controller.yaml

3.No SOURCES given to target: drivers__gpio
问题原因:没有添加相应驱动的库文件
解决办法:在/drivers/相应的文件/CmakeLists.txt文件中添加驱动文件
例如此例:/drivers/gpio/CmakeLists.txt最下面添加

zephyr_library_sources_ifdef(CONFIG_GPIO_MSP432P4XX     gpio_msp432p4xx.c)

4.fatal error: ti/devices/msp432p4xx/inc/msp.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
头文件的路径添加错了,添加modules应该添加至模块的根目录

set(ZEPHYR_MODULES /home/xxh/Desktop/zephyr_pro/modules/hal/ti/)
  1. error: ‘DT_INST_0_WINBOND_W25Q16_BUS_NAME’ undeclared (first use in this function)
    问题:编译的时候头文件没有这个宏
    解决方法:在W25Q16_flash_driver驱动的def.h头文件中加入和WINBOND_W25Q_XX的定义。如下:
/* add my micro define */
#define DT_INST_0_WINBOND_W25Q16_BUS_NAME DT_INST_0_ST_STM32_SPI_LABEL
#define DT_INST_0_WINBOND_W25Q16_SPI_MAX_FREQUENCY 2000000
#define DT_INST_0_WINBOND_W25Q16_BASE_ADDRESS 0
		
  1. 执行make出错:undefined reference to `xxx’
    问题:驱动已经写好了,调用是在外部文件调用的;执行make在链接.obj文件时出现,但是头文件已经包含在*.c文件中了
    解决方法:1. 如果此函数头部有static关键字就去掉,否则外部无法调用
    1. 配置文件(Kconfig | Kconfig.xxx)没有配置此函数所在的文件,上层配置无法调用此文件中的所有函数,显示为链接失败(即:xxx.ld failed )

你可能感兴趣的:(zephyr)