導航:首頁 > 源碼編譯 > 源碼控制單反

源碼控制單反

發布時間:2023-09-03 13:03:46

㈠ 【Camera專題】Camera驅動源碼全解析_下

1、手把手擼一份驅動 到 點亮 Camera
2、Camera dtsi 完全解析
3、Camera驅動源碼全解析上
4、Camera驅動源碼全解析下
上篇文章分析了C文件函數的實現,本文繼續分析h文件的配置信息。

推薦文章:
MIPI CSI2學習(一):說一說MIPI CSI2
高通camera驅動分析

參照sensor規格書或者咨詢fae,配置:

2.1 sensor幀的輸出和關閉

sensor以流的方式 輸出幀.

2.2 開啟sensor 端的group 功能

開啟sensor 端的group 功能,將曝光(line),gain等打包,保證在同一幀進去生效

2.3 sensor嵌入式數據

2.4 sensor初始化相關寄存器

2.5 sensor解析度相關寄存器

以上的sensor寄存器配置一般有fae廠商提供,驅動工程師盡可能的掌握相關寄存器代表的含義。
如控制寬高、幀率、曝光等等寄存器

我們只用到16位,因此
sensor_id_reg_addr = 0x300b,
sensor_id = 0x0D42,

曝光時間以行長為單位; PCLK以Hz為單位;
行長以周期數為單位,幀長以行長數為單位;其中周期數就是頻率
T 周期以ms為單位;
f 頻率以Hz為單位;
f = 1 / T;

可以參考這篇文章:
camera曝光和幀率_songqiangzmt的博客

比如這里又3個寄存器,每個寄存器是8bit:
max_linecount = 0x ff ff -8

暫時沒弄清楚

這里指的是暗電流值,
一般來說 raw8 都是 16, raw10為 16x4=64, raw12 =16x4x4

感測器可以流式傳輸許多不同的 數據類型(DT)
該數據被包裝在不同的流中。 在一個流中,可以有一個或多個不同的DT。 一種 虛擬通道(VC) 分配給每個流。 DT和VC的組合應為唯一,並分配了一個通道ID(CID)。
有關如何指定CID的要求/限制。 當前的MIPI CSI_Rx支持四個VC,每個VC最多可以有四個CID,如下表所示。

感測器可能具有內置的pattern generator。 通過設置專用寄存器,感測器可以將生成的圖案輸出。

當出現圖像異常時,可以使用此功能看看sensor本身輸出是否有問題。

binning_factor主要是用來控制拍照亮度跟預覽亮度一致的,當然也可以解決預覽噪點過大的問題!
3A演算法里,曝光時間 snap_exp_time *= (float)(binning_multiplier);

3A源碼

賦值源碼

關鍵日誌:

CSI :Camera Serial Interface 定義了一個位於處理器和攝像模組之間的高速串列介面

為使CSI_Tx(感測器)和CRI_Rx(設備)正常工作,需要一段時間它們之間需要同步。
此時間在此處設置為計時器時鍾滴答數。 它必須介於公式計算的MIN和MAX值之間
MIN [Settle count * T(Timer clock)] > T(HS_SETTLE)_MIN
MAX [Settle count * T(Timer clock)] < T(HS-PREPARE)+T(HS_ZERO) - 4*T(Timer clock)

settle_cnt(即穩定計數)– 必須根據感測器輸出特性配置該值,以確保感測器的 PHY
發送器與 MSM 的 PHY 接收器無障礙同步。
對於 28 nm 以及更小的 MSM 晶元,使用以下公式計算穩定計數:
settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),
其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如傳
感器數據表所指示

如果sensor可以直接流式傳輸HDR幀,該函數才有用。

這里的 rolloff compensations = Lens Shading Correction (LSC)
有些sensor可以自己內部做lsc補償。rolloff_config就是用了配置sensor的這些信息。

注意:如果你使用了sensor LSC補償,平台端 lsc補償就要關閉,否則雙倍補償,可能會造成圖片失真。

typedef enum {
SENSOR_DELAY_EXPOSURE, /* delay for exposure /
SENSOR_DELAY_ANALOG_SENSOR_GAIN, / delay for sensor analog gain /
SENSOR_DELAY_DIGITAL_SENSOR_GAIN, / delay for sensor digital gain /
SENSOR_DELAY_ISP_GAIN, / delay for sensor ISP (error) gain*/
SENSOR_DELAY_MAX,
} sensor_delay_type_t;

SENSOR_DELAY_EXPOSURE – Sets the exposure of frame N at frame N + delay
SENSOR_DELAY_ANALOG_SENSOR_GAIN – Sets the analog gain register at frame N + delay
SENSOR_DELAY_DIGITAL_SENSOR_GAIN – Sets the digital gain register at frame N + delay
SENSOR_DELAY_ISP_GAIN – Passes the isp digital gain to the isp mole at frame N + delay

如果出現ae閃爍問題,可以嘗試修改延遲,讓gain和expose同步。

This is the readout time (in nanoseconds) of the sensor』s analog-to-digital converter. Usually it is
the minimum line time when the sensor is running at the maximum pixel clock.
NOTE: This is the sensor mole』s own information. Refer to the sensor vendor for more information

noise_coeff 小波里用來定義雜訊的模板
雜訊系數模型: N(x) = sqrt(Sx + O)

這些參數一般由tunning團隊修改。

關於角度

注意:
如果 <MountAngle>360</MountAngle>; 這個值配置成360度,那麼以dtsi配置的角度為准。

源碼:

關於幀率
https://www.cnblogs.com/ZHJEE/p/10351155.html

繼續當一名咸魚( ̄︶ ̄)!

㈡ 知道源代碼有什麼好處要源代碼用了干什麼

要回源代碼有什麼好處?

,我認為客戶出錢買的就是源碼,那商家就應給客戶源碼;不給客戶源碼或給客戶的源碼是雀襲加密的,都是對客戶的侵權;有些公司給客戶建站,他的源碼只能用他的空間,客戶不僅見不到源碼,每年還要向公司交上千元的維護費用;我在網路公司做過這事我知道,什麼維護,就是維持向客戶要錢,沒有任何保護而已;客戶花錢買的源碼客戶就有權用在任何自己的空間上;而不受任何約束;當然客戶不能去出售人家的源碼,那樣對商家造成損失,客戶也要成擔責任.

源代碼是做什麼的?知道了源代碼能做什麼?

源代碼就是源程序

源代碼,是指未編譯的文本代碼。是一系列人類可讀的計算機語言指令。

在現代程序語言中,源代碼可以是以書籍或者磁帶的形式出現,但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼的最終目的是將人類可讀的文本翻譯成為計算機可以執行的二進制指令,這種過程叫做編譯,通過編譯器完成。

作用

源代碼主要功用有如下2種作用:

生成目標代碼,即計算機可以識別的代碼。

對軟體進行說明,即對軟體的編寫進行說明。為數不少的初學者,甚至少數有經驗的程序員都忽視軟體說明明斗的編寫,因為這部分雖然不會在生成的程序中直接顯示,也不參與編譯。但是說明對軟體的學習、分享、維護和軟體復用都有巨大的好處。因此,書寫軟體說明在業界被認為是能創造優秀程序的良好習慣,一些公司也硬性規定必須書寫。

需要指出的是,源代碼的修改不能改變已經生成的目標代碼。如果需要目標代碼做出相應的修改,必須重新編譯。

代碼組合

源代碼作為軟體的特殊部分,可能被包含在一個或多個文件中。一個程序不必用同一種格式的源代碼書寫。例如,一個程序如果有C語言庫的支持,那麼就可以用C語言;而另一部分為了達到比較高的運行效率,則可以用匯編語言編寫。

較為復雜的軟體,一般需要數十種甚至上百種的源代碼的參與。為了降低種復雜度,必須引入一種可以描述各個源代碼之間聯系,並且如何正確編譯的系統。在這樣的背景下,修訂控制系統(RCS)誕生了,並成為研發者對代碼修訂的必備工具之一。

還有另外一種組合:源代碼的編寫和編譯分別在不同的平台上實現,專業術語叫做軟體移植。

版權

如果按照源代碼類型區分軟體,通常被分為兩類:自由軟體和非自由軟體。自由軟體一般是不僅可以免費得到,而且公開源代碼;相對應地,非自由軟體則是不公開源代碼。所有一切通過非正常手段獲得非激歲磨自由軟體源代碼的行為都將被視為非法。

質量

對於計算機而言,並不存在真正意義上的「好」的源代碼;然而作為一個人,好的書寫習慣將決定源代碼的好壞。源代碼是否具有可讀性,成為好壞的重要標准。軟體文檔則是表明可讀性的關鍵。

效率

雖然我們可以通過不同的語言來實現計算機的同一功能,但在執行效率上則存在不同。普遍規律是:越高級的語言,其執行效率越低。這也是為什麼匯編語言生成的文件比用VB語言生成文件普遍要小的原因。

㈢ 求一個控制攝像頭小程序的源碼,要求VC下編譯運行

VC-攝像頭控制SDK源碼
#include <windows.h>
#include <stdio.h>
#include <vfw.h>
#pragma comment(lib,"vfw32.lib")

HWND ghWndCap ; //捕獲窗的句柄
CAPDRIVERCAPS gCapDriverCaps ; //視頻驅動器的能力
CAPSTATUS gCapStatus ; //捕獲窗的狀態
char szCaptureFile[] = "MYCAP.AVI";
char gachBuffer[20];

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

LRESULT CALLBACK StatusCallbackProc(HWND hWnd,int nID,LPSTR lpStatusText)
{
if(!ghWndCap)return FALSE;//獲得捕獲窗的狀態
capGetStatus(ghWndCap,&gCapStatus,sizeof(CAPSTATUS));//更新捕獲窗的大小
SetWindowPos(ghWndCap,NULL,0,0,gCapStatus.uiImageWidth,gCapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
if(nID==0){//清除舊的狀態信息
SetWindowText(ghWndCap,(LPSTR)"hello");
return (LRESULT)TRUE;
}//顯示狀態ID和狀態文本
wsprintf(gachBuffer,"Status# %d: %s",nID,lpStatusText);
SetWindowText(ghWndCap,(LPSTR)gachBuffer);
return (LRESULT)TRUE;
}
LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
{
if(!ghWndCap)return FALSE;
if(nErrID==0)return TRUE;//清除舊的錯誤
wsprintf(gachBuffer,"Error# %d",nErrID);//顯示錯誤標識和文本
MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
return (LRESULT) TRUE;
}

LRESULT CALLBACK FrameCallbackProc(HWND hWnd,LPVIDEOHDR lpVHdr)
{
FILE *fp;
fp=fopen("caram.dat","w");
if(!ghWndCap)return FALSE;//假設fp為一打開的.dat文件指針
fwrite(lpVHdr->lpData,1,lpVHdr->dwBufferLength,fp);
return (LRESULT)TRUE;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
static TCHAR szAppName[]=TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("This program requires WindowsNT!"),szAppName,MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message)
{
case WM_CREATE:
{
ghWndCap=capCreateCaptureWindow((LPSTR)"Capture Window",WS_CHILD|WS_VISIBLE,0,0,300,240,(HWND)hwnd,(int)0);
capSetCallbackOnError(ghWndCap,(FARPROC)ErrorCallbackProc);
capSetCallbackOnStatus(ghWndCap,(FARPROC)StatusCallbackProc);
capSetCallbackOnFrame(ghWndCap,(FARPROC)FrameCallbackProc);
capDriverConnect(ghWndCap,0); // 將捕獲窗同驅動器連接
//獲得驅動器的能力,相關的信息放在結構變數gCapDriverCaps中
capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS));
capPreviewRate(ghWndCap, 66); // 設置Preview模式的顯示速率
capPreview(ghWndCap, TRUE); //啟動Preview模式
if(gCapDriverCaps.fHasOverlay) //檢查驅動器是否有疊加能力
capOverlay(ghWndCap,TRUE); //啟動Overlay模式
if(gCapDriverCaps.fHasDlgVideoSource)capDlgVideoSource(ghWndCap); //Video source 對話框
if(gCapDriverCaps.fHasDlgVideoFormat)capDlgVideoFormat(ghWndCap); // Video format 對話框
if(gCapDriverCaps.fHasDlgVideoDisplay)capDlgVideoDisplay(ghWndCap); // Video display 對話框
capFileSetCaptureFile( ghWndCap, szCaptureFile); //指定捕獲文件名
capFileAlloc(ghWndCap, (1024L * 1024L * 5)); //為捕獲文件分配存儲空間
capCaptureSequence(ghWndCap); //開始捕獲視頻序列
capGrabFrame(ghWndCap); //捕獲單幀圖像

}

return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("Hello,Windows98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_DESTROY:
{
capSetCallbackOnStatus(ghWndCap,NULL);
capSetCallbackOnError(ghWndCap,NULL);
capSetCallbackOnFrame(ghWndCap,NULL);
capCaptureAbort(ghWndCap);//停止捕獲
capDriverDisconnect(ghWndCap); //將捕獲窗同驅動器斷開
PostQuitMessage(0);
}
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

閱讀全文

與源碼控制單反相關的資料

熱點內容
js如何運行時編譯 瀏覽:915
引力app在哪裡下載 瀏覽:607
編寫app如何得到錢 瀏覽:800
吉利汽車軟體放哪個文件夾安裝 瀏覽:223
多文件編譯c 瀏覽:541
頭頂加密後為什麼反而更稀疏 瀏覽:793
離心機壓縮機揚程高 瀏覽:658
xshell連接linux命令 瀏覽:5
把多個文件夾的內容合並在一起 瀏覽:483
基於單片機的澆花系統設計ppt 瀏覽:685
卷積碼編解碼及糾錯性能驗證實驗 瀏覽:354
請在刪除驅動器之前暫停加密什麼意思 瀏覽:787
光催化pdf 瀏覽:98
java字元串包含某字元 瀏覽:528
ssm身份認證源碼 瀏覽:466
預排序遍歷樹演算法 瀏覽:671
加密裝置如何打開ping功能 瀏覽:479
python下載372 瀏覽:902
u盤子文件夾隱藏 瀏覽:297
本地誤刪svn文件夾 瀏覽:687