我是靠谱客的博主 壮观铅笔,最近开发中收集的这篇文章主要介绍海思应用层如何操作GPIO 以及如何彩转黑1.GPIO2.海思3518Ev300如何实现彩转灰,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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如何实现彩转灰所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部