rkipc控制ircut的分析

rk_isp_set_night_to_day函數

rkipc控制ircut主要通過rk_isp_set_night_to_day函數,例如在ser_rk_isp_set_night_to_day函數中

int ser_rk_isp_set_night_to_day(int fd) {int ret = 0;int id, len;char *value = NULL;if (sock_read(fd, &id, sizeof(id)) == SOCKERR_CLOSED)return -1;if (sock_read(fd, &len, sizeof(len)) == SOCKERR_CLOSED)return -1;if (len) {value = (char *)malloc(len);//讀取前段發過來的值if (sock_read(fd, value, len) == SOCKERR_CLOSED) {free(value);return -1;}LOG_DEBUG("id is %d, value is %s\n", id, value);//設置日夜模式,會對ircut進行操作ret = rk_isp_set_night_to_day(id, value);free(value);if (sock_write(fd, &ret, sizeof(int)) == SOCKERR_CLOSED)return -1;}

rv1106的rk_isp_set_night_to_day函數在/luckfox-pico/project/app/rkipc/rkipc/common/isp/rv1106/isp.c中

int rk_isp_set_night_to_day(int cam_id, const char *value) {int ret;//檢查傳過來的cam_idRK_ISP_CHECK_CAMERA_ID(cam_id);aie_attrib_t attr;//獲取isp的屬性rk_aiq_user_api2_aie_GetAttrib(rkipc_aiq_get_ctx(cam_id), &attr);if (!strcmp(value, "night")) {//夜晚模式設置attr.mode 為 RK_AIQ_IE_EFFECT_BW;attr.mode = RK_AIQ_IE_EFFECT_BW;rk_aiq_user_api2_aie_SetAttrib(rkipc_aiq_get_ctx(cam_id), &attr);//ircut設置為假rk_isp_enable_ircut(false);} else {//白天模式ircut設置為真rk_isp_enable_ircut(true);//關燈if (light_state == 1)rk_isp_close_light(3);//夜晚模式設置attr.mode 為 RK_AIQ_IE_EFFECT_NONE;attr.mode = RK_AIQ_IE_EFFECT_NONE;rk_aiq_user_api2_aie_SetAttrib(rkipc_aiq_get_ctx(cam_id), &attr);}//改寫ini文件char entry[128] = {'\0'};snprintf(entry, 127, "isp.%d.night_to_day:night_to_day", rkipc_get_scenario_id(cam_id));rk_param_set_string(entry, value);return ret;
}

對ircut的操作由rk_isp_enable_ircut函數完成

rk_isp_enable_ircut函數

int rk_isp_enable_ircut(bool on) {int ret, open_gpio, close_gpio;//ircut_open_gpio = 36//ircut_close_gpio = 35open_gpio = rk_param_get_int("isp:ircut_open_gpio", -1);close_gpio = rk_param_get_int("isp:ircut_close_gpio", -1);if ((open_gpio < 0) || (close_gpio < 0)) {LOG_ERROR("fail get gpio form ini file\n");return -1;}//設置gpio方向ret = rk_gpio_export_direction(open_gpio, false);ret |= rk_gpio_export_direction(close_gpio, false);//設置值if (on) {rk_gpio_set_value(open_gpio, 1);usleep(100 * 1000);rk_gpio_set_value(open_gpio, 0);} else {rk_gpio_set_value(close_gpio, 1);usleep(100 * 1000);rk_gpio_set_value(close_gpio, 0);}//關閉gpio控制rk_gpio_unexport(open_gpio);rk_gpio_unexport(close_gpio);return ret;
}

gpio的編號計算

rv1106 GPIO的命名是GPIO{bank}_{group}{X},比如GPIO0_A0到A7,然后計算公式是pin = bank * 32 + (group * 8 + X)。例如,GPIO1_C7_d的bank是1,group是C對應2,X是7,所以計算是132 + (28+7)=55。(夸克說的)
本電路板的ircut+ 接 mx2804的 OUTB,ircut- 接 mx2804的 OUTA
mx2804的 INB 接 rv1106的pin114 GPIO2_A5_d 232+08+5=69
mx2804的 INA 接 rv1106的pin113 GPIO2_A4_d 232+08+4=68

rk_gpio_export_direction函數

該函數在luckfox-pico/project/app/rkipc/rkipc/src/rv1126_ipc_rkmedia/rk_gpio.c中

int rk_gpio_export_direction(uint32_t gpio, enum gpio_direction input) {int ret;//取得控制權ret = rk_gpio_export(gpio);if (ret < 0)goto out;//設置方向,真為輸入ret = rk_gpio_set_direction(gpio, input);if (ret < 0)rk_gpio_unexport(gpio);
out:return ret;
}

rk_gpio_export函數

#define GPIO_SYSFS_PATH "/sys/class/gpio"int rk_gpio_export(uint32_t gpio) {int ret;char file[64];//例如ircut+的GPIO為69, //file為"/sys/class/gpio/gpio69"ret = sprintf(file, "%s/gpio%d", GPIO_SYSFS_PATH, gpio);if (ret < 0)return ret;//如果gpio被占用if (!access(file, F_OK)) {printf("warning: gpio %d, file (%s) has exist\n", gpio, file);return 0;}return write_sysfs_int("export", GPIO_SYSFS_PATH, gpio);
}
int write_sysfs_int(const char *filename, const char *basedir, int val) {return _write_sysfs_int(filename, basedir, val, false);
}
//filename "export"
//basedir "/sys/class/gpio"
//val 69
//verify false
static int _write_sysfs_int(const char *filename, const char *basedir, int val, bool verify) {int ret = 0;FILE *sysfsfp;int test;char *temp = (char *)malloc(strlen(basedir) + strlen(filename) + 2);if (!temp)return -ENOMEM;//temp /sys/class/gpio/exportret = sprintf(temp, "%s/%s", basedir, filename);if (ret < 0)goto error_free;//寫打開/sys/class/gpio/exportsysfsfp = fopen(temp, "w");if (!sysfsfp) {ret = -errno;fprintf(stderr, "failed to open %s\n", temp);goto error_free;}//寫入要export的gpio編號ret = fprintf(sysfsfp, "%d", val);if (ret < 0) {if (fclose(sysfsfp))perror("_write_sysfs_int(): Failed to close dir");goto error_free;}//關閉if (fclose(sysfsfp)) {ret = -errno;goto error_free;}if (verify) {sysfsfp = fopen(temp, "r");if (!sysfsfp) {ret = -errno;fprintf(stderr, "failed to open %s\n", temp);goto error_free;}if (fscanf(sysfsfp, "%d", &test) != 1) {ret = errno ? -errno : -ENODATA;if (fclose(sysfsfp))perror("_write_sysfs_int(): Failed to close dir");goto error_free;}if (fclose(sysfsfp)) {ret = -errno;goto error_free;}if (test != val) {fprintf(stderr, "Possible failure in int write %d to %s/%s\n", val, basedir, filename);ret = -1;}}error_free:free(temp);return ret;
}

這樣系統就取得了gpio的控制權。

rk_gpio_set_direction函數

int rk_gpio_set_direction(uint32_t gpio, enum gpio_direction input) {int ret;char path[64];const char *direction = input ? "in" : "out";ret = sprintf(path, "%s/gpio%d", GPIO_SYSFS_PATH, gpio);if (ret < 0)return ret;return write_sysfs_string_and_verify("direction", path, direction);
}

和上面一樣,只是換成"direction"和gpio的路徑

rk_gpio_set_value

和上面差不多,最終調用write_sysfs_string_and_verify進行gpio管腳設置

int rk_gpio_set_value(uint32_t gpio, int value) {int ret;char path[64] = {0};char direction[8] = {0};ret = sprintf(path, "%s/gpio%d", GPIO_SYSFS_PATH, gpio);if (ret < 0)return ret;ret = read_sysfs_string("direction", path, direction);if (ret < 0)return ret;if (strcmp(direction, "out") != 0)return -EINVAL;return write_sysfs_int_and_verify("value", path, value);
}

rk_gpio_unexport函數

和rk_gpio_export相反,原理也差不多,通過write_sysfs_int(“unexport”, GPIO_SYSFS_PATH, gpio);進行取消控制權限。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897350.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Retrofit + RxJava + OkHttp 網絡請求高效封裝方案

Retrofit RxJava OkHttp 是 Android 開發中常用的網絡請求庫組合。Retrofit 是一個類型安全的 HTTP 客戶端&#xff0c;RxJava 是一個響應式編程庫&#xff0c;OkHttp 是一個高效的 HTTP 客戶端。 Retrofit RxJava OkHttp 的組合可以提供以下功能&#xff1a; 職責清晰 R…

【nRF52832】【Nodic】開發入門【三】模塊化

title: nRF52832開發入門【二】模塊化 tags: nodic categories: nodic abbrlink: 37752 date: 2025-03-09 17:22:17 1. 介紹 我們實際開發過程中往往會很復雜&#xff0c;為了更好的管理代碼&#xff0c;我們需要模塊化。模塊化的好處有很多&#xff0c;比如&#xff1a; 降…

爬蟲案例八js逆向爬取網易音樂

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、js逆向的前期準備二、網站分析三、代碼 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 爬取網易音樂 提示&#xff1a;以下是本篇…

vue2實現組件庫的自動按需引入,unplugin-auto-import,unplugin-vue-components

1.使用ant-design-vue或者element-ui時&#xff0c;如何每個組件都去import導入組件&#xff0c;大大降低了開發效率&#xff0c;如果全局一次性注冊會增加項目體積&#xff0c;那么如何實現既不局部引入&#xff0c;也不全局注冊&#xff1f; 2.在element-plus官網看到有說明…

【Andrej Karpathy 神經網絡從Zero到Hero】--2.語言模型的兩種實現方式 (Bigram 和 神經網絡)

目錄 統計 Bigram 語言模型質量評價方法 神經網絡語言模型 【系列筆記】 【Andrej Karpathy 神經網絡從Zero到Hero】–1. 自動微分autograd實踐要點 本文主要參考 大神Andrej Karpathy 大模型講座 | 構建makemore 系列之一&#xff1a;講解語言建模的明確入門&#xff0c;演示…

(二 十 二)趣學設計模式 之 備忘錄模式!

目錄 一、 啥是備忘錄模式&#xff1f;二、 為什么要用備忘錄模式&#xff1f;三、 備忘錄模式的實現方式四、 備忘錄模式的優缺點五、 備忘錄模式的應用場景六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xff0c;…

安裝SPSS后啟動顯示應用程序無法啟動,因為應用程序的并行配置不正確的解決方案

軟件安裝報錯問題有需要遠程文章末尾獲取聯系方式&#xff0c;可以幫你遠程處理各類安裝報錯。 一、安裝SPSS后啟動顯示應用程序無法啟動&#xff0c;因為應用程序的并行配置不正確報錯 在成功安裝 SPSS 軟件后&#xff0c;嘗試啟動應用程序時&#xff0c;系統彈出錯誤提示窗…

IP,MAC,ARP 筆記

1.什么是IP地址 IP 地址是一串由句點分隔的數字。IP 地址表示為一組四個數字&#xff0c;比如 192.158.1.38 就是一個例子。該組合中的每個數字都可以在 0 到 255 的范圍內。因此&#xff0c;完整的 IP 尋址范圍從 0.0.0.0 到 255.255.255.255。 IP 地址不是隨機的。它們由互…

C++11中的Condition_variable

C11中的condition_variable 在C11中&#xff0c;條件變量&#xff08;std::condition_variable&#xff09;是線程同步機制之一&#xff0c;用于在多線程環境中實現線程間的通信和協調。它允許一個或多個線程在某個條件尚未滿足時等待&#xff0c;直到其他線程通知條件已經滿足…

IO多路復用實現并發服務器

一.select函數 select 的調用注意事項 在使用 select 函數時&#xff0c;需要注意以下幾個關鍵點&#xff1a; 1. 參數的修改與拷貝 readfds 等參數是結果參數 &#xff1a; select 函數會直接修改傳入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…

_二級繼電器程控放大倍數自動設置

簡介 在開發項目中&#xff0c;有時會遇到需要使用程控放大的情況&#xff0c;如果沒有opa那種可編程放大器&#xff0c;那么就需要通過繼電器來控制放大倍數。而在繼電器程控中&#xff0c;常用的是二級程控&#xff0c;三級程控相較于二級就復雜了許多。 在二級程控中&#x…

電腦總顯示串口正在被占用處理方法

1.現象 在嵌入式開發過程中&#xff0c;有很多情況下要使用串口調試&#xff0c;其中485/422/232轉usb串口是非常常見的做法。 根據協議&#xff0c;接口芯片不同&#xff0c;需要安裝對應的驅動程序&#xff0c;比如ch340&#xff0c;cp2102&#xff0c;CDM212364等驅動。可…

優雅拼接字符串:StringJoiner 的完整指南

在Java開發中&#xff0c;字符串拼接是高頻操作。無論是日志格式化、構建CSV數據&#xff0c;還是生成動態SQL&#xff0c;開發者常需處理分隔符、前綴和后綴的組合。傳統的StringBuilder雖然靈活&#xff0c;但代碼冗余且易出錯。Java 8推出的StringJoiner類&#xff0c;以簡潔…

LabVIEW閉環控制系統硬件選型與實時性能

在LabVIEW閉環控制系統的開發中&#xff0c;硬件選型直接影響系統的實時性、精度與穩定性。需綜合考慮數據采集速度&#xff08;采樣率、接口帶寬&#xff09;、計算延遲&#xff08;算法復雜度、處理器性能&#xff09;、輸出響應時間&#xff08;執行器延遲、控制周期&#x…

Hive的架構

1. 概念 Hive 是建立在 Hadoop 上的數據倉庫工具&#xff0c;旨在簡化大規模數據集的查詢與管理。它通過類 SQL 語言&#xff08;HiveQL&#xff09;將結構化數據映射為 Hadoop 的 MapReduce&#xff0c;適合離線批處理&#xff0c;尤其適用于數據倉庫場景。 2. 數據模型 表&a…

深入解析:Linux中KVM虛擬化技術

這篇文章將深入分析Linux中虛擬化技術的實現----KVM技術&#xff0c;從KVM技術的簡介、技術架構、以及虛擬機和宿主機交互的重要處理邏輯出發&#xff0c;深入探究KVM技術的實現。 一、KVM簡介&#xff1a; 首先&#xff0c;我們先查看一下KVM架構&#xff0c;看看它的整體工…

golang學習筆記——go語言安裝及系統環境變量設置

文章目錄 go語言安裝go envgo getgoproxy測試安裝 Go 插件安裝 Go 插件依賴工具參考資料用戶環境變量和系統環境變量用戶環境變量系統環境變量示例設置環境變量的步驟設置用戶環境變量設置系統環境變量 驗證環境變量總結 2024年最火的5大Go框架1. Gin&#xff1a;高并發接口的“…

3.6c語言

#define _CRT_SECURE_NO_WARNINGS #include <math.h> #include <stdio.h> int main() {int sum 0,i,j;for (j 1; j < 1000; j){sum 0;for (i 1; i < j; i){if (j % i 0){sum i;} }if (sum j){printf("%d是完數\n", j);}}return 0; }#de…

【TI】如何更改 CCS20.1.0 的 WORKSPACE 默認路徑

參考鏈接&#xff1a; 如何更改 CCS Theia 中工作區的默認位置&#xff1f;- Code Composer Studio 論壇 - Code Composer Studio?? - TI E2E 支持論壇 --- How to change the default location for the workspace in CCS Theia? - Code Composer Studio forum - Code Comp…

Vue3中動態Ref的魔法:綁定與妙用

前言 在Vue 3的開發過程中,動態綁定Ref是一項非常實用的技術,特別是在處理復雜組件結構和動態數據時。通過動態綁定Ref,我們可以更靈活地訪問和操作DOM元素或組件實例,實現更高效的交互和狀態管理。本文將詳細介紹如何在Vue 3中實現動態Ref的綁定,并通過實例展示其妙用。…