概述
1.GPIO
海思可以用himm来查看及修改寄存器的值,从而改变GPIO的配置,如复用、方向、查看输入值等等。但是该方法在应用层代码上并不能使用。网络上查有用GPIO操作的API,查看文档发现海思3518Ev300上执行GPIO的寄存器操作API HI_MPI_SYS_GetReg和HI_MPI_SYS_SetReg被删除了
查到的还有就是查看himm源码,自己写一个,或者自己学一个GPIO驱动,是可行的,但是比较麻烦,这里找到了一种在应用层操作GPIO的方法,具体说明如下:
//步骤 1. 将要操作的 GPIO 编号 export:
fp = fopen("/sys/class/gpio/export", "w");
fprintf(fp, "%d", gpio_num);
fclose(fp);
//注意:海思3518Ev300每组GPIO有8个GPIO管脚,参数gpio_num为要操作的GPIO编号,该编号等于GPIO组号*8+ 组内偏移号 ,例如GPIO4_2编号为4*8+2=34。
//步骤 2. 设置 GPIO 方向:
fp = fopen("/sys/class/gpio/gpio%d/direction", "rb+");
对于输入:fprintf(fp, "in");
对于输出:fprintf(fp, "out");
fclose(fp);
//步骤 3. 查看 GPIO 输入值或设置 GPIO 输出值:
fp = fopen("/sys/class/gpio/gpio%d/value", "rb+");
查看输入值:fread(buf, sizeof(char), sizeof(buf) - 1, fp);
输出低:
strcpy(buf,"0");
fwrite(buf, sizeof(char), sizeof(buf) - 1, fp);
输出高:
strcpy(buf,"1");
fwrite(buf, sizeof(char), sizeof(buf) - 1, fp);
//步骤 4. 将操作的 GPIO 编号 unexport:
fp = fopen("/sys/class/gpio/unexport", "w");
fprintf(fp, "%d", gpio_num);
fclose(fp);
下面是GPIO输入和输出例子,可以直接使用
//功能:设置GPIO为输入
int gpio_test_in(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
{
FILE *fp;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;
gpio_num = gpio_chip_num * 8 + gpio_offset_num;
sprintf(file_name, "/sys/class/gpio/export");//将要操作的 GPIO 编号 export
fp = fopen(file_name, "w");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);
sprintf(file_name, "/sys/class/gpio/gpio%d/direction", gpio_num);//设置 GPIO 方向:
fp = fopen(file_name, "rb+");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "in");//方向为输入
fclose(fp);
sprintf(file_name, "/sys/class/gpio/gpio%d/value", gpio_num);//查看 GPIO 输入值;
fp = fopen(file_name, "rb+");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
memset(buf, 0, 10);
fread(buf, sizeof(char), sizeof(buf) - 1, fp);
printf("%s: gpio%d_%d = %dn", __func__,gpio_chip_num, gpio_offset_num, buf[0]-48);
fclose(fp);
sprintf(file_name, "/sys/class/gpio/unexport");
fp = fopen(file_name, "w");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);
return (int)(buf[0]-48);
}
//功能:设置GPIO输出
int gpio_test_out(unsigned int gpio_chip_num, unsigned int gpio_offset_num,unsigned int gpio_out_val)
{
FILE *fp;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;
gpio_num = gpio_chip_num * 8 + gpio_offset_num;
sprintf(file_name, "/sys/class/gpio/export");
fp = fopen(file_name, "w");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);
sprintf(file_name, "/sys/class/gpio/gpio%d/direction", gpio_num);
fp = fopen(file_name, "rb+");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "out");
fclose(fp);
sprintf(file_name, "/sys/class/gpio/gpio%d/value", gpio_num);
fp = fopen(file_name, "rb+");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
if (gpio_out_val)
strcpy(buf,"1");
else
strcpy(buf,"0");
fwrite(buf, sizeof(char), sizeof(buf) - 1, fp);
printf("%s: gpio%d_%d = %sn", __func__,gpio_chip_num, gpio_offset_num, buf);
fclose(fp);
sprintf(file_name, "/sys/class/gpio/unexport");
fp = fopen(file_name, "w");
if (fp == NULL)
{
printf("Cannot open %s.n", file_name);
return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);
return 0;
}
2.海思3518Ev300如何实现彩转灰
做这个的背景是要做夜视功能:当晚上光强很小的时候,切换IRCUT,关掉滤光片,打开红外补光灯,彩转黑
1.在海思3518Ev300实现彩转灰,在文档上找到了一个API HI_MPI_VENC_SetChnParam,用于设置VENC 通道的属性从而达到彩转灰的目的。
//注意:本接口在编码通道创建之后,编码通道销毁之前设置
HI_MPI_VENC_GetChnParam (VencChn,&stVencChnParam);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_GetChnParam [%d] faild with %#x! ===n",
VencChn, s32Ret);
return s32Ret;
}
stVencChnParam.bColor2Grey=1;
s32Ret=HI_MPI_VENC_SetChnParam(VencChn,&stVencChnParam);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("HI_MPI_VENC_SetChnParam [%d] faild with %#x! ===n",
VencChn, s32Ret);
return s32Ret;
}
虽然可以实现彩转灰,但是如何变为彩色呢,因为这个输入venc通道属性初始化(只在开机初始化一次),所以当你改变了属性(由彩色变为灰度),不能再写进去,不能生效,除非重新开机初始化,达不到即时切换的效果。
2.有人说可以通过改变ISP饱和度可以达到这个效果,确实如此
HI_MPI_ISP_GetSaturationAttr(0, &pstSatAttr);
pstSatAttr.enOpType=0;//自动模式
HI_MPI_ISP_SetSaturationAttr(0, &pstSatAttr);
HI_MPI_ISP_GetSaturationAttr(0, &pstSatAttr);
pstSatAttr.enOpType=1;//手动模式,只有设置为手动模式,饱和度设置才会有效
pstSatAttr.stManual.u8Saturation=0;
HI_MPI_ISP_SetSaturationAttr(0, &pstSatAttr);
如何实时切换呢,这里大概说一下我的编程思路:专门开一个线程,一直检测光强传感器,当检测为光强不足,就设置ISP的模式为手动模式,饱和度为0,就达到了效果
最后
以上就是壮观铅笔为你收集整理的海思应用层如何操作GPIO 以及如何彩转黑1.GPIO2.海思3518Ev300如何实现彩转灰的全部内容,希望文章能够帮你解决海思应用层如何操作GPIO 以及如何彩转黑1.GPIO2.海思3518Ev300如何实现彩转灰所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复