当前位置:网站首页>【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)
【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)
2022-06-12 13:36:00 【CielleeX】
【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)
本 SemiDrive源码分析 之 Yocto源码分析 系列文章汇总如下:
- 《【SemiDrive源码分析】【Yocto源码分析】01 - yocto/base目录源码分析(编译环境初始化流程)》
- 《【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析》
- 《【SemiDrive源码分析】【Yocto源码分析】03 - yocto/meta-semidrive目录及Yocto Kernel编译过程分析(上)》
- 《【SemiDrive源码分析】【Yocto源码分析】04 - yocto/meta-semidrive目录及Yocto Kernel编译过程分析(下)》
- 《【SemiDrive源码分析】【Yocto源码分析】05 - 找一找Yocto Kernel编译过程中所有Task的源码在哪定义的呢?》
- 《【SemiDrive源码分析】【Yocto源码分析】06 - Kernel编译生成的Image.bin、Image_nobt.dtb、modules.tgz 这三个文件分别是如何生成的?》
- 《【SemiDrive源码分析】【Yocto源码分析】07 - core-image-base-x9h_ref_serdes.rootfs.ext4 文件系统是如何生成的》
- 《【SemiDrive源码分析】【X9芯片启动流程】08 - X9平台 lk 目录源码分析 之 目录介绍》
- 《【SemiDrive源码分析】【X9芯片启动流程】09 - X9平台系统启动流程分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】10 - BareMetal_Suite目录R5 DIL.bin 引导程序源代码分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】12 - freertos_safetyos目录Cortex-R5 DIL2.bin 之 sdm_display_init 显示初始化源码分析》
- 《【SemiDrive源码分析】【X9芯片驱动调试】13 - GPIO 配置方法》
- 《【SemiDrive源码分析】【X9芯片启动流程】14 - freertos_safetyos目录Cortex-R5 SafetyOS/RTOS工作流程分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】15 - freertos_safetyos目录 R5 SafetyOS 之 tcpip_init() 代码流程分析》
- 《【SemiDrive源码分析】【X9 Audio音频模块分析】16 - 音频模块框图及硬件原理图分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】17 - R5 SafetyOS 之 LK_INIT_LEVEL_PLATFORM 阶段代码流程分析(上)dcf_init 核间通信初始化》
- 《【SemiDrive源码分析】【X9芯片启动流程】18 - R5 SafetyOS 之 LK_INIT_LEVEL_PLATFORM 阶段代码流程(下)启动QNX、Android》
- 《【SemiDrive源码分析】【X9芯片启动流程】19 - MailBox 核间通信机制介绍(理论篇)》
- 《【SemiDrive源码分析】【X9芯片启动流程】20 - MailBox 核间通信机制介绍(代码分析篇)之 MailBox for RTOS 篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】22 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-VIRTIO Kernel 篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】23 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC Kernel 篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】24 - MailBox 核间通信机制相关寄存器介绍》
- 《【SemiDrive源码分析】【X9芯片启动流程】25 - MailBox 核间通信机制介绍(代码分析篇)之 RPMSG-IPCC RTOS & QNX篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)》
- 《【SemiDrive源码分析】【X9芯片启动流程】27 - R5 SafetyOS 之 .apps 应用启动代码流程分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】28 - Android Preloader启动流程分析》
- 《【SemiDrive源码分析】【X9芯片启动流程】29 - MailBox 核间通信机制介绍(代码分析篇)之 Property篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】30 - MailBox 核间通信机制介绍(代码分析篇)之 RPCall篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】31 - MailBox 核间通信机制介绍(代码分析篇)之 Notify篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】32 - MailBox 核间通信机制介绍(代码分析篇)之 Socket篇》
- 《【SemiDrive源码分析】【X9芯片启动流程】33 - MailBox 核间通信机制介绍(代码分析篇)之 /dev/vircan篇》
前面一段时间,我们在分析MailBox,虽然没全分析完,但MailBox 的原理已经差不多了解了,
由于项目快开始了,考虑到时间已经不支持继续详细分析MailBox 了,所以从本文开始,继续回归初始化流程的分析,尽快把启动流程看完,至于MailBox等后续再看吧。
在前面 《【SemiDrive源码分析】【X9芯片启动流程】14 - freertos_safetyos目录Cortex-R5 SafetyOS/RTOS工作流程分析》 中,
我们分析到,R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段主要是运行如下函数:register_touch_driver_entry(),hal_vpu_create_mutex(),cospi_early_init(),hal_crypto_init(),(lk_init_hook)res_fs_init(),(lk_init_hook)audio_server_init()
一、register_touch_driver_entry() 注册TP 驱动
可以看出,触摸驱动是通过 register_touch_driver() 来探测初始化TP 的,
注册时,先调用 get_touch_device(&tsc, &tsc_num); 获取 TP 相关的配置信息保存在tsc[i] 中,
然后调用驱动换 probe 函数,传参 tsc[i]配置参数
# buildsystem\rtos\lk_boot\framework\service\input\include\touch_driver.h
#define register_touch_driver(drv) \ static void register_touch_driver_entry(uint level) \ {
\ __register_touch_driver(&drv); \ } \ LK_INIT_HOOK(touch_driver##drv, register_touch_driver_entry, LK_INIT_LEVEL_TARGET)
# buildsystem\rtos\lk_boot\framework\service\input\touch_driver.c
void __register_touch_driver(struct touch_driver *driver)
{
struct ts_board_config *tsc = NULL;
int tsc_num = 0;
get_touch_device(&tsc, &tsc_num);
for (int i = 0; i < tsc_num; i++) {
if (tsc[i].enable && driver->probe && !strcmp(tsc[i].device_name, driver->driver_name))
driver->probe(&tsc[i]);
}
}
1.1 TP 配置参数 ts_board_config
如下是 X9HP 默认的TP 配置参数,采用的是下LVDS3 和 LVDS4 两个接口
# buildsystem\rtos\lk_boot\target\reference_x9\safety\touch_device.c
static struct ts_board_config tsc[] = {
{
/*---LVDS4---*/
TS_ENABLE, "goodix", RES_I2C_I2C15, 0x5d,
TS_SUPPORT_CTRLPANEL_MAIN, CONTROLPANEL,
{
1920, 720, 10, 0, 0, 0},
{
false, 12, 0x75, TCA9539_P07},
{
true, TI_SERDES, TI947_SINGLE, TI948, 0x1a, 0x2c, 3, 2},
{
0}, //reset-pin:0 not used yet
{
PortConf_PIN_I2S_MC_SD7, //irq-pin:131
{
0, 0}
}
},
{
/*---LVDS3---*/
TS_DISABLE, "goodix", RES_I2C_I2C14, 0x5d,
TS_SUPPORT_CTRLPANEL_AUX1, ENTERTAINMENT,
{
1920, 720, 10, 0, 0, 0},
{
false, 12, 0x75, TCA9539_P06},
{
false, TI_SERDES, TI947_SINGLE, TI948, 0x0, 0x0, 0, 0},
{
0}, //reset-pin:0 not used yet
{
PortConf_PIN_I2S_MC_SD6, //irq-pin:130
{
0, 0}
}
},
};
其结构体定义如下:
# buildsystem\rtos\lk_boot\framework\service\input\include\touch_device.h
struct ts_board_config {
bool enable;
const char *device_name;
u32 res_id;
u16 i2c_addr;
u16 ts_domain_support;
enum DISPLAY_SCREEN screen_id;
struct ts_coord_config coord_config;
struct port_expand_config port_config;
struct ts_serdes_config serdes_config;
struct ts_pin_config reset_pin;
struct ts_pin_config irq_pin;
};
TP 使用串行、解串的芯片是 TI947_SINGLE、TI948
# buildsystem\rtos\lk_boot\framework\service\input\include\touch_device.h
enum ts_serdes_type {
TI_SERDES,
TS_SERDES_MAX,
};
enum ts_ser_type {
TI941_SINGLE,
TI941_SECOND,
TI941_DUAL,
TI947_SINGLE,
TI947_SECOND,
TI947_DUAL,
TS_SER_MAX,
};
enum ts_des_type {
TI948,
TS_DES_MAX
};
1.2 TP 配置参数
我们以 goodix.c 来举例,看看TP 初始化时做了什么:
# buildsystem\rtos\lk_boot\exdev\touch\src\goodix.c
static struct touch_driver goodix_driver = {
"goodix",
goodix_probe_device,
};
register_touch_driver(goodix_driver);
我们进入 goodix_probe_device() 函数,开始探测初始化:
- 申请并初始化
goodix结构体,解析dev_irq_pin_num分别为130和131 - 获取
I2C句柄instance, 保存在goodix->i2c_handle中 - 解析 串行、解串
conf参数,配置串行解串链路: 检查serdes链路是否通、使能TI947_SINGLE芯片、写寄存器0x17为0x9e(启动i2cpass) - 检查
serdes链路是否通,通过I2C直接读取0x6寄存器,在其中保存了对应的des地址 - 重置设备,读取版本号。
# buildsystem\rtos\lk_boot\exdev\touch\src\goodix.c
static int goodix_probe_device(const struct ts_board_config *conf)
{
struct goodix_ts_data *goodix = NULL;
// 1. 申请并初始化 goodix 结构体,解析dev_irq_pin_num分别为130和131
goodix = malloc(sizeof(struct goodix_ts_data));
memset(goodix, 0, sizeof(struct goodix_ts_data));
goodix->conf = conf; // reference_x9\safety\touch_device.c
goodix->instance = goodix->conf->ts_domain_support; // 0x5d
goodix->dev_irq = goodix->conf->irq_pin.pin_num; // PortConf_PIN_I2S_MC_SD7:131, PortConf_PIN_I2S_MC_SD6:130
// 2. 获取RES_I2C_I2C15和RES_I2C_I2C14 的I2C句柄instance, 保存在goodix->i2c_handle中
hal_i2c_creat_handle(&goodix->i2c_handle, goodix->conf->res_id); // RES_I2C_I2C15、RES_I2C_I2C14
=====> instance = hal_i2c_get_instance(i2c_res_glb_idx);
// 3. 解析 串行、解串 conf参数,配置串行解串链路: 检查 serdes 链路是否通、使能TI947_SINGLE 芯片、写寄存器 0x17为0x9e(启动i2c pass)
if (goodix->conf->serdes_config.enable) {
if (goodix->conf->serdes_config.serdes_type == TI_SERDES) {
enum ts_ser_type ser_type = goodix->conf->serdes_config.ser_type; // TI947_SINGLE
enum ts_des_type des_type = goodix->conf->serdes_config.des_type; // TI948
u16 ser_addr = goodix->conf->serdes_config.ser_addr; // 0x1a
u16 des_addr = goodix->conf->serdes_config.des_addr; // 0x2c
// 4. 检查 serdes 链路是否通,通过 I2C 直接读取 0x6 寄存器,在其中保存了对应的des 地址。
ret = ti_serdes_link_check(goodix->i2c_handle, ser_addr, ser_type, des_addr, des_type);
// 5. 使能TI947_SINGLE 芯片,写寄存器0x1e=0x01
ret = ti_ser_enable_port(goodix->i2c_handle, ser_addr, ser_type);
// 6. 写寄存器 0x17为0x9e: 启动i2c pas
ret = ti_ser_enable_i2c_passthrough(goodix->i2c_handle, ser_addr, ser_type);
}
}
// 7. 重置设备,读取版本号。
do {
goodix_reset_device(goodix);
if (!goodix_read_version(goodix))
break;
} while (++count < 3);
ret = goodix_firmware_upgrade(goodix);
ret = goodix_config_device(goodix);
goodix->safe_ts_dev = safe_ts_alloc_device();
goodix->safe_ts_dev->instance = goodix->conf->ts_domain_support;
goodix->safe_ts_dev->screen_id = goodix->conf->screen_id;
goodix->safe_ts_dev->vinfo.id = goodix->id;
goodix->safe_ts_dev->vinfo.version = goodix->version;
goodix->safe_ts_dev->vinfo.vendor = goodix->vendor;
goodix->safe_ts_dev->vinfo.name = goodix->conf->device_name;
goodix->safe_ts_dev->vinfo.ser_addr = goodix->conf->serdes_config.ser_addr;
goodix->safe_ts_dev->vinfo.des_addr = goodix->conf->serdes_config.des_addr;
goodix->safe_ts_dev->vinfo.ts_addr = goodix->conf->i2c_addr;
goodix->safe_ts_dev->cinfo.max_touch_num = goodix->conf->coord_config.max_touch_num;
goodix->safe_ts_dev->cinfo.swapped_x_y = goodix->conf->coord_config.swapped_x_y;
goodix->safe_ts_dev->cinfo.inverted_x = goodix->conf->coord_config.inverted_x;
goodix->safe_ts_dev->cinfo.inverted_y = goodix->conf->coord_config.inverted_y;
goodix->safe_ts_dev->set_inited = goodix_set_inited;
goodix->safe_ts_dev->vendor_priv = goodix;
ret = safe_ts_register_device(goodix->safe_ts_dev);
if (ret) {
safe_ts_delete_device(goodix->safe_ts_dev);
dprintf(CRITICAL, "%s: safe_ts_register_device fail, instance=%#x\n",
__func__, goodix->instance);
goto err;
}
dprintf(ALWAYS, "%s, instance=%#x, done ok\n", __func__, goodix->instance);
return 0;
err1:
hal_i2c_release_handle(goodix->i2c_handle);
err:
free(goodix);
return -1;
}
二、hal_vpu_create_mutex()
三、cospi_early_init()
四、hal_crypto_init()
五、(lk_init_hook)res_fs_init()
六、(lk_init_hook)audio_server_init()
边栏推荐
- import torch_geometric 加载一些常见数据集
- Automatic Generation of Visual-Textual Presentation Layout
- Realization of Joseph Ring with one-way ring linked list
- There was an error installing mysql. Follow the link below to CMD
- A brief introduction to Verilog mode
- "Non" reliability of TCP
- Resume NFT platform trustrecruit joined Octopus network as a candidate application chain
- 单向环形链表实现约瑟夫环
- view的子视图的递归
- 成功定级腾讯T3-2,万字解析
猜你喜欢

C#DBHelper_FactoryDB_GetConn

Summary of question brushing in leetcode sliding window

事件的传递和响应以及使用实例

Successful job hopping Ali, advanced learning

VGA display color bar and picture (FPGA)

创新实训(十一)开发过程中的一些bug汇总

leetcode 47. Permutations II full permutations II (medium)

It is enough to read this article. Web Chinese development

Pytoch official fast r-cnn source code analysis (I) -- feature extraction

Pytorch to onnx, onnxruntime reasoning in mmclas
随机推荐
[Title brushing] Super washing machine
数据类型转换和条件控制语句
Actual combat | realizing monocular camera ranging by skillfully using pose solution
Redis message queue repeated consumption
C#DBHelper_FactoryDB_GetConn
How to balance multiple losses in deep learning?
2063: [example 1.4] cattle eat grass
jsp跳转问题,不能显示数据库数据,并且不能跳转
Deploy opengauss database based on Huawei cloud Kunpeng elastic ECS [Gauss is not a mathematician this time]
import torch_geometric 第一个图网络例子
leetcode 47. Permutations II 全排列 II(中等)
What if the MySQL installation on the apple computer is completed and cannot be found
Innovation training (XII) project summary
jupyternotebook有汉字数据库吗。在深度学习中可以识别手写中文吗
Application of binary search -- finding the square root sqrt of a number
import torch_geometric 的Data 查看
Implementing pytorch style deep learning framework similartorch with numpy
list和dict的应用
Tinyxml Usage Summary
Pytoch official fast r-cnn source code analysis (I) -- feature extraction