设为首页 加入收藏

TOP

海思屏幕HAL代码解析(一)
2019-08-27 07:21:15 】 浏览:185
Tags:屏幕 HAL 代码 解析

显示屏幕(LCD)模块提供屏幕相关功能接口,调用者为上层应用模块(含 init、状态机、ui),上下文依赖关系,如图 3-7 所示。

系统框架为 linux+Huawei LiteOS 双系统架构,媒体业务部署在 Huawei LiteOS 端,为了上电快速预览,需要屏幕需部署在 Huawei LiteOS。

  • 用户交互业务在 linux 端,屏幕亮度、熄屏/亮屏等屏幕动态属性需要在 linux 端提供接口。
  • 屏幕 HAL 层含 linux 和 Huawei LiteOS 业务接口。
  • linux 通过 ipcmsg 将命令传送给 Huawei liteOS,所有业务功能实现都在 Huawei LiteOS 端。

LCD HAL 层架构图

媒体流程图:

初始化流程主要包含以下方面:

  • 操作系统配置,如双核驱动、共享文件系统初始化;
  • 芯片配置,如管脚配置、系统时钟、媒体驱动加载;
  • 外设配置,如屏幕配置、外设驱动加载;
  • 业务服务启动,如媒体初始化、开机业务、UI 启动。

INIT 模块在系统中对外的依赖关系如图 4-82 所示。

1. 目录结构:

1.1 双系统 AMP 目录结构

├──liteos
│ ├── src
│ │ ├── hi_product_init_main.c //Huawei LiteOS 端初始化 main 函数
│ │ ├── hi_product_init_hi35xxvxx.c //芯片相关初始化 C 文件
│ │ ├── hi_product_init_chip.h //芯片相关初始化头文件
│ │ ├── hi_product_ init _os.c //OS 相关初始化 C 文件
│ │ ├── hi_product_ init _os.h //OS 相关初始化头文件
│ │ ├── hi_product_ init _peripheral.c //外设相关初始化 C 文件
│ │ ├── hi_product_ init _peripheral.h //外设相关初始化头文件
│ │ └── hi_product_ init _service.c //业务相关初始化 C 文件
│ │ └── hi_product_ init _service.h //业务相关初始化头文件
│ ├──Makefile
├──linux
│ ├── src
│ │ ├── hi_product_main.c //linux 端初始化实现
│ ├──Makefile
└── Makefile

2. HAL的代码

通过全局搜索,可以知道在build.mk/kconfig.mak中的AMP_TYPE为linux_liteos

Linux 端初始化主要处理与业务功能强相关的初始化操作,如状态管理业务、按键业务、储存管理业务、文件管理业务、UI 等。

Hi3556AV100_MobileCam_SDK_V2.0.1.0\reference\actioncam\modules\init\amp\linux\src中的hi_product_main.c

2.1 Linux中的reference启动代码:

进程名字为main_app,在bootapp脚本下运行:

main函数开始:

HI_S32 main(HI_S32 s32Argc, HI_CHAR* pszArgv[])
{
    HI_TIME_STAMP;

    HI_PDT_WORKMODE_E enPoweronWorkmode = HI_PDT_WORKMODE_BUTT;
    HI_STORAGEMNG_CFG_S stStorageMngCfg;
    PDT_Init(&enPoweronWorkmode, &stStorageMngCfg);

#if PDT_APP_COMMAND_DEBUG
    printf(GREEN"\nenable command line debug tool\n\n"NONE);
    PDT_CommandDebug(enPoweronWorkmode, &stStorageMngCfg);
#endif

    /** wait for poweroff Semaphore, it can not run to here when
     ** PDT_APP_COMMAND_DEBUG is true and the while loop is not over */
    while((HI_SUCCESS != sem_wait(&s_PowerOffSem)) && (errno == EINTR));

    PDT_Deinit(&stStorageMngCfg);

    return HI_SUCCESS;
}

看一下主要的函数PDT_Init()函数,下面主要讲几个主要的关于LCD的函数:

static HI_VOID PDT_Init(HI_PDT_WORKMODE_E *penPoweronWorkmode,
    HI_STORAGEMNG_CFG_S* pstStorageMngCfg)
{
    HI_S32 s32Ret = HI_SUCCESS;

    /** init debug related setting */
    PDT_SetDebugLogLevel();     //初始化打印优先级
    PDT_SetCrashHandleType();   //初始化错误发生的时候的处理的句柄函数,其实里面就是处理了相应的信号函数

    /** init semaphore */
    sem_init(&s_PowerOffSem, 0, 0);     //初始化信号量

    /** init Param */
    s32Ret = HI_PDT_PARAM_Init();       //初始化变量
    PDT_APP_CHECK_RET(s32Ret, "HI_PDT_PARAM_Init");

    /** init ShareFs */
    extern void sharefs_server_init(void);
    sharefs_server_init();          //这里是调用ipcm 中的sharefs,sharedfs是liteos与Linux之间利用 IPCM 通信和共享内存,实现其读写 Linux上指定目录下的内容。

    /** init custom msg client */
    s32Ret = HI_MSG_CLIENT_Init();  //初始化ipcm中的client端
    PDT_APP_CHECK_RET(s32Ret, "HI_MSG_CLIENT_Init");

    /** set system time */
    PDT_SyncLinuxLiteosTime();      //同步liteos和Linux的时间

    /** register hal sreen ops */
#if defined(CONFIG_SCREEN)
    extern HI_HAL_SCREEN_OBJ_S stHALSCREENObj;
    s32Ret = HI_HAL_SCREEN_Register(HI_HAL_SCREEN_IDX_0, &stHALSCREENObj);      //HI_HAL_SCREEN_IDX_0是指枚举,是指第一个屏幕,初始化重复注册一次
    PDT_APP_CHECK_RET(s32Ret, "HI_HAL_SCREEN_Register");

    s32Ret = HI_HAL_SCREEN_Init(HI_HAL_SCREEN_IDX_0);       //屏幕注册0
    P
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇做嵌入式,C语言相关的朋友不要错.. 下一篇网络流媒体协议之——RTSP协议

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目