海思應用層如何操作GPIO 以及如何彩轉黑

2021-10-01 19:25:42 字數 4209 閱讀 7690

海思可以用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 ...