首页 > 其他分享 >gscoolink:gsv2001的sdk移植

gscoolink:gsv2001的sdk移植

时间:2024-11-21 19:46:02浏览次数:1  
标签:pin bsp GPIOB AvRet sdk gsv2001 kapi gscoolink define

1 前言

  以gsv的sdk的应用代码为例,将应用代码从m0核移植到m1核的mcu上;

  因为用的是hal库,所以互相移植修改的并不多;实际改个头文件就可以编译了;

  虽然我hal库用的是m1核的hal库,但是实际上我直接啥也没改,跑在m4核的gdf303上也没啥问题;

2 修改项目名

  修改.uprojx的名字,为project名;

  manage project items >> project targets >> 修改target名;

  options for target >> output >> select folder for objects >> 选择output目录;

  options for target >> output >> name for execucutable >> xx.axf改成项目名;

  options for target >> listing >> select folder for listing >> 选择listing目录,和output目录一起省的多个文件;

  options for target >>user >> run >> 

    fromelf.exe --bin -o ./releaseFile/Test1_Z_SP12CS-V2_V1.0.0a_0691_08009000.bin    ./outputFile/SP12.axf

    fromelf.exe --bin -o ./releaseFile/Test2_Z_SP12CS-V2_V1.0.0a_0691_08009000.bin   "#L"

3 源码包含

  3.1 包含xx.c和xx.h的文件;

    project目录下的xx.c文件在编译的时候分先后,所以要按顺序包含;

    IncludePaths框内的头文件在包含的时候也分先后,所以要按顺序包含;

    如果不按原有目录的顺序包含,会打乱编译顺序,然后会报错很多undefined的问题;这里卡了一天;

  3.2 包含gsvSDK的文件

    m0,m3,m4核的架构差别不大,加上sdk代码相当于应用层代码,和mcu的hal库以及cm核耦合性并不高;

    把那几个#include "stm32f0xx.h" >> #include "stm32f1xx.h",还有代码中的一些GPIO寄存器设置注释掉;

    这样的话sdk基本就可以编译通过了,先编译通过先,后面再具体修改;

4 gsvSDK修改

  gsv的sdk将音视频的应用代码和bsp板间外设进行了分离,代码移植到不同板子上时只需要修改对应bsp,方便移植;

  gsv给用户封装了两个接口用来作为bsp的回调注册,那么这两个函数都是如何工作的呢?如果要移植我们都需要改啥呢?

/* 1.2 init software package and hookup user's bsp functions */
AvApiInit();
AvApiHookBspFunctions(&BspI2cRead, &BspI2cWrite, &BspUartSendByte,&BspUartGetByte, &BspGetMilliSecond, &BspGetKey, &BspIrdaGetByte);
AvApiHookUserFunctions(&ListenToKeyCommand, &ListenToUartCommand, &ListenToIrdaCommand);

  4.1 AvApiHookBspFunctions函数

/** bsp 函数指针定义 ***************************************************************************/
//hal.h    hardware access functions; cae:I would like to store definitions into uapi.h
typedef AvRet (*AvFpI2cRead)(uint32, uint32, uint8 *, uint16);
typedef AvRet (*AvFpI2cWrite)(uint32, uint32, uint8 *, uint16);
typedef AvRet (*AvFpUartSendByte)(uint8 *, uint16);
typedef AvRet (*AvFpUartGetByte)(uint8 *);
typedef AvRet (*AvFpGetMilliSecond)(uint32 *);
typedef AvRet (*AvFpGetKey)(uint8 *);
typedef AvRet (*AvFpGetIrda)(uint8 *);

//uapi.c   hal functions variables 
AvFpI2cRead        AvHookI2cRead;
AvFpI2cWrite       AvHookI2cWrite;
AvFpUartSendByte   AvHookUartTxByte;
AvFpUartGetByte    AvHookUartRxByte;
AvFpGetMilliSecond AvHookGetMilliSecond;
AvFpGetKey         AvHookGetKey;
AvFpGetIrda        AvHookGetIrda;

//uapi.h  下面的kapi.h就没有用extern;这个gsv的代码对称性不好;
extern  AvFpI2cRead        AvHookI2cRead;
extern  AvFpI2cWrite       AvHookI2cWrite;
extern  AvFpUartSendByte   AvHookUartTxByte;
extern  AvFpUartGetByte    AvHookUartRxByte;
extern  AvFpGetMilliSecond AvHookGetMilliSecond;
extern  AvFpGetKey         AvHookGetKey;
extern  AvFpGetIrda        AvHookGetIrda;

/**av_main.c >> bsp 函数指针注册 *****************************************************************/

//uapi.c  @brief  hookup user's hardware access functions
uapi AvRet AvUapiHookBspFunctions(pin AvFpI2cRead i2cRd, pin AvFpI2cWrite i2cWr, pin AvFpUartSendByte uartTxB, pin AvFpUartGetByte uartRxB, pin AvFpGetMilliSecond getMs, pin AvFpGetKey getKey,pin AvFpGetIrda getIrda)
{
    AvRet ret = AvOk;
    AvHookI2cRead = i2cRd;
    AvHookI2cWrite = i2cWr;
    AvHookUartTxByte = uartTxB;
    AvHookUartRxByte = uartRxB;
    AvHookGetMilliSecond = getMs;
    AvHookGetKey = getKey;
    AvHookGetIrda = getIrda;
    AvUapiOutputDebugMessage(" ");
    AvUapiOutputDebugMessage("-------------------------------------------------------------------");
    AvUapiOutputDebugMessage("    |> Audio/Video Software %s", AvVersion);
    AvUapiOutputDebugMessage("-------------------------------------------------------------------");
    return ret;
}

//av_main.c
AvApiHookBspFunctions(&BspI2cRead, &BspI2cWrite, &BspUartSendByte,&BspUartGetByte, &BspGetMilliSecond, &BspGetKey, &BspIrdaGetByte);

/** bsp 函数指针回调******************************************************************************/
//hal.h
#define AvI2cRead         AvHookI2cRead
#define AvI2cWrite        AvHookI2cWrite
#define AvUartTxByte      AvHookUartTxByte
#define AvUartRxByte      AvHookUartRxByte
#define AvGetMilliSecond  AvHookGetMilliSecond
#define AvGetKey          AvHookGetKey
#define AvIrdaRxByte      AvHookGetIrda

//hal.c  以重新封装的Avxx宏去调用,这样就实现了bsp隔离;
AvRet AvHalI2cRead(pin uint32 devAddress, pin uint32 regAddress, pout uint8 *avdata, pin uint16 count)
{
    AvRet ret = AvOk;
    ret = AvI2cRead(devAddress, regAddress, avdata, count);
    return ret;
}

//把 &BspI2cRead 封装成 AvHookI2cRead,然后又封装成AvI2cRead; 双重封印;
//如果是我我只会封一层,这玩意干嘛要封两层?

  4.2 AvApiHookUserFunctions函数  

/**kapi.h userFunction 函数指针定义 *****************************************************************/
typedef void (*AvFpKeyCommand) (AvPort *port);
typedef void (*AvFpUartCommand) (AvPort *port);
typedef void (*AvFpIrdaCommand) (AvPort *port);

//kapi.c
AvFpKeyCommand   AvHookKeyCmd;
AvFpUartCommand  AvHookUartCmd;
AvFpIrdaCommand  AvHookIrdaCmd;

/**kapi.h userFunction 函数指针注册 *****************************************************************/
//kapi.c  @brief  hookup user layer access functions
kapi AvRet AvKapiHookUserFunctions(pin AvFpKeyCommand keyCmd, pin AvFpUartCommand uartCmd,pin AvFpIrdaCommand IrdaCmd)
{
    AvRet ret = AvOk;
    AvHookKeyCmd = keyCmd;
    AvHookUartCmd = uartCmd;
    AvHookIrdaCmd = IrdaCmd;
    return ret;
}

//av_main.c
AvApiHookUserFunctions(&ListenToKeyCommand, &ListenToUartCommand, &ListenToIrdaCommand);

/**kapi.h userFunction 函数指针回调 *****************************************************************/
//kapi.h 
#define AvUserUartCmd       AvHookUartCmd
#define AvUserKeyCmd        AvHookKeyCmd
#define AvUserIrdaCmd       AvHookIrdaCmd

//kapi.c
while(TempPort){
    /* Make Key Response and Uart Response faster */
    AvUserUartCmd(FirstPort);
    AvUserKeyCmd(FirstPort);
    AvUserIrdaCmd(FirstPort);
    //...
}

  4.3 bsp修改

    对于iic而言,软件模拟的,可以直接用gsv写的;只要改一下GPIO寄存器操作; 参考修改GPIO的IIC的CRH或CRL寄存器

    对于uart而言,注释掉gsv的bsp回调函数,使用已有的uartBsp回调;

    对于按键而言,注释掉gsv的bsp回调函数;

//kapi.h 下面的监听回调是封装在kapi.h中的;而bsp的调用宏是封装在hal.h中;
#define AvUserUartCmd       //AvHookUartCmd
#define AvUserKeyCmd        //AvHookKeyCmd
#define AvUserIrdaCmd       //AvHookIrdaCmd

//i2c.c
#define SET_SCL0_1     GPIOB->BSRR = GPIO_PIN_13           // Pin I2C_SCL
#define SET_SDA0_1     GPIOB->BSRR = GPIO_PIN_14           // Pin I2C_SDA
#define SET_SCL0_0     GPIOB->BSRR = GPIO_PIN_13<<16U      // Pin I2C_SCL
#define SET_SDA0_0     GPIOB->BSRR = GPIO_PIN_14<<16U      // Pin I2C_SDA
#define GET_SDA0       ((GPIOB->IDR & GPIO_PIN_14)? 1:0)   // Pin I2C_SDA
#define SCL0_IN        GPIOB->CRH = ( ((GPIOB->CRH)&0xff0fffff)|0x00400000 )
#define SCL0_OUT       GPIOB->CRH = ( ((GPIOB->CRH)&0xff0fffff)|0x00700000 )
#define SDA0_IN        GPIOB->CRH = ( ((GPIOB->CRH)&0xf0ffffff)|0x04000000 )
#define SDA0_OUT       GPIOB->CRH = ( ((GPIOB->CRH)&0xf0ffffff)|0x07000000 )

  4.4 printf修改

//uapi.c  本来的打印函数使用gsv的bsp的uart,改一下用printf;这样关个宏就可以了,不用改bsp;
uapi AvRet AvUapiOuputDbgMsg(pin schar *stringToFormat, ...){

    AvRet ret = AvOk;
    #if AvEnableDebugFsm
        va_list ap;
        va_start(ap, stringToFormat);
        vprintf(stringToFormat, ap);  // 使用vprintf直接打印格式化字符串
        va_end(ap);
        printf("\r\n");
    #endif
    return ret;
}

  4.5 gsvMain

    函数改成case语句,然后搞个while(1)或者task来调用即可;这样就移植完成了;

void gsv2k1_Main(void){
    static uint8_t state = 0;
    switch(state){
        case 0:
            CAE("gsv2k1_Main() ");
            GsvMain();
            state++;
        break;
        case 1:
            AvApiUpdate();
            AvPortConnectUpdate(&devices[0]);
        break;
    }
}

5 小结

  问题想清楚之后执行就好了,行动才是生产力;

  这个东西移植起来事后复盘还是比较简单的,但是移植了好几天,因为还用了一半以上时间去确认有没有遗漏;

标签:pin,bsp,GPIOB,AvRet,sdk,gsv2001,kapi,gscoolink,define
From: https://www.cnblogs.com/caesura-k/p/18222492

相关文章

  • install .net 8 sdk/runtime on win7
    .net8sdk/runtimecanbeinstalledonwin7,if installvcredistribute: InstallMicrosoftVisualC++RedistributableVersion: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-microsoft-visual-c-redistribut......
  • dotnet的Runtime和SDK的版本号差异
    摘要上周微软发布了NET9正式版本,我用官网介绍的方式为GitlabRunner制作包含NET9环境的映像,才发现Runtie和SDK的版本号差别。安装Dotnet的RuntimeDockerfile中语句如下:#使用官方脚本安装.NETSDK版本RUNwget-qO-https://dotnet.microsoft.com/download/dotnet/script......
  • AI豆包-Python SDK接入流程(完整代码)
    在当今的软件开发领域,与各类人工智能模型进行交互以获取智能回复是一项常见且重要的任务。本文将聚焦于一个名为 doubao 的Python函数,详细剖析它是如何与特定的人工智能模型进行连接并获取回复的,为大家揭示其背后的技术细节。Python实现AI豆包智能回复微信运行结果:第......
  • 服务器时间不对导致.NET SDK连接Minio失败
    这两天想弄个简单的文件系统来做测试,选中了Minio,公司的测试环境是windowsserver2019,随手搜起一篇教程(MinIO注册成服务在后台运行(Win10)_miniowindows注册成服务在后台运行-CSDN博客),按图索骥,一顿操作猛如虎,使用“WinSW”加入系统服务。打开网页一看,好使。再用.NETSDK(最新6.0......
  • 腾讯直播SDK接入及封装(一)之录屏直播
    1.省略集成SDK环节,具体的集成以官方为主,这里只是快速接入的参考;2.获取系统相机、麦克风、屏幕录制等的权限,这里以麦克风为例:funccheckMicroPermission()->Bool{letauthStatus=AVCaptureDevice.authorizationStatus(for:.audio)switch(authStatus){cas......
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit
    1.问题描述:使用系统分享组件分享本地文件,点击分享菜单下方的“另存为”将要分享的文件分享至系统文件管理中,在文件管理中查看分享进来的文件为0B。尝试了3种uri的写法都不行,代码如下:consturi=getContext().getApplicationContext().filesDir+'/xxx.json'consturi1='fi......
  • 【Azure App Service】在App Service中调用Stroage SDK上传文件时遇见 System.OutOfMe
    问题描述部署.NET应用到AppService中,应用中调用StorageAccount的SDK上传文件到Blob中。只是比较高频率在UploadAsync方法中遇见:OutOfMemoryException异常信息ERRORMicrosoft.AspNetCore.Server.Kestrel.?[?]-MESSAGE:Connectionid"0HN3UB91BK6BS",Requestid"0H......
  • pico-sdk(零)
    pico-sdk(零)项目概述license相关文档依赖三方库链接项目概述RaspberryPiPicoSDK(以下简称SDK)提供了为RP系列微控制器设备(如RaspberryPiPico或RaspberryPiPico2)编写C、C++或汇编语言程序所需的头文件、库和构建系统。SDK旨在为非嵌入式C开发人员和......
  • VMR 实战指南:一站式管理多语言SDK
    1.引言在现代软件开发中,我们经常需要同时使用多种编程语言和工具。管理这些不同语言的SDK版本可能会成为一个令人头疼的问题。VMR(VersionManager)提供了一个统一的界面来管理多种编程语言的SDK,简化了开发环境管理。本文将深入探讨VMR的安装、配置和使用。2.VMR简介......
  • 国标GB28181摄像机接入LiteGBS国标GB28181设备端接入SDK直播平台的应用场景介绍
    LiteGBS国标GB28181网页直播平台视频能力丰富,部署灵活,既能作为业务平台使用,也能作为安防监控视频能力层被业务管理平台调用。国标GB28181视频LiteGBS国标GB28181软件平台可提供流媒体接入、处理、转发等服务,支持内网、公网的安防视频监控设备通过国标GB28181协议进行视频监控直播......