3. 联咏SDK工程结构与驱动框架
联咏(Novatek)平台的Sensor驱动开发,第一步不是写代码,而是看懂SDK的目录组织。NT9系列(如NT96670、NT9852x)的SDK通常以nvt_sdk/为根,内部按“平台代码—外设驱动—应用—构建系统”四层划分。理解这套结构,才能在正确的位置新增或修改Sensor驱动,避免把文件放错目录导致编译系统找不到。
典型目录组织如下:code/存放平台底层与HAL,code/drivers/sensor/是Sensor驱动主目录,code/isp/是ISP管线与3A算法,configs/存放板级与Sensor配置文件,Makefile与Kconfig分布在各级目录中。Sensor驱动文件命名有明确规范:通常为sensor_<厂商>_<型号>.c,例如sensor_sony_imx335.c、sensor_ov_ov5647.c。头文件同名.h,配置片段常放在configs/sensor/下,命名与驱动一致。命名规范的意义在于:构建系统通过文件名与Kconfig符号自动关联,命名不一致会导致驱动无法被选中。
驱动注册的核心是sensor_driver结构体。每个Sensor驱动在文件末尾定义一个该结构体实例,包含.name(如"imx335")、.id(I2C从地址或芯片ID)、.ops(指向sensor_ops的回调集合,如init、start、stop、set_mode)。这些实例通过宏REGISTER_SENSOR_DRIVER()注册到编译期生成的sensor_list[]段中。运行时,ISP或上层应用根据配置的Sensor名称在sensor_list[]中查找匹配项,匹配成功后调用.ops->init()完成上电、I2C初始化、寄存器序列写入。若名称不匹配,日志会报sensor not found,此时应检查Kconfig是否选中、驱动文件是否加入Makefile。
Makefile与Kconfig是驱动被编译进来的两道关卡。Kconfig定义配置符号,例如:
config SENSOR_IMX335
bool "Sony IMX335 sensor support"
depends on I2C && ISP
default n
help
Enable Sony IMX335 CMOS sensor driver.
Makefile则根据该符号决定是否编译对应目标文件:
obj-$(CONFIG_SENSOR_IMX335) += sensor_sony_imx335.o
两者必须成对出现:Kconfig提供菜单选项,Makefile执行编译动作。若只加Kconfig不加Makefile,menuconfig能选中但不会生成.o;若只加Makefile不加Kconfig,则无法通过配置开启。新增Sensor时,还需在configs/sensor/下补充该型号的初始化寄存器表与分辨率配置,通常以imx335_cfg.h形式被驱动文件#include。
编译烧录流程可概括为:make menuconfig选中目标Sensor → make编译生成内核与驱动 → 打包固件(fw.bin或rootfs)→ 通过USB或SD卡烧录到板端。烧录后上电,观察串口日志。判断驱动是否成功接入,可依次检查:日志中是否出现sensor imx335 probe ok;/dev/video0是否可打开;ISP是否正常出图;I2C地址是否与配置一致(IMX335常见0x36);分辨率与帧率是否与cfg匹配。若probe失败,优先排查I2C通信、供电时序和Kconfig/Makefile配对。
drivers/sensor/创建sensor_<厂商>_<型号>.c/.h;② 在configs/sensor/添加配置头文件;③ 在Kconfig添加符号;④ 在Makefile添加obj-$(CONFIG_...);⑤ menuconfig选中并编译;⑥ 烧录验证日志与出图。掌握这套“目录—命名—注册—构建—烧录”的链路后,后续接入任意新Sensor都只是替换型号与寄存器序列的工作。真正容易出错的往往不是驱动逻辑本身,而是文件放错目录、Kconfig与Makefile符号不一致、或I2C地址与硬件不匹配。把这三处对齐,联咏平台的Sensor接入就能稳定复现。