当前位置: 首页 > news >正文

在公司的一些笔记

6.19

  1. 记住挂载在windows上的账户是DAHUATECH\401593,不是401593
  2. Windows与linux不能同时挂载在虚拟盘上

6.21

/*******************************************************************************
pdc_ledSy7806e.c*
* Description: 提供I2C访问sy7806e。
*
*       1.  硬件说明。
*
*       2.  程序结构说明。
*
*       3.  使用说明。
*
*       4.  局限性说明。
*           ……
*       5.  其他说明。
*            ……
*
* Modification:
*    Date    : 2023-12-11
*    Revision:
*    Author  :
*    Contents:
*******************************************************************************//* ========================================================================== */
/*                              头文件区                                      */
/* ========================================================================== */#include "osa.h"
#include "prc.h"
#include "pdc.h"
#include "pdc_priv.h"
#include "pdc_ledI2cpriv.h"
#include "pdc_ledSy7806e.h"static Uint32 value_1 = 0x0;
/* ========================================================================== */
/*                          函数声明区                                        */
/* ========================================================================== *//* ========================================================================== */
/*                          全局变量定义区                                    */
/* ========================================================================== *//* Pca9534控制结构体 */
typedef struct
{OSA_MutexHandle     hLock;
} Sy7806e_Obj;Int32 LED_sy7806eI2cRead(PRC_I2cDevHandle hI2cDev, Uint32 addr, Uint32 *value)
{PRC_I2cXferParams xferParams[2];Uint8 txbuf[1];Uint8 rxbuf[1];txbuf[0] = addr;if (NULL == value){return OSA_EFAIL;}xferParams[0].pBuffer  = txbuf;xferParams[0].bufLen   = 1;xferParams[0].flags    = 0;xferParams[0].dataBits = 8;xferParams[0].timeout  = 1000;xferParams[1].pBuffer  = rxbuf;xferParams[1].bufLen   = 1;xferParams[1].flags    = PRC_I2C_RD;xferParams[1].dataBits = 8;xferParams[1].timeout  = 1000;if (OSA_isNull(hI2cDev)){   OSA_DEBUG("SY7806E_READ hi2cDev is NULL\n");return OSA_EFAIL;}if (PRC_i2cTransfer(hI2cDev, xferParams, 2) < 0){OSA_ERROR("Fail to read\n");return OSA_EFAIL;}else{OSA_memCpySize(value, rxbuf, sizeof(rxbuf));}return OSA_SOK;
}Int32 LED_sy7806eI2cWrite(PRC_I2cDevHandle hI2cDev, Uint32 addr, Uint32 value)
{PRC_I2cXferParams xferParams;Uint8 txbuf[2];txbuf[0] = addr;txbuf[1] = value;xferParams.pBuffer  = txbuf;xferParams.bufLen   = 2;xferParams.flags    = 0;xferParams.dataBits = 8;xferParams.timeout  = 1000;if (PRC_i2cTransfer(hI2cDev, &xferParams, 1) < 0){OSA_ERROR("Fail to write\n");return OSA_EFAIL;}return OSA_SOK;
}
/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cInit
*  描  述   : 初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/Int32 LED_sy7806eI2cInit(PRC_I2cDevHandle hI2cDev)
{Int32 status = 0;if(!hI2cDev){OSA_ERROR("LED_sy7806eI2cInit error, hI2cDev is null\n");return OSA_EFAIL;}value_1 = 0xa0;return OSA_SOK;}/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cInit
*  描  述   : 初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/
Int32 LED_sy7806eI2cSetState(PRC_I2cDevHandle hI2cDev, PDC_LedSetParams *pLedParams)
{static Int32 tempcode = 0;//一次初始化
/*出现连续两条相同命令时不需要进行操作,tempcode不需要更新*/if (pLedParams->code == tempcode){return OSA_SOK;}#define ILL_SUM 168Int32 status = 0;Int32 pValue = 0;if((!hI2cDev) || (!pLedParams)){OSA_ERROR("LED_sy7806eI2cSetState error, hI2cDev or pLedParams is null\n");}// LED_sy7806eI2cRead(hI2cDev, 0x4, &pValue);//中间态过渡,不能直接设置灯的模式不然灯反应过慢pValue = pValue & ~(0x3 << 2);//2.3.0pValue = pValue | (0x2 << 2);//3.1pValue = pValue & ~(0x1 << 5);//5.0pValue = pValue | (0x0 << 5);//4.0pValue &= !0x3;  //   0.1.0LED_sy7806eI2cWrite(hI2cDev, 0x1, pValue); //使能寄存器/*频闪使用IR模式*/if(pLedParams->state == LED_STATE_ON) //常亮的预设值{value_1 = value_1 & ~(0x3 << 2);//2.3 0value_1 = value_1 | (0x2 << 2);//3 1value_1 = value_1 & ~(0x1 << 5);//5 0value_1 = value_1 | (0x0 << 5);}else if(pLedParams->state == LED_STATE_FLASH)//频闪预设置{value_1 = value_1 & ~(0x3 << 2); // IR modevalue_1 = value_1 | (0x1 << 2); //2 1  ???value_1 = value_1 & ~(0x1 << 5);// 5 0value_1 = value_1 | (0x1 << 5);//5 1}switch (pLedParams->code)//亮度的设置{case LED_White_left_I2C:case LED_Red_left_I2C:if(!pLedParams->illuminance || LED_STATE_OFF == pLedParams->state)//亮度为0,灯状态为0{value_1 = value_1 & ~(0x1 << 0);//关LED1}else//灯亮{value_1 = value_1 | (0x1 << 0);//开LED1if(LED_STATE_FLASH == pLedParams->state){LED_sy7806eI2cRead(hI2cDev, 0x4, &pValue);//读取LED2频闪值/*频闪的时候LED1+LED2电流不能过大*/if((pValue&0x7f) + (pLedParams->illuminance&0x7f) >= ILL_SUM)  //2000mA / 11.725  - 2 = 168 {pLedParams->illuminance = ILL_SUM - (pValue&0x7f);}LED_sy7806eI2cWrite(hI2cDev, 0x3, pLedParams->illuminance);//LED1 频闪}else if(LED_STATE_ON == pLedParams->state){LED_sy7806eI2cWrite(hI2cDev, 0x5, pLedParams->illuminance);//控制LED1常亮模式的亮度}}break;case LED_White_right_I2C:case LED_Red_right_I2C:if(!pLedParams->illuminance || LED_STATE_OFF == pLedParams->state)//亮度为0或者关灯{value_1 = value_1 & ~(0x1 << 1);//关LED2}else{value_1 = value_1 | (0x1 << 1);//开LED2/*频闪的时候LED1+LED2电流不能过大*/if(LED_STATE_FLASH == pLedParams->state)//控制LED2频闪模式亮度{LED_sy7806eI2cRead(hI2cDev, 0x3, &pValue); //读取LED1频闪的值if((pValue&0x7f) + (pLedParams->illuminance&0x7f) >= ILL_SUM)  //2000ms / 11.725  - 2 = 168 {pLedParams->illuminance = ILL_SUM - (pValue&0x7f);}LED_sy7806eI2cWrite(hI2cDev, 0x4, pLedParams->illuminance);}else if(LED_STATE_ON == pLedParams->state)//控制LED2常亮模式亮度{LED_sy7806eI2cWrite(hI2cDev, 0x6, pLedParams->illuminance);}}break;default:break;};LED_sy7806eI2cWrite(hI2cDev, 0x1, value_1);  //模式的设置tempcode = pLedParams->code ;//存放上一条执行过的命令,tempcode更新return OSA_SOK;}
/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cDeinit
*  描  述   : 反初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/
Int32 LED_sy7806eI2cDeInit(PRC_I2cDevHandle hI2cDev)
{LED_sy7806eI2cWrite(hI2cDev, 0x1, 0x80);return OSA_SOK;
}

6.21 

1、打包

2、环境的

3、设置输出

set light 命令

set light 0 2 100        id:模式 (0:关 1亮  2:频闪) 亮度


测试流程

1、先将代码写好,记得写打印

2、编译,编译后生成ko文件,在目录Z:\xzj\PDC\Trunk\bin\ambacv28


3、打包
将生成的文件移动到  Z:\xzj\Pack_cv28\Images\user_cv28\lib\modules
另外还缺少库文件 可以看图片中的日期,除了pdc.ko外还有很多文件
使用打包命令,会在打包程序中生成图片中的文件包

4、使用tftp传输bin文件到相机中
看图片中的设置

使用一个网卡连接到相机,将网卡的ip设置成192.168.100

使用tftp将打包后的镜像文件传输到相机中
5、使用命令set 对相机进行操作


 

/*******************************************************************************
pdc_ledSy7806e.c*
* Description: 提供I2C访问sy7806e。
*
*       1.  硬件说明。
*
*       2.  程序结构说明。
*
*       3.  使用说明。
*
*       4.  局限性说明。
*           ……
*       5.  其他说明。
*            ……
*
* Modification:
*    Date    : 2023-12-11
*    Revision:
*    Author  :
*    Contents:
*******************************************************************************//* ========================================================================== */
/*                              头文件区                                      */
/* ========================================================================== */#include "osa.h"
#include "prc.h"
#include "pdc.h"
#include "pdc_priv.h"
#include "pdc_ledI2cpriv.h"
#include "pdc_ledSy7806e.h"static Uint32 value_1 = 0x0;
/* ========================================================================== */
/*                          函数声明区                                        */
/* ========================================================================== *//* ========================================================================== */
/*                          全局变量定义区                                    */
/* ========================================================================== *//* Pca9534控制结构体 */
typedef struct
{OSA_MutexHandle     hLock;
} Sy7806e_Obj;Int32 LED_sy7806eI2cRead(PRC_I2cDevHandle hI2cDev, Uint32 addr, Uint32 *value)
{PRC_I2cXferParams xferParams[2];Uint8 txbuf[1];Uint8 rxbuf[1];txbuf[0] = addr;if (NULL == value){return OSA_EFAIL;}xferParams[0].pBuffer  = txbuf;xferParams[0].bufLen   = 1;xferParams[0].flags    = 0;xferParams[0].dataBits = 8;xferParams[0].timeout  = 1000;xferParams[1].pBuffer  = rxbuf;xferParams[1].bufLen   = 1;xferParams[1].flags    = PRC_I2C_RD;xferParams[1].dataBits = 8;xferParams[1].timeout  = 1000;if (OSA_isNull(hI2cDev)){   OSA_DEBUG("SY7806E_READ hi2cDev is NULL\n");return OSA_EFAIL;}if (PRC_i2cTransfer(hI2cDev, xferParams, 2) < 0){OSA_ERROR("Fail to read\n");return OSA_EFAIL;}else{OSA_memCpySize(value, rxbuf, sizeof(rxbuf));}return OSA_SOK;
}Int32 LED_sy7806eI2cWrite(PRC_I2cDevHandle hI2cDev, Uint32 addr, Uint32 value)
{PRC_I2cXferParams xferParams;Uint8 txbuf[2];txbuf[0] = addr;txbuf[1] = value;xferParams.pBuffer  = txbuf;xferParams.bufLen   = 2;xferParams.flags    = 0;xferParams.dataBits = 8;xferParams.timeout  = 1000;if (PRC_i2cTransfer(hI2cDev, &xferParams, 1) < 0){OSA_ERROR("Fail to write\n");return OSA_EFAIL;}return OSA_SOK;
}
/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cInit
*  描  述   : 初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/Int32 LED_sy7806eI2cInit(PRC_I2cDevHandle hI2cDev)
{Int32 status = 0;if(!hI2cDev){OSA_ERROR("LED_sy7806eI2cInit error, hI2cDev is null\n");return OSA_EFAIL;}value_1 = 0xa0;return OSA_SOK;}/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cInit
*  描  述   : 初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/
Int32 LED_sy7806eI2cSetState(PRC_I2cDevHandle hI2cDev, PDC_LedSetParams *pLedParams)
{static Int32 tempcode = 0;//一次初始化
/*出现连续两条相同命令时不需要进行操作,tempcode不需要更新*/if (pLedParams->code == tempcode){return OSA_SOK;}#define ILL_SUM 168Int32 status = 0;Int32 pValue = 0;if((!hI2cDev) || (!pLedParams)){OSA_ERROR("LED_sy7806eI2cSetState error, hI2cDev or pLedParams is null\n");}// LED_sy7806eI2cRead(hI2cDev, 0x4, &pValue);//中间态过渡,不能直接设置灯的模式不然灯反应过慢pValue = pValue & ~(0x3 << 2);//2.3.0pValue = pValue | (0x2 << 2);//3.1pValue = pValue & ~(0x1 << 5);//5.0pValue = pValue | (0x0 << 5);//4.0pValue &= !0x3;  //   0.1.0LED_sy7806eI2cWrite(hI2cDev, 0x1, pValue); //使能寄存器/*频闪使用IR模式*/if(pLedParams->state == LED_STATE_ON) //常亮的预设值{value_1 = value_1 & ~(0x3 << 2);//2.3 0value_1 = value_1 | (0x2 << 2);//3 1value_1 = value_1 & ~(0x1 << 5);//5 0value_1 = value_1 | (0x0 << 5);}else if(pLedParams->state == LED_STATE_FLASH)//频闪预设置{value_1 = value_1 & ~(0x3 << 2); // IR modevalue_1 = value_1 | (0x1 << 2); //2 1  ???value_1 = value_1 & ~(0x1 << 5);// 5 0value_1 = value_1 | (0x1 << 5);//5 1}switch (pLedParams->code)//模式设置{case LED_White_left_I2C:case LED_Red_left_I2C:if(!pLedParams->illuminance || LED_STATE_OFF == pLedParams->state)//亮度为0,灯状态为0{value_1 = value_1 & ~(0x1 << 0);//关LED1}else//灯亮{value_1 = value_1 | (0x1 << 0);//开LED1if(LED_STATE_FLASH == pLedParams->state){LED_sy7806eI2cRead(hI2cDev, 0x4, &pValue);//读取LED2频闪值/*频闪的时候LED1+LED2电流不能过大*/if((pValue&0x7f) + (pLedParams->illuminance&0x7f) >= ILL_SUM)  //2000mA / 11.725  - 2 = 168 {pLedParams->illuminance = ILL_SUM - (pValue&0x7f);}LED_sy7806eI2cWrite(hI2cDev, 0x3, pLedParams->illuminance);//LED1 频闪}else if(LED_STATE_ON == pLedParams->state){LED_sy7806eI2cWrite(hI2cDev, 0x5, pLedParams->illuminance);//控制LED1常亮模式的亮度}}break;case LED_White_right_I2C:case LED_Red_right_I2C:if(!pLedParams->illuminance || LED_STATE_OFF == pLedParams->state)//亮度为0或者关灯{value_1 = value_1 & ~(0x1 << 1);//关LED2}else{value_1 = value_1 | (0x1 << 1);//开LED2/*频闪的时候LED1+LED2电流不能过大*/if(LED_STATE_FLASH == pLedParams->state)//控制LED2频闪模式亮度{LED_sy7806eI2cRead(hI2cDev, 0x3, &pValue); //读取LED1频闪的值if((pValue&0x7f) + (pLedParams->illuminance&0x7f) >= ILL_SUM)  //2000ms / 11.725  - 2 = 168 {pLedParams->illuminance = ILL_SUM - (pValue&0x7f);}LED_sy7806eI2cWrite(hI2cDev, 0x4, pLedParams->illuminance);}else if(LED_STATE_ON == pLedParams->state)//控制LED2常亮模式亮度{LED_sy7806eI2cWrite(hI2cDev, 0x6, pLedParams->illuminance);}}break;default:break;};LED_sy7806eI2cWrite(hI2cDev, 0x1, value_1);tempcode = pLedParams->code ;//存放上一条执行过的命令,tempcode更新return OSA_SOK;}
/*******************************************************************************
*  函数名   : CE_MCUI2C_i2cDeinit
*  描  述   : 反初始化I2C通讯
*  输  入   : -pstObj  :   MCUI2C_ObjModule对象
*  输  出   : 无。
*  返回值   : OSA_SOK   :   成功OSA_EFAIL :   失败
*******************************************************************************/
Int32 LED_sy7806eI2cDeInit(PRC_I2cDevHandle hI2cDev)
{LED_sy7806eI2cWrite(hI2cDev, 0x1, 0x80);return OSA_SOK;
}
/*******************************************************************************
* pdc_led.c
*
* Copyright (C) 2011-2013 ZheJiang Dahua Technology CO.,LTD.
*
* Author : Huang Zhendi <huang_zhendi@dahuatech.com>
*          Yang Zhiqiang <yang_zhiqiang@dahuatech.com>
* Version: V1.0.0  2012-05-21 Create
*
* Description: 提供设备中LED控制功能
*       1.  硬件说明。
*           提供LED控制功能
*
*       2.  程序结构说明。
*           通过字符设备PDC_MISC_NAME的ioctl命令与应用通信。
*
*       3.  使用说明。
*           应用字符设备PDC_MISC_NAME的ioctl命令读写告警。
*
*       4.  局限性说明。
*           ……
*       5.  其他说明。
*            ……
* Modification:
*    Date    : 2012.10.26
*    Revision:
*    Author  : huang_zhendi
*    Contents:
*******************************************************************************//* ========================================================================== */
/*                              头文件区                                      */
/* ========================================================================== */#include "osa.h"
#include "prc.h"
#include "pdc_priv.h"/* ========================================================================== */
/*                           宏和类型定义区                                   */
/* ========================================================================== */#define LED_TURN_CYCLES  100    /* LED灯状态查询周期,单位是毫秒。*//* ========================================================================== */
/*                          数据结构定义区                                    */
/* ========================================================================== */typedef struct
{Uint16 turnType;        /* LED灯亮灯模式: 0-不闪烁 1-闪烁 *//* 以下参数在LED为闪烁时有效 *//* 记录LED灯亮灯时的状态,双色灯,1-绿色,2-黄色,3-红色; 单色灯: 1*/Uint16 state;Uint16 currState;       /* LED灯当前状态 0-灭 1-亮 */Uint16 reserved;Uint32 turnOnTime;      /* 闪烁时的亮灯时间 */Uint32 turnOffTime;     /* 闪烁时的灭灯时间 */Uint32 remainTime;      /* 闪灯剩余时间 */
} LED_State;/* LED控制结构体 */
typedef struct
{Uint32              ledCfgNum;   /* LED灯配置个数 */PDC_LedCfg         *pLedCfg;     /* 指向LED灯控制配置。*/LED_State          *pLedState;   /* 保存定时器状态数组 */OSA_ThrHandle       hLedCheckThr;         /* LED灯亮灭查询控制线程句柄 */OSA_MutexHandle     hLedMutex;   /* 保护Led灯信息MISC_GpioInfo->pLedCfg */Uint32              flashLightNum;PRC_PwmHandle       hPwm[PDC_PWM_MAX];PRC_PwmInitParams   initParams[PDC_PWM_MAX];PRC_DacInitParams   initParams_dac[PDC_DAC_MAX];PRC_I2cDevInitParams initParams_i2c[PDC_I2C_MAX];PRC_I2cDevHandle    hI2c[PDC_I2C_MAX];I2C_LED_CbParams    cbParams[PDC_I2C_MAX];/* 当该标志置1,标志LED已经被强制全部灭掉。 */Uint32              closeAll;
} LED_Obj;/* ========================================================================== */
/*                          函数申明区                                        */
/* ========================================================================== *//* ========================================================================== */
/*                          全局变量定义区                                    */
/* ========================================================================== *//* LED控制结构体 */
static LED_Obj gLedObj;/* ========================================================================== */
/*                          函数定义区                                        */
/* ========================================================================== *//*******************************************************************************
*  函数名   : LED_set
*  描  述   : 设置LED状态
*  输  入   : pLeds: LED灯控制结构体
*             state: 单色灯: 0-关闭, 1-点亮
*                    双色灯: 0-关闭,1-绿色,2-黄色,3-红色
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static void LED_set(PDC_LedCfg *pLeds, Uint32 state)
{if (pLeds->ledSetWay >= PDC_LED_SET_WAY_NR){OSA_ERROR("can not support this led set way!\n");return ;}/* 两个管脚均有效,则为双色灯。*/if (pLeds->gpioCfg2 != PDC_CFG_GPIO_INVA){switch (state){case 0:if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 1);PRC_gpioSetLevel(pLeds->gpioCfg2, 1);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 0);PRC_gpioSetLevel(pLeds->gpioCfg2, 0);}break;case 1:if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 1);PRC_gpioSetLevel(pLeds->gpioCfg2, 0);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 0);PRC_gpioSetLevel(pLeds->gpioCfg2, 1);}break;case 2:if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 0);PRC_gpioSetLevel(pLeds->gpioCfg2, 0);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 1);PRC_gpioSetLevel(pLeds->gpioCfg2, 1);}break;case 3:if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 0);PRC_gpioSetLevel(pLeds->gpioCfg2, 1);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 1);PRC_gpioSetLevel(pLeds->gpioCfg2, 0);}break;default:OSA_ERROR("Invalid LED state\n");break;}}else{OSA_DEBUG("LED:gpioCfg:%d ,gpioCfg1:%d \n" ,pLeds->gpioCfg1, !state);switch (state){case 0:  // 关if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 1);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 0);}break;case 1: // 开if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 0);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 1);}break;case 2: // 频闪,直接走turnOn模式break;case 3: // 闪一次if (pLeds->level == 1){PRC_gpioSetLevel(pLeds->gpioCfg1, 0);OSA_msleep(20);PRC_gpioSetLevel(pLeds->gpioCfg1, 1);}else{PRC_gpioSetLevel(pLeds->gpioCfg1, 1);OSA_msleep(20);PRC_gpioSetLevel(pLeds->gpioCfg1, 0);}break;default:OSA_ERROR("Invalid LED state\n");break;}}
}/*******************************************************************************
*  函数名   : LED_flashLightCreate
*  描  述   : 创建并初始化闪光灯的PWM控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_flashLightCreate(void)
{Int32               status;PDC_smartIrCfg      *pSmartIrCfg = NULL;LED_Obj             *pLedObj = &gLedObj;/* 获取SmartIR配置 */status = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);if ( OSA_isFail(status) ){OSA_WARN("Get smartIr cfg failed!\n");return  OSA_EFAIL;}pLedObj->flashLightNum = 0;while ((pSmartIrCfg->smartIrType <= PDC_SMARTIR_NR) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_SOCPWM)){if (PDC_IROWNER_SMARTIR == pSmartIrCfg->lightOwner){pSmartIrCfg++;continue;}/* 将读取的配置写入缓存 */pLedObj->initParams[pLedObj->flashLightNum].pwmId = pSmartIrCfg->typeCfg.socPwmCfg.pwmParms.pwmId;pLedObj->initParams[pLedObj->flashLightNum].mode  = pSmartIrCfg->typeCfg.socPwmCfg.pwmParms.mode;pLedObj->initParams[pLedObj->flashLightNum].activeLevel= pSmartIrCfg->typeCfg.socPwmCfg.pwmParms.activeLevel;/*第一次引用时创建并使能PWM功能 */status = PRC_pwmCreate(&pLedObj->initParams[pLedObj->flashLightNum], &pLedObj->hPwm[pLedObj->flashLightNum]);if (OSA_isFail(status)){OSA_ERROR("Fail to init PWM%d\n", pLedObj->initParams[pLedObj->flashLightNum].pwmId);return  OSA_EFAIL;}status = PRC_pwmDisable(pLedObj->hPwm[pLedObj->flashLightNum]);if(OSA_isFail(status) ){OSA_ERROR("Fail to disable PWM%d.\n", pLedObj->initParams[pLedObj->flashLightNum].pwmId);return  OSA_EFAIL;}OSA_INFOCYAN("flashLight init pwmId: %d,mode: %d,activeLevel: %d\n",pLedObj->initParams[pLedObj->flashLightNum].pwmId,pLedObj->initParams[pLedObj->flashLightNum].mode,pLedObj->initParams[pLedObj->flashLightNum].activeLevel);pLedObj->flashLightNum++;pSmartIrCfg++;}return  OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_DacLightCreate
*  描  述   : 创建并初始化闪光灯的PWM控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_DacLightCreate(void)
{Int32               status;PDC_smartIrCfg      *pSmartIrCfg = NULL;LED_Obj             *pLedObj = &gLedObj;PDC_dacParams pData;/* 获取SmartIR配置 */status = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);if ( OSA_isFail(status) ){OSA_WARN("Get smartIr cfg failed!\n");return  OSA_EFAIL;}pLedObj->flashLightNum = 0;while (pSmartIrCfg->smartIrType < PDC_SMARTIR_NR){if (PDC_IROWNER_SMARTIR == pSmartIrCfg->lightOwner){pSmartIrCfg++;continue;}// 将读取的配置写入缓存pLedObj->initParams_dac[pLedObj->flashLightNum].chipId = pSmartIrCfg->typeCfg.dacIrCfg.chipId;pLedObj->initParams_dac[pLedObj->flashLightNum].channel  = pSmartIrCfg->typeCfg.dacIrCfg.channel;pLedObj->initParams_dac[pLedObj->flashLightNum].value= pSmartIrCfg->typeCfg.dacIrCfg.activeLevel;pData.chn=pLedObj->initParams_dac[pLedObj->flashLightNum].channel;pData.data=0;//status = PDC_dacOutput(pLedObj->initParams_dac[pLedObj->flashLightNum].chipId,&pData);OSA_INFOCYAN("DacLight init chipId: %d,channel: %d,activeLevel: %d\n",pLedObj->initParams_dac[pLedObj->flashLightNum].chipId,pLedObj->initParams_dac[pLedObj->flashLightNum].channel,pLedObj->initParams_dac[pLedObj->flashLightNum].value);pLedObj->flashLightNum++;pSmartIrCfg++;}return  OSA_SOK;
}Int32 PDC_i2cDevRegister(Uint32 ledDevId, I2C_LED_CbParams *pParams)
{OSA_INFO("PDC_i2cDevRegister: ledDevId = %d\n", ledDevId);if (OSA_isNull(pParams)){OSA_ERROR("Null cfg params!\n");return OSA_EFAIL;}switch (ledDevId){case PDC_SY7806E:pParams->LED_i2cInit   = LED_sy7806eI2cInit;pParams->LED_i2cSetState   = LED_sy7806eI2cSetState;pParams->LED_i2cDeInit = LED_sy7806eI2cDeInit;OSA_INFO("LED device is SY7806E\n");break;default:OSA_ERROR("No suitable LED device, ledDevId=%d\n", ledDevId);return OSA_EFAIL;}return OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_I2cLightCreate
*  描  述   : 创建并初始化闪光灯的I2C控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_I2cLightCreate(void)
{Int32               status;PDC_smartIrCfg      *pSmartIrCfg = NULL;LED_Obj             *pLedObj = &gLedObj;PRC_I2cDevInitParams *i2cInitParams;PRC_I2cDevHandle    *phI2c;PRC_GpioParams      param;/* 获取SmartIR配置 */status = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);if ( OSA_isFail(status) ){OSA_WARN("Get smartIr cfg failed!\n");return  OSA_EFAIL;}pLedObj->flashLightNum = 0;while (pSmartIrCfg->smartIrType < PDC_SMARTIR_NR){if (PDC_IROWNER_SMARTIR == pSmartIrCfg->lightOwner){pSmartIrCfg++;continue;}// 将读取的配置写入缓存pLedObj->initParams_i2c[pLedObj->flashLightNum].busId = pSmartIrCfg->typeCfg.i2cIrCfg.busId;pLedObj->initParams_i2c[pLedObj->flashLightNum].opMode  = pSmartIrCfg->typeCfg.i2cIrCfg.opMode;pLedObj->initParams_i2c[pLedObj->flashLightNum].address= pSmartIrCfg->typeCfg.i2cIrCfg.address;i2cInitParams = &pLedObj->initParams_i2c[pLedObj->flashLightNum];phI2c = &pLedObj->hI2c[pLedObj->flashLightNum];if (PRC_i2cDevCreate(i2cInitParams, phI2c) < 0){OSA_ERROR("Fail to init I2C%d Device%d\n", i2cInitParams->busId, i2cInitParams->address);return OSA_EFAIL;}OSA_memSet(&param, 0, sizeof(PRC_GpioParams));param.dir = PRC_GPIO_DIR_OUT;param.mode = PDC_cfgGetGpioMode(pSmartIrCfg->typeCfg.i2cIrCfg.engpio);PRC_gpioGetPin(pSmartIrCfg->typeCfg.i2cIrCfg.engpio, &param);PRC_gpioSetLevel(pSmartIrCfg->typeCfg.i2cIrCfg.engpio, pSmartIrCfg->typeCfg.i2cIrCfg.enlevel);OSA_INFOCYAN("I2cLight init busId: %d,opMode: %d,address: 0x%x\n",pLedObj->initParams_i2c[pLedObj->flashLightNum].busId,pLedObj->initParams_i2c[pLedObj->flashLightNum].opMode,pLedObj->initParams_i2c[pLedObj->flashLightNum].address);status = PDC_i2cDevRegister(pSmartIrCfg->typeCfg.i2cIrCfg.address, &pLedObj->cbParams[pLedObj->flashLightNum]);if(status == OSA_SOK){if(pLedObj->cbParams[pLedObj->flashLightNum].LED_i2cInit)pLedObj->cbParams[pLedObj->flashLightNum].LED_i2cInit(*phI2c);elsereturn OSA_EFAIL;}else{PRC_i2cDevDelete(*phI2c);OSA_ERROR("Fail to regist Device 0x%x\n", pSmartIrCfg->typeCfg.i2cIrCfg.address);return OSA_EFAIL;}pLedObj->flashLightNum++;pSmartIrCfg++;}return  OSA_SOK;}/*******************************************************************************
*  函数名   : LED_flashLightRelease
*  描  述   : 释放闪光灯的PWM控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_flashLightRelease(void)
{Int32       status = OSA_SOK;LED_Obj     *pLedObj = &gLedObj;Uint32      i;for (i = 0; i < pLedObj->flashLightNum; i++){/*最后一次引用删除时,disable掉PWM接口,并删除PWM控制器*/status = PRC_pwmDisable(pLedObj->hPwm[i]);if( OSA_isFail(status) ){OSA_ERROR("Fail to disable PWM%d.\n",pLedObj->initParams[i].pwmId);return  OSA_SOK;}status = PRC_pwmDelete(pLedObj->hPwm[i]);if( OSA_isFail(status) ){OSA_ERROR("Fail to delete PWM%d !\n",pLedObj->initParams[i].pwmId);return  OSA_EFAIL;}}return  OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_DacLightRelease
*  描  述   : 释放闪光灯的PWM控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_DacLightRelease(void)
{Int32       status = OSA_SOK;LED_Obj     *pLedObj = &gLedObj;Uint32      i;PDC_dacParams pData;for (i = 0; i < pLedObj->flashLightNum; i++){pData.chn=pLedObj->initParams_dac[pLedObj->flashLightNum].channel;pData.data=0;status = PDC_dacOutput(pLedObj->initParams_dac[pLedObj->flashLightNum].chipId,&pData);OSA_INFOCYAN("DacLight init chipId: %d,mode: %d,activeLevel: %d\n",pLedObj->initParams_dac[pLedObj->flashLightNum].chipId,pLedObj->initParams_dac[pLedObj->flashLightNum].channel,pLedObj->initParams_dac[pLedObj->flashLightNum].value);}return  OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_I2cLightRelease
*  描  述   : 释放闪光灯的I2C控制设备
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_I2cLightRelease(void)
{Int32       status = OSA_SOK;LED_Obj     *pLedObj = &gLedObj;Uint32      i;PRC_I2cDevHandle    *phI2c;for (i = 0; i < pLedObj->flashLightNum; i++){phI2c = &pLedObj->hI2c[pLedObj->flashLightNum];if(pLedObj->cbParams[pLedObj->flashLightNum].LED_i2cDeInit)pLedObj->cbParams[pLedObj->flashLightNum].LED_i2cDeInit(*phI2c);PRC_i2cDevDelete(*phI2c);OSA_INFOCYAN("DacLight init chipId: %d,mode: %d,activeLevel: %d\n",pLedObj->initParams_dac[pLedObj->flashLightNum].chipId,pLedObj->initParams_dac[pLedObj->flashLightNum].channel,pLedObj->initParams_dac[pLedObj->flashLightNum].value);}return  OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_set
*  描  述   : 设置LED状态
*  输  入   : freq: 频率,详细见prc_pwm.h中相关接口定义
*             dutyRation: 占空比,详细见prc_pwm.h中相关接口定义
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_flashLightSetState(Uint32 id, Uint32 freq, Uint32 dutyRation)
{Int32       status = OSA_SOK;LED_Obj     *pLedObj = &gLedObj;OSA_DEBUG("LED_flashLightSetState id %d, freq %d, dutyRation %d\n", id, freq, dutyRation);if(pLedObj->initParams[id].activeLevel == 0){dutyRation = 10000 - dutyRation;}if (0 == freq){freq = 10000;}status = PRC_pwmDisable(pLedObj->hPwm[id]);if(OSA_isFail(status) ){OSA_ERROR("Fail to disable PWM%d.\n", pLedObj->initParams[id].pwmId);return OSA_EFAIL;}status = PRC_pwmSetFreq(pLedObj->hPwm[id], freq);if (OSA_isFail(status)){OSA_ERROR("Fail to set PWM%d ,freq%d\n", pLedObj->initParams[id].pwmId,freq);return OSA_EFAIL;}status = PRC_pwmSetDutyRation(pLedObj->hPwm[id], dutyRation);if (OSA_isFail(status)){OSA_ERROR("Fail to set PWM%d, dutyRation%d\n",pLedObj->initParams[id].pwmId,dutyRation);return OSA_EFAIL;}status = PRC_pwmEnable(pLedObj->hPwm[id]);if (OSA_isFail(status)){OSA_ERROR("Fail to Enable PWM%d\n", pLedObj->initParams[id].pwmId);return OSA_EFAIL;}return OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_ledCheckThead
*  描  述   : LED闪烁检查线程
*  输  入   : pUserArgs: 定时器创建时传入的用户参数
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_ledCheckThead(Ptr pUserArgs)
{Uint32      i;LED_Obj     *pLedObj;PDC_LedCfg  *pLedCfgs;LED_State   *pLedState;Uint32      dutyRation = 0;Uint32      dutydiff = 0;pLedObj   = (LED_Obj *)pUserArgs;PDC_smartIrCfg      *pSmartIrCfg = NULL;Int32               status;/* 非SOCpwm模式不启动线程 */status = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);if ( OSA_isSuccess(status) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_DAC88347 || pSmartIrCfg->smartIrType == PDC_SMARTIR_I2C) ){OSA_INFO("Get smartIr cfg is Dac light ,LED_ledCheckThead dirct return!\n");return  OSA_SOK;}while(!OSA_thrShouldStop()){pLedCfgs = pLedObj->pLedCfg;pLedState = pLedObj->pLedState;/* 如果LED有效,并且是闪烁状态 */for (i = 0; i<pLedObj->ledCfgNum; i++){if (pLedObj->closeAll){if ( (pLedCfgs->code > LED_GPIO_TPYE)&& (pLedCfgs->code < LED_PWM_TPYE)) // pwm控制的led{LED_flashLightSetState(pLedCfgs->smartIrIndex, pLedCfgs->frequence, 0);PRC_pwmDisable(pLedObj->hPwm[pLedCfgs->smartIrIndex]);}else{LED_set(pLedCfgs, 0);}}else{if (pLedState->turnType == 1){if (pLedState->currState){if (pLedState->remainTime == 0){pLedState->remainTime = pLedState->turnOffTime;if ( (pLedCfgs->code > LED_GPIO_TPYE)&& (pLedCfgs->code < LED_PWM_TPYE)) // pwm控制的led{LED_flashLightSetState(pLedCfgs->smartIrIndex, pLedCfgs->frequence, 0);PRC_pwmDisable(pLedObj->hPwm[pLedCfgs->smartIrIndex]);}else{LED_set(pLedCfgs, 0);}pLedState->currState = 0;}else{pLedState->remainTime--;}}else{if (pLedState->remainTime == 0){pLedState->remainTime = pLedState->turnOnTime;if ( (pLedCfgs->code > LED_GPIO_TPYE)&& (pLedCfgs->code < LED_PWM_TPYE)) // pwm控制的led{if (pLedState->state >= 100){dutyRation = 10000;}else{dutyRation = pLedState->state * 100;}if(pLedCfgs->highThreshold > pLedCfgs->lowThreshold){dutydiff = pLedCfgs->highThreshold - pLedCfgs->lowThreshold;dutyRation *= dutydiff;dutyRation /= 100;dutyRation += pLedCfgs->lowThreshold * 100;}LED_flashLightSetState(pLedCfgs->smartIrIndex, pLedCfgs->frequence, dutyRation);}else{LED_set(pLedCfgs, pLedState->state);}pLedState->currState = 1;}else{pLedState->remainTime--;}}}}pLedCfgs++;pLedState++;}msleep(100);}return OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_setState
*  描  述   : 设置指定LED灯,目前LED灯低电平有点亮。
*  输  入   : pLedParams: 设置参数。
*  输  出   : 无
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
Int32 LED_setState(PDC_LedSetParams *pLedParams)
{Uint32          i,dutyRation;Int32           status;Uint32          dutydiff = 0;Uint32          ledCtr;LED_Obj         *pLedObj;PDC_LedCfg      *pLedCfgs;LED_State       *pLedState;LED_State       *pBackLedState;PDC_LedCfg      *pBackLedCfgs;Int32            SmartirStatus;PDC_smartIrCfg      *pSmartIrCfg = NULL;//Int32 chipId;PDC_dacParams pData;pLedObj         = &gLedObj;/* 获取SmartIR配置 */SmartirStatus = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);OSA_assertNotNull(pLedParams);if (OSA_isNull(pLedParams)){OSA_ERROR("Input params is null!\n");return OSA_EFAIL;}pLedState = pLedObj->pLedState;pLedCfgs  = pLedObj->pLedCfg;pBackLedState = pLedObj->pLedState;pBackLedCfgs  = pLedObj->pLedCfg;OSA_DEBUG("LED:state:%d code:%d\n",pLedParams->state,pLedParams->code);if (pLedObj->closeAll){return OSA_SOK;}/* code为-1时,认为是要关闭所有的LED灯,在reboot时需要关闭所以LED灯 */ if (pLedParams->code == -1){pLedObj->closeAll = 1;return OSA_SOK;}if (pLedParams->code == LED_All)     /* 对所有灯操作 */{for (i = 0; i < pLedObj->ledCfgNum; i++){LED_set(pLedCfgs, (Uint32)pLedParams->state);pLedState->currState = (Uint32)pLedParams->state;pLedState++;pLedCfgs++;}return OSA_SOK;}/* 如果没有成功获取过配置,则ledCfgNum为0,不会进如循环。*/for (i = 0; i < pLedObj->ledCfgNum; i++){if (pLedCfgs->code == pLedParams->code){break;}pLedState++;pLedCfgs++;}/* 没有找到对应的code。*/if (i == pLedObj->ledCfgNum){// TODO: 由于应用目前无法获知LED灯信息,引脚不存在的情况暂时不做错误处理。OSA_DEBUG("The led 0x%x isn't exist !\n",pLedParams->code);return OSA_SOK;}/* 闪烁方式 */if (pLedParams->offCycle || pLedParams->onCycle){pLedState->turnType = 1;pLedState->state = (Uint16)pLedParams->state;pLedState->turnOnTime = pLedParams->onCycle  / LED_TURN_CYCLES;pLedState->turnOffTime = pLedParams->offCycle / LED_TURN_CYCLES;}else{if ( (pLedCfgs->code > LED_GPIO_TPYE)&& (pLedCfgs->code < LED_PWM_TPYE)) // pwm控制的led{pLedState->turnType = 0;if( OSA_isSuccess(SmartirStatus) && pSmartIrCfg->smartIrType == PDC_SMARTIR_DAC88347){/* 闪光灯亮度可调的设备,在pdc层直接操作pwm*/if (0 == pLedParams->state){/*要关闭pwm 先将占空比设置为百分0 再关闭*/pData.chn=pLedObj->initParams_dac[pLedCfgs->smartIrIndex].channel;pData.data=0;status = PDC_dacOutput(pLedObj->initParams_dac[pLedCfgs->smartIrIndex].chipId,&pData);if (OSA_isFail(status)){OSA_ERROR("Fail to PDC_dacOutput 0! DAC CH:%d.\n",pLedObj->initParams_dac[pLedCfgs->smartIrIndex].channel);return OSA_EFAIL;}}else{/* 比列缩小百分之99,以防应用需要比列 */if (pLedParams->state >= 99){dutyRation = 99;}else{dutyRation = pLedParams->state ;}/*由于并不是占空比为0时才不亮 这里做一下web进度条调节到底层的映射*//*若在配置文件中配置了占空比调节范围 那么进行占空比映射*/if(pLedCfgs->highThreshold > pLedCfgs->lowThreshold){dutydiff = pLedCfgs->highThreshold - pLedCfgs->lowThreshold;dutyRation *= dutydiff;dutyRation /= 100;dutyRation += pLedCfgs->lowThreshold ;}pData.chn=pLedObj->initParams_dac[pLedCfgs->smartIrIndex].channel;pData.data=dutyRation;status = PDC_dacOutput(pLedObj->initParams_dac[pLedCfgs->smartIrIndex].chipId,&pData);if (OSA_isFail(status)){OSA_ERROR("Fail to PDC_dacOutput duty %u! DAC CH:%d.\n",dutyRation, pLedObj->initParams_dac[pLedCfgs->smartIrIndex].channel);return OSA_EFAIL;}return OSA_SOK;}}else{/* 闪光灯亮度可调的设备,在pdc层直接操作pwm*/if (0 == pLedParams->state){/*要关闭pwm 先将占空比设置为百分0 再关闭*/status = LED_flashLightSetState(pLedCfgs->smartIrIndex, pLedCfgs->frequence, 0);if (OSA_isFail(status)){OSA_ERROR("Fail to LED_flashLightSetState duty 0! PWM%d.\n",pLedObj->initParams[pLedCfgs->smartIrIndex].pwmId);return OSA_EFAIL;}status = PRC_pwmDisable(pLedObj->hPwm[pLedCfgs->smartIrIndex]);if (OSA_isFail(status)){OSA_ERROR("Fail to disable PWM%d.\n",pLedObj->initParams[pLedCfgs->smartIrIndex].pwmId);return OSA_EFAIL;}}else{/* 5000 4路全开到95以上会死机 */if (pLedParams->state >= 90){dutyRation = 9000;}else{dutyRation = pLedParams->state * 100;}/*由于并不是占空比为0时才不亮 这里做一下web进度条调节到底层的映射*//*若在配置文件中配置了占空比调节范围 那么进行占空比映射*/if(pLedCfgs->highThreshold > pLedCfgs->lowThreshold){dutydiff = pLedCfgs->highThreshold - pLedCfgs->lowThreshold;dutyRation *= dutydiff;dutyRation /= 100;dutyRation += pLedCfgs->lowThreshold * 100;}else if(pLedCfgs->highThreshold < pLedCfgs->lowThreshold){dutyRation = 9000 - dutyRation;dutydiff = pLedCfgs->lowThreshold - pLedCfgs->highThreshold;dutyRation *= dutydiff;dutyRation /= 100;dutyRation += pLedCfgs->highThreshold * 100;}status = LED_flashLightSetState(pLedCfgs->smartIrIndex, pLedCfgs->frequence, dutyRation);if (OSA_isFail(status)){OSA_ERROR("Fail to LED_flashLightSetState duty %u! PWM%d.\n",dutyRation, pLedObj->initParams[pLedCfgs->smartIrIndex].pwmId);return OSA_EFAIL;}return OSA_SOK;}}}else if ( (pLedCfgs->code > LED_PWM_TPYE)&& (pLedCfgs->code < LED_I2C_TPYE)) // i2c控制的led{PDC_LedSetParams pLedParam;OSA_memCpySize(&pLedParam, pLedParams, sizeof(PDC_LedSetParams));OSA_INFO("code = %d\n", pLedParams->code);OSA_INFO("state = %d\n", pLedParams->state);OSA_INFO("illuminance = %d\n", pLedParams->illuminance);if (pLedParams->illuminance >= 100){dutyRation = 100;}else{dutyRation = pLedParams->illuminance;}/*由于并不是占空比为0时才不亮 这里做一下web进度条调节到底层的映射*//*若在配置文件中配置了占空比调节范围 那么进行占空比映射*/if((0 !=pLedParams->illuminance) && (pLedCfgs->highThreshold > pLedCfgs->lowThreshold)){dutydiff = pLedCfgs->highThreshold - pLedCfgs->lowThreshold;dutyRation *= dutydiff;dutyRation /= 100;dutyRation += pLedCfgs->lowThreshold ;}pLedParam.illuminance = dutyRation;if(pLedObj->hI2c[pLedCfgs->smartIrIndex] && pLedObj->cbParams[pLedCfgs->smartIrIndex].LED_i2cSetState){pLedObj->cbParams[pLedCfgs->smartIrIndex].LED_i2cSetState(pLedObj->hI2c[pLedCfgs->smartIrIndex], &pLedParam);}}     else{pLedState->turnType = 0;for (i = 0; i < pLedObj->ledCfgNum; i++){if ((NULL == pBackLedState) || (NULL == pBackLedCfgs)){OSA_ERROR("pBackLedState or pBackLedCfgs is null!\n");return OSA_EFAIL;}if ((pBackLedCfgs->ledNum == pLedCfgs->ledNum) &&(pBackLedCfgs->code != pLedCfgs->code)){if ((NULL != pBackLedState) && (pBackLedState->turnType == 1)){pLedState->currState = (Uint16)pLedParams->state;return OSA_SOK;}if ((pLedParams->state == 0) &&(NULL != pBackLedState) &&(pBackLedState->currState == 1)){if (pBackLedCfgs->level){LED_set(pBackLedCfgs, pBackLedState->currState);}else{if (0 == pBackLedState->currState){ledCtr = 1;}else{ledCtr = 0;}LED_set(pBackLedCfgs, ledCtr);}pLedState->currState = (Uint16)pLedParams->state;return OSA_SOK;}}pBackLedState++;pBackLedCfgs++;}
#if 0if (pLedCfgs->level){LED_set(pLedCfgs, (Uint32)pLedParams->state);}else{if (0 == pLedParams->state){ledCtr = 1;}else{ledCtr = 0;}LED_set(pLedCfgs, ledCtr);}
#elseLED_set(pLedCfgs, (Uint32)pLedParams->state);
#endifpLedState->currState = (Uint16)pLedParams->state;}}return OSA_SOK;
}/*******************************************************************************
*  函数名   : LED_getPins
*  描  述   : 获取LED模块所属的GPIO引脚
*  输  入   : pLedObj:  LED灯控制结构体
*             pLedCfgs: LED灯配置信息
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_getPins(LED_Obj *pLedObj, PDC_LedCfg *pLedCfgs)
{Int32               status;Int32               SmartirStatus;PDC_LedCfg          *pLedCfgsNew;PRC_GpioParams      param;Uint32              init = 1;PDC_smartIrCfg      *pSmartIrCfg = NULL;/* 获取SmartIR配置 */SmartirStatus = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);/* 申请内存保存配置 */if(pLedObj->ledCfgNum == 0){OSA_ERROR("dev has no led !\n");return OSA_EFAIL;}pLedCfgsNew = OSA_memCalloc(pLedObj->ledCfgNum * sizeof(PDC_LedCfg));if (OSA_isNull(pLedCfgsNew)){OSA_ERROR("Mem alloc failed !\n");return OSA_EFAIL;}pLedObj->pLedCfg = pLedCfgsNew;OSA_clear(&param);param.dir  = PRC_GPIO_DIR_OUT;/* 获取和设置所有的GPIO */while (pLedCfgs->code != LED_INVLIDATE){if( LED_FlashLight == pLedCfgs->code|| (pLedCfgs->code >= LED_White_PWM&& pLedCfgs->code < LED_PWM_TPYE)|| ( (LED_FillInLight == pLedCfgs->code) &&(pLedCfgs->gpioCfg1 == PDC_CFG_GPIO_INVA) &&(pLedCfgs->gpioCfg2 == PDC_CFG_GPIO_INVA))|| ( (LED_InfraredLight == pLedCfgs->code) &&(pLedCfgs->gpioCfg1 == PDC_CFG_GPIO_INVA) &&(pLedCfgs->gpioCfg2 == PDC_CFG_GPIO_INVA))|| (pLedCfgs->code > LED_PWM_TPYE&& pLedCfgs->code < LED_I2C_TPYE)){if (init){if( OSA_isSuccess(SmartirStatus) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_DAC88347) ){status =  LED_DacLightCreate();}else if( OSA_isSuccess(SmartirStatus) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_I2C) ){OSA_INFO("LED_I2cLightCreate\n");status = LED_I2cLightCreate();}/* 有闪光灯的设备,在pdc层直接操作pwm*/else{status =  LED_flashLightCreate();}if (OSA_isFail(status)){return OSA_EFAIL;}init = 0;}pLedCfgsNew->gpioCfg1 = pLedCfgs->gpioCfg1;pLedCfgsNew->gpioCfg2 = pLedCfgs->gpioCfg2;goto next;}/* 转换成GPIO号 */pLedCfgsNew->gpioCfg1= PDC_cfgGetGpioId(pLedCfgs->gpioCfg1);/* 设置LED灯GPIO引脚 */param.mode = PDC_cfgGetGpioMode(pLedCfgs->gpioCfg1);if (pLedCfgs->gpioCfg2 != PDC_CFG_GPIO_INVA){/* 转换成GPIO号 */pLedCfgsNew->gpioCfg2= PDC_cfgGetGpioId(pLedCfgs->gpioCfg2);param.mode = PDC_cfgGetGpioMode(pLedCfgs->gpioCfg2);}else{pLedCfgsNew->gpioCfg2 = PDC_CFG_GPIO_INVA;}if(pLedCfgs->needApply){status = PRC_gpioGetPin(pLedCfgsNew->gpioCfg1, &param);if (OSA_isFail(status)){OSA_ERROR("Get gpio failed %u !\n",pLedCfgsNew->gpioCfg1);goto free_pins;}#if (defined(PLAT_AMBACV2) || defined(PLAT_AMBACV22) || defined(PLAT_AMBACV25) || defined(PLAT_AMBACV28))PRC_gpioSetLevel(pLedCfgsNew->gpioCfg1, 0);
#endifif (pLedCfgs->gpioCfg2 != PDC_CFG_GPIO_INVA){status = PRC_gpioGetPin(pLedCfgsNew->gpioCfg2, &param);if (OSA_isFail(status)){PRC_gpioPutPin(pLedCfgsNew->gpioCfg1);OSA_ERROR("Get gpio %u faild !\n",pLedCfgsNew->gpioCfg2);goto free_pins;}}else   /* 对于单引脚LED灯 上电后点亮 */{if (pLedCfgs->level){PRC_gpioSetLevel(pLedCfgsNew->gpioCfg1, 0);}else{PRC_gpioSetLevel(pLedCfgsNew->gpioCfg1, 1);}if(pLedCfgs->powerOnState) /* 上电后灭掉 */{if (pLedCfgs->level){PRC_gpioSetLevel(pLedCfgsNew->gpioCfg1, 1);}else{PRC_gpioSetLevel(pLedCfgsNew->gpioCfg1, 0);}}}}
next:pLedCfgsNew->code = pLedCfgs->code;pLedCfgsNew->level= pLedCfgs->level;pLedCfgsNew->needApply= pLedCfgs->needApply;pLedCfgsNew->ledNum   = pLedCfgs->ledNum;pLedCfgsNew->ledSetWay = pLedCfgs->ledSetWay;pLedCfgsNew->lowThreshold = pLedCfgs->lowThreshold;pLedCfgsNew->highThreshold = pLedCfgs->highThreshold;pLedCfgsNew->smartIrIndex  = pLedCfgs->smartIrIndex;pLedCfgsNew->frequence  = pLedCfgs->frequence;pLedCfgs++;pLedCfgsNew++;}return OSA_SOK;free_pins:while(pLedCfgsNew != pLedObj->pLedCfg){PRC_gpioPutPin(pLedCfgsNew->gpioCfg1);if (pLedCfgs->gpioCfg2 != PDC_CFG_GPIO_INVA){PRC_gpioPutPin(pLedCfgsNew->gpioCfg2);}}OSA_memFree(pLedObj->pLedCfg);return OSA_EFAIL;
}/*******************************************************************************
*  函数名   : LED_putPins
*  描  述   : 释放LED模块所属的GPIO引脚
*  输  入   : pLedObj:  LED灯控制结构体
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
static Int32 LED_putPins(LED_Obj *pLedObj)
{Uint32          i;Int32           status = OSA_SOK;Int32           SmartirStatus=OSA_SOK;PDC_LedCfg      *pLedCfg;pLedCfg = pLedObj->pLedCfg;PDC_smartIrCfg      *pSmartIrCfg = NULL;/* 获取SmartIR配置 */SmartirStatus = PDC_cfgGet(PDC_MODULE_SMARTIR, (Ptr *)&pSmartIrCfg);for (i = 0; i < pLedObj->ledCfgNum; i++){if( LED_FlashLight == pLedCfg->code ||( (LED_FillInLight == pLedCfg->code) &&(pLedCfg->gpioCfg1 == PDC_CFG_GPIO_INVA) &&(pLedCfg->gpioCfg2 == PDC_CFG_GPIO_INVA))||( (LED_InfraredLight == pLedCfg->code) &&(pLedCfg->gpioCfg1 == PDC_CFG_GPIO_INVA) &&(pLedCfg->gpioCfg2 == PDC_CFG_GPIO_INVA))){if( OSA_isSuccess(SmartirStatus) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_DAC88347) ){LED_DacLightRelease();}else if( OSA_isSuccess(SmartirStatus) && (pSmartIrCfg->smartIrType == PDC_SMARTIR_I2C) ){status = LED_I2cLightRelease();}else{LED_flashLightRelease();}continue;}status |= PRC_gpioPutPin(pLedCfg->gpioCfg1);if (pLedCfg->gpioCfg2 != PDC_CFG_GPIO_INVA){status |= PRC_gpioPutPin(pLedCfg->gpioCfg2);}pLedCfg++;}status |= OSA_memFree(pLedObj->pLedCfg);return status;
}/*******************************************************************************
*  函数名   : PDC_ledInit
*  描  述   : LED模块加载函数
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
Int32 __init PDC_ledInit(void)
{Int32               status;Uint32              count = 0;LED_Obj            *pLedObj = &gLedObj;LED_State          *pLedState;PDC_LedCfg         *pLedCfgs, *pLedCfgsNew;OSA_ThrCreate       ledThread;OSA_ThrHandle      *phThr;MISC_CbParams      *pMiscCbParams = NULL;OSA_INFO("PDC_ledInit\n");PDC_miscGetCbParams(&pMiscCbParams);if (OSA_isNotNull(pMiscCbParams)){pMiscCbParams->OpSetLed = LED_setState;}/* 获取LED配置引脚 */status = PDC_cfgGet(PDC_MODULE_LED,(Ptr *)&pLedCfgs);if (OSA_isFail(status)){OSA_ERROR("Get led cfg failed !\n");return OSA_EFAIL;}pLedCfgsNew = pLedCfgs;/* 创建互斥锁,消除lint用 */status = OSA_mutexCreate(OSA_MUTEX_NORMAL, &pLedObj->hLedMutex);if (OSA_isFail(status)){OSA_ERROR("OSA_mutexCreate failed !\n");return OSA_EFAIL;}/* 统计LED灯个数 */while (pLedCfgsNew->code != LED_INVLIDATE){count++;pLedCfgsNew++;}pLedObj->ledCfgNum = count;status = LED_getPins(pLedObj, pLedCfgs);if (OSA_isFail(status)){OSA_ERROR("Get led pins failed !\n");goto delete_mutex;}/* 申请内存保存配置 */pLedState = OSA_memCalloc(count * sizeof(LED_State));if (OSA_isNull(pLedState)){OSA_ERROR("Mem alloc failed !\n");goto free_pins;}pLedState->turnType = 0;pLedObj->pLedState  = pLedState;/* 启动LED灯亮灯定时器,周期性的设置LED亮状态 */phThr = &pLedObj->hLedCheckThr;OSA_clearSize(&ledThread, sizeof(OSA_ThrCreate));ledThread.OpThrRun =  LED_ledCheckThead;ledThread.stackSize = OSA_THR_STACK_SIZE_DEFAULT;ledThread.thrPol = OSA_SCHED_FIFO;ledThread.thrPri = (Uint16)OSA_THR_PRI_MIN(OSA_SCHED_FIFO);ledThread.pUsrArgs = pLedObj;ledThread.pName    =  "led_Thr";status = OSA_thrCreateEx(&ledThread, phThr);if (OSA_isFail(status)){OSA_ERROR("Fail to create led check thread!\n");goto free_state_mem;}return status;free_state_mem:OSA_memFree(pLedObj->pLedState);free_pins:LED_putPins(pLedObj);delete_mutex:OSA_mutexDelete(pLedObj->hLedMutex);return OSA_EFAIL;
}/*******************************************************************************
*  函数名   : PDC_ledExit
*  描  述   : LED模块卸载函数
*  输  入   : 无。
*  输  出   : 无。
*  返回值   : OSA_EFAIL: 失败
*             OSA_SOK  : 成功
*******************************************************************************/
Int32 __exit PDC_ledExit(void)
{Int32       status = OSA_SOK;LED_Obj    *pLedObj = &gLedObj;status |= OSA_thrDelete(pLedObj->hLedCheckThr);status |= OSA_memFree(pLedObj->pLedState);status |= LED_putPins(pLedObj);/* 销毁互斥锁,消除lint用 */OSA_mutexDelete(pLedObj->hLedMutex);return status;
}
/*******************************************************************************
* pdc_peripheralsCfg_ambacv22.c
*
* Copyright (C) 2011-2013 ZheJiang Dahua Technology CO.,LTD.
*
* Author : wang_zhenyu <wang_zhenyudahuatech.com>
* Version: V1.0.0  2020-10-16 Create
*
* Description: ambacv22配置初始化入口。按照ambacv22管脚资源进行配置,使用3516ev300
*              芯片的设备需要裁减和修改。
*
*       1. 硬件说明。
*
*       2. 程序结构说明。
*
*       3. 使用说明。
*
*       4. 局限性说明。
*
*       5. 其他说明。
*
*
* Modification:
*    Date    :
*    Revision:
*    Author  :
*    Contents:
*******************************************************************************/#include <sys_info.h>
#include "pdc_cfg.h"
#include "pdc_priv.h"//#define FPGA_UPGRADE_SPI_SIMULATE/* 恢复默认配置 */
static PDC_ResetStateCfg gRstStateCfg =
{.gpioCfg = PDC_cfgSetGpio(45, 0),.resetLevel = 0,
};/* 系统重启:reboot */
static PDC_RebootCfg  gRstSysCfg =
{
#if 0.rebootType  = PDC_REBOOT_TYPE_GPIO,.gpioCfg =  43,
#else.rebootType  = PDC_REBOOT_TYPE_WDT,.gpioCfg = PDC_CFG_GPIO_INVA,
#endif.level   = 0,
};/* 看门狗配置 */
static PDC_WdtCfg  gWdtCfg =
{.wdtTypeFlags = PDC_WDT_SOFTWARE,.hardWareWdtCfg ={.gpioCfg = PDC_CFG_GPIO_INVA,.hWdtFeedType = 2,}
};static PDC_ComMapInfo gComPortCfg =
{.comMapItems[0] = {.uartRxGpio = PDC_CFG_GPIO_INVA,.uartRxVal = -1,.uartTxGpio =  PDC_CFG_GPIO_INVA,.uartTxVal = -1,.rs485Gpio = PDC_CFG_GPIO_INVA,.type = COM_IS_CONSOLE,.port = COM_PORT_1,.comStyle = COM_STYLE_UART,.changeGio = PDC_CFG_GPIO_INVA,.reserved ={0,0,0,},},.comMapItems[1] = {.uartRxGpio = PDC_cfgSetGpio(142, 0),.uartRxVal = -1,.uartTxGpio = PDC_cfgSetGpio(143, 0),.uartTxVal = -1,.rs485Gpio = PDC_CFG_GPIO_INVA,.type = COM_STYLE_UART,.port = COM_PORT_2,.comStyle = COM_STYLE_UART,.changeGio = PDC_CFG_GPIO_INVA,.reserved ={0,0,0,},},.comMapItems[2] = {.uartRxGpio = PDC_CFG_GPIO_INVA,.uartRxVal = -1,.uartTxGpio = PDC_CFG_GPIO_INVA,.uartTxVal = -1,.rs485Gpio = PDC_CFG_GPIO_INVA,.type = COM_IS_GENERAL,.port = COM_PORT_MAX_NUM,/* 标识无该串口,配置结束 */.comStyle = COM_STYLE_MAX,.changeGio = PDC_CFG_GPIO_INVA,.reserved ={0,0,0,},},.pullType =  PRC_PINMUX_NOPULL,
};/* RTC配置 */
static PDC_RtcCfg gRtcCfg =
{.rtcId = PDC_RTC_TYPE_SOCRTC,.rtcDevCfg = {0,0},.historicalRtcId = PDC_RTC_TYPE_NR,.rtcHistDevCfg = {0, 0},.reserved = 0,
};static PDC_PlatformCfg gPlatformCfgAll =
{.spiBusInitParams ={{ /* FPGA通信使用 */2, 0, 1, SPI_TRANSMIT_POLLED,{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},},{ /* FPGA加载使用,0-4是控制器 4实际是另外一组复用GPIO的spi1 *///ssi1_sclk(GPIO35) ssi1_txd(GPIO36) ssi1_rxd(GPIO37)/* FPGA升级使用 */4, 0, 1, SPI_TRANSMIT_POLLED,{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},},{SPI_BUS_INVALID ,0,0,0,{0,0,0,0,0},{0,0,0,0,0},{-1,0,0,0,0},},},.I2CinitParams ={{I2C_BUS_INVALID ,0,0,0,{-1,0,0,0,0},{-1,0,0,0,0},I2C_GIO_RESET_INVALID,},},
};static PDC_PlatformCfg gPlatformCfgAll_MULTI =
{.spiBusInitParams ={{ /* 双目FPGA通信和加载复用使用 *//* FPGA 0-4是控制器 4实际是另外一组复用GPIO的spi1 *///ssi1_sclk(GPIO35) ssi1_txd(GPIO36) ssi1_rxd(GPIO37)4, 0, 1, SPI_TRANSMIT_POLLED,{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},{-1,0,PRC_PINMUX_NOPULL,0,0},},{SPI_BUS_INVALID ,0,0,0,{0,0,0,0,0},{0,0,0,0,0},{-1,0,0,0,0},},},.I2CinitParams ={{I2C_BUS_INVALID ,0,0,0,{-1,0,0,0,0},{-1,0,0,0,0},I2C_GIO_RESET_INVALID,},},
};static PDC_KeyCfg gKeyCfg[]  =
{{.keyType  = PDC_KEY_TYPE_GPIO,.timeOutMs = 500,.cfg.gpioKeyCfg ={.codeMask = PDC_KEY_RESET,.keyGpio  = PDC_cfgSetGpio(45, 0),.keyDownLevel = 0,},},{/* 结束标志 */.keyType  = PDC_KEY_TYPE_NR,.timeOutMs = 0,.cfg.gpioKeyCfg ={.codeMask = KEY_INVALID,.keyGpio  = PDC_CFG_GPIO_INVA,.keyDownLevel = 0,}},
};static  PDC_BeepCfg  gBeepCfg =
{.gpioCfg = PDC_cfgSetGpio(41, 1), /* PWM0/GPIO41 */.outLevel = 1,.ctrlMode = PDC_BEEP_CTRL_BY_PWM,.beepPwmCfg = {.pwmId = 0,.mode = 0,.activeLevel = 1,.frequence = 3100,},
};/* LED使用的是配置数组,需要配套PDC_smartIrCfg */
static  PDC_LedCfg gLedCfgs[] =
{{.code     = LED_OK_STATUS,.ledNum   = 0,.gpioCfg1 = PDC_cfgSetGpio(14, 0),.gpioCfg2 = PDC_CFG_GPIO_INVA,.level    = 0,.needApply = 1,.powerOnState = 1,},{.code     = LED_PHY_LINK,.ledNum   = 1,.gpioCfg1 = PDC_cfgSetGpio(13, 0),.gpioCfg2 = PDC_CFG_GPIO_INVA,.level    = 0,.needApply = 1,.powerOnState = 1,},{.code     = LED_INVLIDATE,  /* 表明结束 */.ledNum   = 2,},
};static  PDC_LedCfg gLedCfgs_Multi[] =
{{.code     = LED_Sys,.ledNum   = 0,.gpioCfg1 = PDC_cfgSetGpio(14, 0),.gpioCfg2 = PDC_CFG_GPIO_INVA,.level    = 0,.needApply = 1,.powerOnState = 1,},{.code     = LED_PHY_LINK,.ledNum   = 1,.gpioCfg1 = PDC_cfgSetGpio(13, 0),.gpioCfg2 = PDC_CFG_GPIO_INVA,.level    = 0,.needApply = 1,.powerOnState = 1,},{.code     = LED_LaserEn,.ledNum   = 2,.gpioCfg1 = PDC_cfgSetGpio(7, 0),.gpioCfg2 = PDC_CFG_GPIO_INVA,.level    = 0,.needApply = 1,.powerOnState = 1,},{.code     = LED_INVLIDATE,  /* 表明结束 */.ledNum   = 3,},
};static PDC_GpioStateCfg gGpioCfg_8k[] =
{{.useType = GPIO_TRIGGER,.gpioCfg = PDC_cfgSetGpio(78, 0),},{.useType = GPIO_FPGA_RESET,.gpioCfg = PDC_cfgSetGpio(83, 0),},{.useType = GPIO_PHASE_MODE_START_STATUS,.gpioCfg = PDC_cfgSetGpio(77, 0),},{.useType = GPIO_PHASE_MODE_END_STATUS,.gpioCfg = PDC_cfgSetGpio(84, 0),},{.useType = GPIO_SEN_RESET,.gpioCfg = PDC_cfgSetGpio(85, 0),},{.useType = GPIO_SEN_SPI_SEL_0,.gpioCfg = PDC_cfgSetGpio(79, 0),},{.useType = GPIO_SEN_SPI_SEL_1,.gpioCfg = PDC_cfgSetGpio(80, 0),},{.useType = GPIO_SEN_SPI_SEL_2,.gpioCfg = PDC_cfgSetGpio(81, 0),},{.useType = GPIO_SEN_SPI_SEL_3,.gpioCfg = PDC_cfgSetGpio(82, 0),},{.useType = GPIO_SEN_SPI_SEL_4,.gpioCfg = PDC_cfgSetGpio(86, 0),},{.useType = GPIO_STATE_NR,.gpioCfg = PDC_CFG_GPIO_INVA,       // 表示结束,不能删},
};static PDC_GpioStateCfg gGpioCfg_7000[] =
{{.useType = GPIO_TRIGGER,.gpioCfg = PDC_cfgSetGpio(6, 0),},{.useType = GPIO_FPGA_RESET,.gpioCfg = PDC_cfgSetGpio(7, 0),},{.useType = GPIO_PHASE_MODE_START_STATUS,.gpioCfg = PDC_cfgSetGpio(4, 0),},{.useType = GPIO_PHASE_MODE_END_STATUS,.gpioCfg = PDC_cfgSetGpio(5, 0),},{.useType = GPIO_STATE_NR,.gpioCfg = PDC_CFG_GPIO_INVA,       // 表示结束,不能删},
};static PDC_GpioStateCfg gGpioCfg_Multi[] =
{{.useType = GPIO_TRIGGER,.gpioCfg = PDC_cfgSetGpio(0, 0),},{.useType = GPIO_TRIGGER_INT,.gpioCfg = PDC_cfgSetGpio(4, 0),},{.useType = GPIO_FPGA_JTAG_DISABLE,.gpioCfg = PDC_cfgSetGpio(5, 0),},{.useType = GPIO_STATE_NR,.gpioCfg = PDC_CFG_GPIO_INVA,       // 表示结束,不能删},
};// xilinx 需在线加载
static PDC_fpgaCfg __initdata gFpgaCfgInit_Xilinx =
{.updateCfg ={.updateMode = FPGA_SSMODE,.ssModeCfg ={.oe = PDC_CFG_GPIO_INVA,           //电平转换芯片开关.init_b = PDC_cfgSetGpio(105, 0),      //fpga 复位状态,从fpga端读.program_b = PDC_cfgSetGpio(106, 0),   //fpga复位信号.done = PDC_cfgSetGpio(107, 0),        //加载完成信号 从fpga端读.independentBus = 1,.bus = FPGA_SPI,.spiCfg ={.busId = 4,.cs = 0,.freq = 12000000,.bitLen = 8,.mode = SPI_MODE_0 | (SPI_RXTX_ALL<<SPI_RXTX_SHIFT),.intGpio = PDC_CFG_GPIO_INVA,.csPinCfg ={/* 真正的片选 假的GPIO*/.pinId = PDC_cfgSetGpio(38, 0),.mode = 0,.pullType = PRC_PINMUX_NOPULL,.isReverse = 0,.debouncTime = 0,},},.fpgaType = FPGA_XILINX,},},.commCfg ={.commMode = FPGA_SPI,.spiCfg ={.busId = 2,.cs = 0,.freq = 1000000,.bitLen = 8,.mode = SPI_MODE_0 | (SPI_RXTX_ALL<<SPI_RXTX_SHIFT),.intGpio = PDC_CFG_GPIO_INVA,.csPinCfg ={/* 真正的片选 */.pinId = PDC_cfgSetGpio(30, 0), //GPIO 3_7.mode = 0,.pullType = PRC_PINMUX_NOPULL,.isReverse = 0,.debouncTime = 0,},},},
};// 紫光 需在线加载,不同于xilinx,升级数据需按特殊格式传输
static PDC_fpgaCfg __initdata gFpgaCfgInit_PGL =
{.updateCfg ={.updateMode = FPGA_SSMODE,.ssModeCfg ={.oe = PDC_CFG_GPIO_INVA,           //电平转换芯片开关.init_b = PDC_cfgSetGpio(158, 0),      //fpga 复位状态,从fpga端读.program_b = PDC_cfgSetGpio(160, 0),   //fpga复位信号.done = PDC_cfgSetGpio(159, 0),    //加载完成信号 从fpga端读.independentBus = 1,.bus = FPGA_SPI,.spiCfg ={.busId = 4,.cs = 0,.freq = 12000000,.bitLen = 8,.mode = SPI_MODE_0 | (SPI_RXTX_ALL<<SPI_RXTX_SHIFT),.intGpio = PDC_CFG_GPIO_INVA,.csPinCfg ={/* 真正的片选 假的GPIO*/.pinId = PDC_cfgSetGpio(38, 0), //GPIO 4_7.mode = 0,.pullType = PRC_PINMUX_NOPULL,.isReverse = 0,.debouncTime = 0,},},.fpgaType = FPGA_PGL,},},.commCfg ={.commMode = FPGA_SPI,.spiCfg ={.busId = 2,.cs = 0,.freq = 1000000,.bitLen = 8,.mode = SPI_MODE_0 | (SPI_RXTX_ALL<<SPI_RXTX_SHIFT),.intGpio = PDC_CFG_GPIO_INVA,.csPinCfg ={/* 真正的片选 */.pinId = PDC_cfgSetGpio(30, 0),.mode = 0,.pullType = PRC_PINMUX_NOPULL,.isReverse = 0,.debouncTime = 0,},},},
};static PDC_fpgaCfg __initdata gFpgaCfgInit_HME =
{.updateCfg ={.updateMode = FPGA_PSMODE,.psModeCfg ={.nstatus = PDC_CFG_GPIO_INVA,       // 状态.confdon = 159,		                // 配置完成.dclk = 35,	        // 时钟.data = PDC_CFG_GPIO_INVA,	        // 数据.ss = 38,                           // HME-HR’s SS pin,控制fpga进入ps模式后兼做片选.nconfig = 160,		                // 配置.resetGpio = PDC_CFG_GPIO_INVA,     // 复位.ctrlGpio   = PDC_CFG_GPIO_INVA,    // 控制.spiMode    = 2,                    // 0 代表用原生SPI通信,1代表用模拟GPIO通信,2代表原生与模拟切换.independentBus = 0,                // 是否独立总线,0、共用data总线,1、独立总线// 若是复用总线,则不进行ss/dclk/data管脚初始化},},.commCfg ={.commMode = FPGA_SPI,.spiCfg ={.busId = 4,  /* 硬件上为GPIO38复用的SPI1,PRC中定义为SPI4 */.cs = 0,.freq = 1000000,.bitLen = 8,.mode = SPI_MODE_0 | (SPI_RXTX_ALL<<SPI_RXTX_SHIFT),.intGpio = PDC_CFG_GPIO_INVA,.csPinCfg ={/* 真正的片选 */.pinId = PDC_cfgSetGpio(38, 0), //GPIO38.mode = 0,.pullType = PRC_PINMUX_NOPULL,.isReverse = 0,.debouncTime = 0,},},},
};static PDC_CfgAllInfo gCfgAllInfo =
{.paCfgArray[PDC_MODULE_RESET_SYS]   = &gRstSysCfg,.aCfgSize[PDC_MODULE_RESET_SYS]     = sizeof(gRstSysCfg),.paCfgArray[PDC_MODULE_WDT]         = &gWdtCfg,.aCfgSize[PDC_MODULE_WDT]           = sizeof(gWdtCfg),.paCfgArray[PDC_MODULE_COMPORT]     = &gComPortCfg,.aCfgSize[PDC_MODULE_COMPORT]       = sizeof(gComPortCfg),};Int32 __init PDC_cfgInit_MV_RH7XXX(SYS_ProductInfo *pPdtInfo)
{Int32       status = OSA_SOK;(void)pPdtInfo;PDC_setHWIDInfo(DSP_CHIP,DSP_CV2S88);gCfgAllInfo.paCfgArray[PDC_MODULE_COMMON]  = &gPlatformCfgAll;gCfgAllInfo.aCfgSize[PDC_MODULE_COMMON]    = sizeof(gPlatformCfgAll);if( OSA_isSuccess(PDC_checkProductType("MV-SL7082MG17C")) ||OSA_isSuccess(PDC_checkProductType("MV-SL7082CG17C"))){gCfgAllInfo.paCfgArray[PDC_MODULE_RESET_STATE] = &gRstStateCfg,gCfgAllInfo.aCfgSize[PDC_MODULE_RESET_STATE]   = sizeof(gRstStateCfg),gCfgAllInfo.paCfgArray[PDC_MODULE_LED]         = gLedCfgs,gCfgAllInfo.aCfgSize[PDC_MODULE_LED]           = sizeof(gLedCfgs),gCfgAllInfo.paCfgArray[PDC_MODULE_KEY]     = gKeyCfg;gCfgAllInfo.aCfgSize[PDC_MODULE_KEY]       = sizeof(gKeyCfg);gCfgAllInfo.paCfgArray[PDC_MODULE_GPIO_STATE]  = gGpioCfg_8k;gCfgAllInfo.aCfgSize[PDC_MODULE_GPIO_STATE]    = sizeof(gGpioCfg_8k);gCfgAllInfo.paCfgArray[PDC_MODULE_FPGA] = &gFpgaCfgInit_Xilinx;gCfgAllInfo.aCfgSize[PDC_MODULE_FPGA]   = sizeof(gFpgaCfgInit_Xilinx);OSA_INFO("FPGA type :  Xilinx\n");gCfgAllInfo.paCfgArray[PDC_MODULE_BEEP]        = &gBeepCfg;gCfgAllInfo.aCfgSize[PDC_MODULE_BEEP]          = sizeof(gBeepCfg);}else if( OSA_isSuccess(PDC_checkProductType("MV-DS5131MG30C")) ||OSA_isSuccess(PDC_checkProductType("MV-DS5131MG30X")) ||OSA_isSuccess(PDC_checkProductType("MV-DS5131CG30C"))){gCfgAllInfo.paCfgArray[PDC_MODULE_LED]         = gLedCfgs_Multi,gCfgAllInfo.aCfgSize[PDC_MODULE_LED]           = sizeof(gLedCfgs_Multi),gCfgAllInfo.paCfgArray[PDC_MODULE_COMMON]  = &gPlatformCfgAll_MULTI;gCfgAllInfo.aCfgSize[PDC_MODULE_COMMON]    = sizeof(gPlatformCfgAll_MULTI);gCfgAllInfo.paCfgArray[PDC_MODULE_GPIO_STATE]  = gGpioCfg_Multi;gCfgAllInfo.aCfgSize[PDC_MODULE_GPIO_STATE]    = sizeof(gGpioCfg_Multi);gCfgAllInfo.paCfgArray[PDC_MODULE_FPGA] = &gFpgaCfgInit_HME;gCfgAllInfo.aCfgSize[PDC_MODULE_FPGA]   = sizeof(gFpgaCfgInit_HME);OSA_INFO("FPGA type :  HME-H1D03\n");}else{gCfgAllInfo.paCfgArray[PDC_MODULE_LED]         = gLedCfgs,gCfgAllInfo.aCfgSize[PDC_MODULE_LED]           = sizeof(gLedCfgs),gCfgAllInfo.paCfgArray[PDC_MODULE_RESET_STATE] = &gRstStateCfg,gCfgAllInfo.aCfgSize[PDC_MODULE_RESET_STATE]   = sizeof(gRstStateCfg),gCfgAllInfo.paCfgArray[PDC_MODULE_KEY]     = gKeyCfg;gCfgAllInfo.aCfgSize[PDC_MODULE_KEY]       = sizeof(gKeyCfg);gCfgAllInfo.paCfgArray[PDC_MODULE_GPIO_STATE]  = gGpioCfg_7000;gCfgAllInfo.aCfgSize[PDC_MODULE_GPIO_STATE]    = sizeof(gGpioCfg_7000);gCfgAllInfo.paCfgArray[PDC_MODULE_FPGA]    = &gFpgaCfgInit_PGL;gCfgAllInfo.aCfgSize[PDC_MODULE_FPGA]      = sizeof(gFpgaCfgInit_PGL);OSA_INFO("FPGA type : PGL22\n");gCfgAllInfo.paCfgArray[PDC_MODULE_BEEP]        = &gBeepCfg;gCfgAllInfo.aCfgSize[PDC_MODULE_BEEP]          = sizeof(gBeepCfg);}status = PDC_cfgRegister(&gCfgAllInfo);return status;
}

相关文章:

在公司的一些笔记

6.19 记住挂载在windows上的账户是DAHUATECH\401593&#xff0c;不是401593Windows与linux不能同时挂载在虚拟盘上 6.21 /******************************************************************************* pdc_ledSy7806e.c* * Description: 提供I2C访问sy7806e。 * * …...

2020C++等级考试二级真题题解

202012数组指定部分逆序重放c #include <iostream> using namespace std; int main() {int a[110];int n, k;cin >> n >> k;for (int i 0; i < n; i) {cin >> a[i];}for (int i 0; i < k / 2; i) {swap(a[i], a[k - 1 - i]);}for (int i 0…...

面试官:聊聊 nextTick

前言 在最近的面试中,不少面试官叫我聊聊 nextTick,nextTick 是个啥,这篇文章咱来好好聊聊! 我的回答 nextTick 是官方提供的一个异步方法,用于在 DOM 更新之后执行回调。正好在我的项目中用到了,就拿它来形容一下,大概的场景是渲染一个列表,每次点击按钮就会往列表后…...

shell编程之条件语句(shell脚本)

条件测试操作 要使shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等。 shell环境根据命令执行后…...

QT中QSettings的使用系列之二:保存和恢复应用程序主窗口

1、核心代码 #include "widget.h" #include "ui_widget.h" #include <QSettings> #include <QDebug> #include <QColo...

Linux系统上安装Miniconda并安装特定版本的Python

要在Linux系统上安装Miniconda并安装特定版本的Python&#xff08;例如3.10.12&#xff09;&#xff0c;请按照以下步骤进行操作&#xff1a; 1. 下载并安装Miniconda 下载Miniconda安装脚本&#xff1a; 使用wget或curl下载Miniconda安装脚本。以下是使用wget的命令&#xff…...

解决Qt中 -lGL无法找到的问题

在使用Qt Creator创建并编译新项目时&#xff0c;可能会遇到以下错误&#xff1a; /usr/bin/ld: cannot find -lGL collect2: error: ld returned 1 exit status make: *** [untitled1] Error 1 18:07:41: The process "/usr/bin/make" exited with code 2. Error w…...

【重要】《HTML趣味编程》专栏内资源的下载链接

目录 关于专栏 博主简介 专栏内资源的下载链接 写在后面 关于专栏 本专栏将持续更新,至少含有30个案例,后续随着案例的增加可能会涨价,欢迎大家尽早订阅!(订阅后可查看专栏内所有文章,并且可以下载专栏内的所有资源) 博主简介 ⭐ 2024年百度文心智能体大赛 Top1⭐…...

苍穹外卖环境搭建

一、前端环境搭建 ①整体结构 ②前端工程基于nginx运行 启动nginx:双击 nginx.exe 即可启动 nginx 服务&#xff0c;访问端口号为 80 进入浏览器地址输入locallhost回车 二、后端环境搭建 后端初始工程基于maven进行项目构建&#xff0c;并且进行分模块开发 (1) idea打开初始…...

切割游戏介绍

简介 上大学时&#xff0c;在学校实验室里玩过一个貌似使用VC写的小游戏&#xff0c;一个小球在界面上四处游荡&#xff0c;玩家使用鼠标切割背景&#xff0c;将背景切割剩余到一定的百分比后&#xff0c;就胜利了&#xff0c;后边的背景图会全部展示出来。 使用qt的qml技术&a…...

对接Paypal、Stripe支付简单流程

一、Stripe卡支付简单流程&#xff1a; #mermaid-svg-bZxQh1bt4Z8agjJg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bZxQh1bt4Z8agjJg .error-icon{fill:#552222;}#mermaid-svg-bZxQh1bt4Z8agjJg .error-text{fi…...

微服务中不同服务使用openfeign 相互调用

首先 我们上文 已经知道了 nacos 的注册服务&#xff0c;现在 我们 在不同服务中相互调用就可以使用openfeign 直接调用&#xff0c;而不是 再写冗余的调用代码啦 首先 我们的微服务组件如下 因为我这个微服务是我在 员工登录demo 中 拆出来的&#xff0c;在userlogin模块中…...

社区项目-项目介绍环境搭建

文章目录 1.技术选型2.原型设计1.安装AxureRP2.进行汉化3.载入元件库4.基本设计 3.元数建模1.安装元数建模软件2.新建项目3.新增一个刷题模块主题域4.新增数据表 subject_category5.新增关系图&#xff0c;将表拖过来6.新增题目标签表7.新增题目信息表8.新增单选表、多选表、判…...

【论文阅读】-- Omnisketch:高效的多维任意谓词高速流分析

Omnisketch&#xff1a;高效的多维任意谓词高速流分析 摘要1 引言2 预备知识及相关工作3 OMNISKETCH&#xff1a;使用任意谓词估计频率3.1 Sketch S0&#xff1a;Count-Min with rid-sets 用于估计带有谓词的查询3.2 Sketch S1 &#xff08;OmniSketch&#xff09;&#xff1a;…...

【ajax核心03】封装底层axios函数

目录 一&#xff1a;步骤总结 二&#xff1a;获取数据需求&#xff1a; 三&#xff1a;查找数据需求&#xff1a; 四&#xff1a;发送数据需求&#xff1a; 一&#xff1a;步骤总结 定义myAxios函数&#xff0c;接收配置对象&#xff0c;返回Promise对象发送XHR请求&#…...

python科学计算

文章目录 一、科学计算介绍二、NumPy2.1、NumPy是什么2.2、NumPy使用场景2.3、NumPy特点2.4、NumPy如何使用 三、数组3.1、数组介绍3.2、创建数组3.3、数组的大小3.4、通过索引访问数组3.5、变换数组的形态3.6、常用的ufunc运算 一、科学计算介绍 python语言提供了array模块&am…...

Leetcode - 132双周赛

目录 一、3174. 清除数字 二、3175. 找到连续赢 K 场比赛的第一位玩家 三、3176. 求出最长好子序列 I 四、3177. 求出最长好子序列 II 一、3174. 清除数字 本题可以使用栈来模拟&#xff0c;遇到数字弹出栈顶元素&#xff0c;遇到字母入栈。 代码如下&#xff1a; //使用字…...

Mongodb在UPDATE操作中使用$push向数组中插入数据

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第69篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…...

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 锐化效果

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 锐化效果 核心代码完整代码在线示例ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类,可以添加数据以及操作 FBO(ManagedFBO); 通过操作 FBO,可以通过后处理实现很多效果,官方提供了几个示例,…...

信息系统项目管理师 | 信息系统安全技术

关注WX&#xff1a;CodingTechWork 信息安全概念 安全属性 秘密性&#xff1a;信息不被未授权者知晓。完整性&#xff1a;信息是正确的、真实的、未被篡改的、完整无缺。可用性&#xff1a;信息可以随时正常使用。 安全分层 设备安全 设备的稳定性&#xff1a;在一定时间…...

Java数据类型与运算符

1. 变量和类型 变量指的是程序运行时可变的量&#xff0c;相当于开辟一块空间来保存一些数据。 类型则是对变量的种类进行了划分&#xff0c;不同类型的变量具有不同的特性。 1.1 整型变量&#xff08;重点&#xff09; 基本语法格式&#xff1a; int 变量名 初始值;代码示…...

网络虚拟化考题

vrrp讲过吗&#xff1f;&#xff1f;&#xff1f; d 每一层都是什么设备啊 abcd 为啥流量不可控不可视 c是啥意思 讲过吗 abc aNET网络虚拟化是啥啊 为啥&#xff1f;&#xff1f; 啥是CDN&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;...

《C++ Primer》导学系列:第 7 章 - 类

7.1 定义抽象数据类型 7.1.1 类的基本概念 在C中&#xff0c;类是用户定义的类型&#xff0c;提供了一种将数据和操作这些数据的函数&#xff08;成员函数&#xff09;组合在一起的方法。类定义了对象的属性和行为&#xff0c;通过实例化类来创建对象。 7.1.2 定义类 定义类…...

idea intellij 2023打开微服务项目部分module未在左侧项目目录展示(如何重新自动加载所有maven项目model)

项目场景&#xff1a; springcloud微服务项目,部分模块暂时不需要用到&#xff0c;就在pom.xml文件中注释掉相应的模块&#xff0c;突然有一天打开项目&#xff0c;部分项目module 在idea intellij工具左侧文件夹找不到了&#xff0c;重新file->open本地项目也还是部分模块…...

生成视频 zeroscope_v2_576w 学习笔记

目录 生成视频代码&#xff1a; 维度报错&#xff1a; 解决方法&#xff0c;修改代码&#xff1a; 已开源&#xff1a; 视频生成模型 Zeroscope开源 免费无水印 视频生成模型 Zeroscope_v2_576w 开源 - 腾讯云开发者社区-腾讯云 生成视频代码&#xff1a; import torch fro…...

H3C综合实验

实验拓扑 实验要求 1、按照图示配置IP地址 2、sw1和sw2之间的直连链路配置链路聚合 3、 公司内部业务网段为VLAN10和VLAN20; VLAN 10是市场部&#xff0c;vlan20是技术部&#xff0c;要求对VLAN进行命名以便识别&#xff1b;PC1属于vlan10&#xff0c;PC2属于vlan20&#xf…...

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…...

安卓逆向案例——X酷APP逆向分析

X酷APP逆向分析 这里介绍一下两种不同的挂载证书的方法。 chls.pro/ssl无法在浏览器中下载证书是什么原因解决方法&#xff1a; 法一 1. 挂载系统分区为读写 使用正确的挂载点来挂载系统分区为读写&#xff1a; su mount -o remount,rw /dev/uijISjR/.magisk/block/syste…...

创新案例|星巴克中国市场创新之路: 2025目标9000家店的挑战与策略

星巴克创始人霍华德舒尔茨&#xff1a;“为迎接中国市场的全面消费复苏&#xff0c;星巴克2025年推进9000家门店计划&#xff0c;将外卖、电商以及家享和外出场景咖啡业务纳入中国新一轮增长计划中。”在面临中国市场同店增长大幅下滑29%背景下&#xff0c;星巴克通过DTC用户体…...

计算机网络 MAC地址表管理

一、理论知识 1.MAC地址表&#xff1a;交换机使用MAC地址表来记录各MAC地址对应的端口&#xff0c;用于帧转发的目的。 2.老化机制&#xff1a;交换机会为每一条MAC地址表项设置老化时间&#xff0c;老化时间到期后未收到该MAC地址报文的表项将被删除&#xff0c;释放资源。 …...

【免费API推荐】:各类API资源免费获取【11】

欢迎来到各类API资源的免费获取世界&#xff01;幂简集成为您提供了一个集合了各种免费API接口的平台。无论您是开发者、数据分析师还是创业者&#xff0c;都可以通过我们的平台轻松免费获取所需的API资源。幂简精心整理了各类API接口&#xff0c;涵盖了不同领域的需求&#xf…...

技术驱动会展:展位导航系统的架构与实现

随着会展行业的快速发展&#xff0c;大型会展中心面临着如何提升参展者体验、提高招商效率的挑战。针对客户反馈的展馆面积大、展位查找困难等问题&#xff0c;维小帮提出一套智慧会展导航解决方案&#xff0c;旨在通过先进的室内导航技术提升会展中心的运营效率和参展者的满意…...

适用于轨道交通专用的板卡式网管型工业以太网交换机

是网管型 CompactPCI板卡式冗余环网交换机。前面板带有6个 10/100/1000Base-T(X)M12接口。后面的CPCI接口有 8个10/100/1000Base-T (X) 以太网接口。 是特别为轨道交通行业EN50155标准要求而设计的坚固型交换机。它同时具有以下特性&#xff1a; ● 支持2线以太网距离扩展端口&…...

excel基本操作

excel 若要取消在数据表中进行的所有筛选 步骤操作&#xff1a; 单击“数据”选项卡。在“排序和筛选”组中&#xff0c;找到“清除”按钮。点击“清除”按钮。 图例&#xff1a; 将文本文件的数据导入到Excel工作表中进行数据处理 步骤&#xff1a; 在Excel中&#xff0c…...

C++系统相关操作2 - 获取系统环境变量

1. 关键词2. sysutil.h3. sysutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 C 系统调用 环境变量 getenv 跨平台 2. sysutil.h #pragma once#include <cstdint> #include <string>namespace cutl {/*** brief Get an environment variable.** param na…...

适合小白学习的项目1906java Web智慧食堂管理系统idea开发mysql数据库web结构java编程计算机网页源码servlet项目

一、源码特点 java Web智慧食堂管理系统是一套完善的信息管理系统&#xff0c;结合java 开发技术和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 前段主要技术 bootstra…...

AI通用大模型不及垂直大模型?各有各的好

​​​​​​​AI时代&#xff0c;通用大模型和垂直大模型&#xff0c;两者孰优孰劣&#xff0c;一直众说纷纭。 通用大模型&#xff0c;聚焦基础层&#xff0c;如ChatGPT、百度文心一言&#xff0c;科大讯飞星火大模型等&#xff0c;都归属通用大模型&#xff0c;它们可以解答…...

农产品价格信息系统小程序

一键掌握市场脉动 &#x1f33e; 引言&#xff1a;为何关注农产品价格&#xff1f; 在当今社会&#xff0c;农产品价格的波动直接关系到农民的收入和消费者的生活成本。因此&#xff0c;及时、准确地掌握农产品价格信息&#xff0c;对于农民合理安排生产、消费者做出购买决策都…...

【LLM-多模态】高效多模态大型语言模型综述

一、结论写在前面 模型规模的庞大及训练和推理成本的高昂&#xff0c;限制了MLLMs在学术界和工业界的广泛应用。因此&#xff0c;研究高效轻量级的MLLMs具有巨大潜力&#xff0c;特别是在边缘计算场景中。 论文深入探讨了高效MLLM文献的领域&#xff0c;提供了一个全面的视角…...

ASP .Net Core创建一个httppost请求并添加证书

ASP .Net Core创建一个httppost请求并添加证书 创建.net Core程序&#xff0c;使用自签名证书&#xff0c;可以处理https的get和post请求。 创建证书 创建自签名证书的流程可以在这里查看&#xff1a; https://blog.csdn.net/GoodCooking/article/details/139815278创建完毕…...

Redis入门篇

目录 传送门一、前言二、NoSQL1、ont only sql&#xff0c;特点&#xff1a;2、NoSQL的四大分类&#xff1a; 三、Redis概念四、五大数据类型: 传送门 SpringMVC的源码解析&#xff08;精品&#xff09; Spring6的源码解析&#xff08;精品&#xff09; SpringBoot3框架&#…...

变电站智能巡检机器人解决方案

我国拥有庞大的电网体系&#xff0c;变电站数量众多&#xff0c;且近年来快速增长。然而目前我国变电站巡检方式仍以人工为主&#xff0c;存在效率低下、监控不全面等问题。变电站通常是一个封闭的系统空间&#xff0c;设备种类繁多、占地面积广阔&#xff0c;这对巡检人员实时…...

Linux Kernel入门到精通系列讲解(QEMU-虚拟化篇) 2.5 Qemu实现RTC设备

1. 概述 上一章节起(5.4小节),我们已经把整个Naruto Pi都跑通了,从BL0到kernel再到Rootfs都通了,目前可以说已经具备学习Linux得基础条件,剩下得都只是添砖加瓦,本小节我们将添加RTC,如果你还没有添加RTC,你可以试试不添加RTC时,Linux的时间戳会很奇怪,加了RTC后,…...

【自动驾驶】通过下位机发送的加速度、角速度计算机器人在世界坐标系中的姿态

文章目录 原始代码全局变量定义逆平方根函数四元数解算函数理论解释四元数加速度计数据归一化计算方向余弦矩阵的第三行计算误差计算并应用积分反馈应用比例反馈积分陀螺仪数据,更新四元数归一化四元数更新姿态数据整体流程原始代码 #define SAMPLING_FREQ 20.0f // 采样频率…...

Python 设计模式(第2版) -- 第四部分(其他设计模式)

Python 设计模式(第2版) 最后介绍下其他设计模式。 模型—视图—控制器&#xff08;MVC&#xff09;-- 复合模式 根据 GoF 的定义&#xff0c;“复合模式将两个或更多模式组合成解决常见或普遍性问题的解决方案”。复合模式不是同时使用的一组模式&#xff0c;而是一个问题的…...

gitlab升级16.11.3-ee

背景 这是事后一段时间补充记录的博客。 升级目的&#xff1a;修补漏洞CVE-2024-4835 未经认证的威胁攻击者能够利用该漏洞在跨站脚本 (XSS) 攻击中&#xff0c;轻松接管受害者账户。 gitlab版本为14.6.2-ee升级至16.11.3-ee 思路 翻阅文档找升级方法及升级版本路径。使用…...

剑指offer 算法题(搜索二维矩阵)

剑指offer 第二题 去力扣里测试算法 思路一&#xff1a; 直接暴力遍历二维数组。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (unsigned int i{ 0 }; i < matrix.size(); i){for (unsigned int j{ 0 };…...

SaaS平台数据对接为什么要选择API对接?

SaaS平台数据对接是指将一个或多个SaaS平台中的数据集成到其他应用或平台中的过程。在当前的数字化时代&#xff0c;企业越来越倾向于使用SaaS平台来管理他们的业务和数据。然而&#xff0c;这些数据通常散布在不同的SaaS平台中&#xff0c;这对于企业数据的整合和分析来说可能…...

力扣136. 只出现一次的数字

Problem: 136. 只出现一次的数字 文章目录 题目描述思路复杂度Code 题目描述 思路 由于题目要求使用线性时间复杂度和常量级的空间复杂度&#xff0c;再加上找重复元素这个特性&#xff0c;我们可以想到使用位运算来求解&#xff1a; 1.任何数与其本身异或得0&#xff0c;任何…...

重学java 74.Lombok的使用

少点心气&#xff0c;多点干劲 —— 24.6.18 一、lombok的安装使用 1.作用: 简化javabean开发 2.使用: a.下插件 ->如果是idea2022不用下载了,自带 b.导lombok的jar包 安装教程&#xff1a; http://t.csdnimg.cn/wq9MM c.修改设置 二、lombok的介绍 Lombok通过增加一…...