3、Tizen源码结构解析:顶层目录功能、核心组件目录、设备驱动目录、构建系统文件
好,咱们今天来聊聊Tizen的源码结构。说实话,我第一次拿到Tizen源码包的时候,也被它的目录数量吓了一跳。但别慌,这东西就像你家的工具箱——看着东西多,其实每个抽屉都有它的用处。
我个人习惯,拿到一个新系统的源码,先看顶层目录。这就像看一个人的骨架,骨架正了,后面填肉就顺了。Tizen的顶层目录设计得挺清晰,咱们一个一个来看。
3.1 顶层目录功能
你解压完Tizen源码后,会看到这么几个关键目录:
| 目录名 | 功能说明 | 我踩过的坑 |
|---|---|---|
kernel/ |
Linux内核源码,包含设备驱动、调度器、内存管理等 | 移植时最常改的就是这里 |
platform/ |
Tizen核心框架,包括应用框架、多媒体、网络等 | 这里面的依赖关系很绕 |
build/ |
构建系统配置,Makefile、Kconfig等 | 新手容易忽略这个目录 |
tools/ |
编译工具链、调试工具、打包脚本 | 交叉编译器就在这里 |
docs/ |
开发文档、API参考、移植指南 | 说实话,文档有时会过时 |
packages/ |
RPM包定义文件,描述每个组件的编译方式 | 改包名时要同步这里 |
嗯,这里要注意一点:kernel/目录下的内核版本,跟你实际硬件平台要匹配。我曾经接手过一个项目,源码里是4.14内核,但板子厂商提供的BSP是基于4.9的。结果呢?驱动接口对不上,折腾了两天才发现是版本问题。
3.2 核心组件目录
核心组件主要集中在platform/目录下。说白了,这里就是Tizen的「灵魂」所在。我把它拆成几个子模块来讲:
3.2.1 应用框架层
路径:platform/core/appfw/
这里面包含了应用生命周期管理、窗口管理、事件分发等。你想想看,一个App从启动到退出,每一步都由这里的代码控制。
- app-manager:应用的安装、卸载、启动
- window-manager:窗口的创建、销毁、层级管理
- event-loop:主循环,处理触摸、按键等事件
我记得有一次移植到一款国产平板,触摸屏怎么点都没反应。查了两天,最后发现是event-loop里的事件分发机制跟那个触摸芯片的驱动不兼容。说白了,就是驱动上报的数据格式跟框架期望的不一样。
3.2.2 多媒体子系统
路径:platform/core/multimedia/
音频、视频、相机、编解码器都在这里。这个目录我建议你重点关注gstreamer/和camera/两个子目录。
核心文件:
gstreamer/plugins/:各种媒体格式的解码插件camera/hal/:相机硬件抽象层,需要根据你的摄像头驱动修改audio/alsa/:ALSA音频驱动接口
为什么说多媒体是移植的硬骨头?因为每家芯片厂商的编解码器都不一样。高通有高通的,联发科有联发科的。你需要在gstreamer/plugins/里添加对应的硬件加速插件,否则视频播放会卡成PPT。
3.2.3 网络与连接
路径:platform/core/connectivity/
Wi-Fi、蓝牙、NFC、USB等。这里我特别想提醒你:Wi-Fi驱动是移植中最容易出问题的模块之一。
为什么?因为Wi-Fi芯片的固件加载方式五花八门。有的需要从文件系统加载,有的需要内核内置。我曾经在移植一款博通Wi-Fi芯片时,固件加载路径写错了,结果Wi-Fi模块一直报「固件加载失败」。查了三天,最后发现是/lib/firmware/目录下的固件文件名大小写不对。
3.3 设备驱动目录
设备驱动主要在kernel/drivers/下。但Tizen的驱动结构跟标准Linux内核有点区别——它多了一层硬件抽象层(HAL)。
路径结构:
kernel/drivers/
├── input/ # 输入设备(触摸、按键)
├── video/ # 显示驱动(LCD、HDMI)
├── media/ # 多媒体驱动(摄像头、编解码器)
├── net/ # 网络设备(以太网、Wi-Fi)
├── sound/ # 音频驱动(I2S、ALSA)
└── staging/ # 未稳定的驱动,移植时经常用
我的经验:移植驱动时,先看staging/目录。很多芯片厂商会把未完全验证的驱动先放这里。虽然不稳定,但至少能跑起来,方便你调试。
嗯,这里有个关键点:Tizen的驱动模型是platform driver。说白了,就是每个设备都对应一个struct platform_device,然后在设备树(DTS)里描述硬件资源。你移植时,主要工作就是写DTS文件。
举个例子,我移植一块LCD屏时,需要修改arch/arm/boot/dts/下的设备树文件:
&lcd_panel: lcd@0 {
compatible = "samsung,s6e3fa3";
reg = <0>;
vdd-supply = <®_lcd_vdd>;
reset-gpios = <&gpa0 0 GPIO_ACTIVE_LOW>;
enable-gpios = <&gpa1 1 GPIO_ACTIVE_HIGH>;
rotation = <0>;
};
你看,这里定义了电源、复位引脚、使能引脚。如果这些GPIO号跟你的板子对不上,屏幕就点不亮。我曾经因为一个GPIO的极性写反了,屏幕一直黑着,还以为是背光驱动的问题。
3.4 构建系统文件
Tizen的构建系统基于GNU Make和Kconfig。说白了,就是Linux内核那套构建体系的升级版。
关键文件:
| 文件/目录 | 作用 | 注意事项 |
|---|---|---|
build/Makefile |
顶层Makefile,控制整个编译流程 | 不要直接修改,用make menuconfig |
build/Kconfig |
配置菜单定义,决定哪些模块被编译 | 新增驱动时要在这里注册 |
build/configs/ |
预置的配置文件,比如tizen_arm64_defconfig |
移植时从这里复制一份修改 |
packages/ |
RPM spec文件,定义每个包的编译规则 | 依赖关系写错会导致编译失败 |
警告:千万不要直接修改build/Makefile!我见过有人为了加一个编译选项,直接改了顶层Makefile,结果整个团队的编译环境都乱了。正确的做法是:在build/configs/下创建你自己的配置文件,然后用make TIZEN_CONFIG=your_config来编译。
构建流程大致是这样的:
make menuconfig:选择你要编译的模块make:开始编译,生成内核镜像和模块make modules_install:安装模块到目标文件系统make image:打包成可烧录的镜像文件
我个人习惯,在build/configs/目录下放一个my_board_defconfig文件。里面只包含我板子需要的配置,这样每次编译时直接指定这个文件,省得每次都要重新选。
最后说一句:构建系统文件虽然看起来枯燥,但它是整个移植工作的「指挥中心」。你改驱动、改框架,最终都要通过构建系统把它们组织起来。所以,花点时间把build/目录的结构搞清楚,后面会省很多事。
好,这一章就到这里。下一章咱们开始动手,搭建Tizen的编译环境。到时候我会手把手教你配置交叉编译工具链,那才是真正有意思的部分。