海思可以用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)
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)
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)
memset(buf, 0, 10);
fread(buf, sizeof(char), sizeof(buf) - 1, fp);
printf("%s: gpio%d_%d = %d\n", __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)
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)
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)
fprintf(fp, "out");
fclose(fp);
sprintf(file_name, "/sys/class/gpio/gpio%d/value", gpio_num);
fp = fopen(file_name, "rb+");
if (fp == null)
if (gpio_out_val)
strcpy(buf,"1");
else
strcpy(buf,"0");
fwrite(buf, sizeof(char), sizeof(buf) - 1, fp);
printf("%s: gpio%d_%d = %s\n", __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)
fprintf(fp, "%d", gpio_num);
fclose(fp);
return 0;
}
做這個的背景是要做夜視功能:當晚上光強很小的時候,切換ircut,關掉濾光片,開啟紅外補光燈,彩轉黑
1.在海思3518ev300實現彩轉灰,在文件上找到了乙個api hi_mpi_venc_setchnparam,用於設定venc 通道的屬性從而達到彩轉灰的目的。
//注意:本介面在編碼通道建立之後,編碼通道銷毀之前設定
hi_mpi_venc_getchnparam (vencchn,&stvencchnparam);
if (hi_success != s32ret)
stvencchnparam.bcolor2grey=1;
s32ret=hi_mpi_venc_setchnparam(vencchn,&stvencchnparam);
if (hi_success != 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,就達到了效果 Linux應用層直接操作GPIO
在乙個老手的指導下,應用層可以直接操作gpio,具體指設定gpio的輸入輸出以及輸出電平高或者低。這個大大地提高了靈活性,官方的文件有gpio sysfs inte ce for userspace,gpio sysfs。這裡我記錄一下使用過例子 rk30 pin0 pd4 a0 7 0 7 b0 ...
Linux應用層直接操作GPIO
在乙個老手的指導下,應用層可以直接操作gpio,具體指設定gpio的輸入輸出以及輸出電平高或者低。這個大大地提高了靈活性,官方的文件有gpio sysfs inte ce for userspace,gpio sysfs。這裡我記錄一下使用過例子 rk30 pin0 pd4 a0 7 0 7 b0 ...
海思晶元上GPIO操作
gpio的設定一般為三步 1 設定gpio埠復用 2 設定gpio口的方向 3 讀取或者寫入gpio值 第一步不是每個gpio口都是要配置的,如果你設定的gpio埠有復用功能,那麼你需要對gpio對應復用暫存器進行配置,例如 文件中gpio5 5是有復用功能的,0 pwm out0 1 gpio5 ...