
ISP是Image Signal Processor的縮寫,ISP圖像信號處理器的主要作用是對前端圖像傳感器輸出的信號做後期的處理。不同的ISP用來匹配不同廠商的圖像傳感器。 ISP的優異在整個攝像機產品中很重要,應當說它直接影響呈現給用戶的影響畫質的優劣。圖像經過圖像經過CCD或者CMOS的採集後,需要經過後期的處理才可以較好的適應不同的環境,在不同的光學條件下都能較好的還原出現場細節。在ISP中它會完成我們常常提及的2A(AWB/AE,自動白平衡/自動曝光)或者3A(AWB/AE/AF,自動白平衡/自動曝光/自動聚焦)。傳統模式下一般採用一顆DSP或者一顆FPGA來完成對圖像的後期處理。有些攝像機產品支持的3D降噪功能、寬動態、慢快門、幀累積、強光抑制等功能也都是ISP來完成的。
目前應用在高清攝像機產品中的ISP一般有以下幾個來源:
1. 廠商自行研發: 高清攝像機設備廠商為了更好的配合後端壓縮、功能開發,自行研發ISP處理算法,將算法集成至FPGA或DSP芯片中,接駁前端圖像傳感器。
2. 第三方研發: 2010年已經逐漸誕生了一批由非高清攝像機製造廠商推出的一些ISP解決方案,他們直接出售不同的ISP芯片給攝像機廠商配合不同廠商的Sensor。
3. 套片模式: 由Sensor廠商將自主開發的ISP結合自家Sensor形成圖像採集處理解決方案推向客戶,其中的圖像處理算法及各種調試工作已經完成,攝像機廠商只需要做接口對接併後端壓縮或轉換成數字視頻(HD-SDI)即可。這種模式我們稱為Stand-Alone Devices或者Camera System Onchip。
第一種來源方式具備較高的靈活性,使得開發者在選擇方案時擁有更多的組合(主要是選擇不同廠商的Sensor)。但是對於產品而言,一方面增加了整機的功耗、散熱等問題,另外也增加產品開發投入,也意味著研發高清攝像機產品的廠商需要更雄厚的技術實力。而後兩種來源方案無疑大大降低了產品開發的門檻,但相對自主研發ISP肯定要增加部分成本。設想如果有集成度更高的高清攝像機芯片解決方案,將ISP和視頻壓縮編碼功能融合在一起無疑是更好的選擇。
圖文資料轉載自「CPS中安網論壇安防百科」2013-11-19 14:50:03
作者: 安防小小兵ryan0988 發表在 痞客邦 留言(0) 人氣(4,549)
[此篇文章並非原創若有冒犯敬請來信告知]
360度全景攝影機掀話題
ryan0988 發表在 痞客邦 留言(0) 人氣(3,215)
NOR和NAND是現在市場上兩種主要的非揮發性快閃記憶體(Non-volatile memory)技術。Intel於1988年首先開發出NOR Flash技術,徹底改變了原先由EPROM和EEPROM一統天下的局面。緊接著,1989年,東芝公司發表了NAND flash結構,強調降低每bit的成本,更高的性能,並且像磁片一樣可以通過介面輕鬆升級。但是經過了十多年之後,仍然有相當多的硬體工程師分不清NOR和NAND快閃記憶體。
ryan0988 發表在 痞客邦 留言(0) 人氣(4,396)
1.根據TI的databook描述,可以選擇從AEMIF(NOR Flash)開機,就可以直接跳到0x02000000去執行放在NOR flash中的u-boot,但旺陽電的VanHelsing並沒有實作NOR flash到EVM board上。
2.因為有NFS/TFTP server,RD在開發期間似乎不需要額外的updater,不管是kernel image/device driver或gui application都可以在u-boot執行期間透過NFS或TFTP server將update file載入target,下command或使用script file都可以輕鬆完成update的動作。
3.u-boot本身兼具bootloader與monitor的功能,將monitor予以disable之後就成為正常的bootloader,如果安排short-cut key讓系統在boot期間(甚至OS在跑的期間也可以跳)跳到它的command handle routine,它就成為一個簡單的on-line debug tool,可以read/write flash、update image、update file system,如果可以加上dump CPU register、dump OS information等功能,或許透過serial port的console就可以滿足大多數的debug需求(它本身有一個exception handler可以做這些事,不過做完就當機,很麻煩)。
Tool Chain
Tool Path Description
GCC /opt/mv_pro_4.0/monstavista/ compiler and linker.
GDB pro/devkit/arm/v5t_le/bin/ software debug tool.
bmp_logo /u-boot/tools/ u-boot logo maker.
envsrc /u-boot/tools/ verify environment for u-boot.
gen_eth_addr /u-boot/tools/ generate ethernet MAC address.
img2srec /u-boot/tools/ make u-boot format image.
mkimage /u-boot/tools/ convert u-boot format image to SREC format.
updater /u-boot/tools/ u-boot auto updater.
U-Boot Command
1.bootp [loadAddress] [bootfilename]
要求DHCP server分配IP給target,然後透過TFTP下載指定的image到memory中。
第1個參數是destination address。
第2個參數是file name,這個file必須已經存在host的tftpboot/底下。
要注意serverip必須已經設定好。
2.tftpboot [loadAddress] [bootfilename]
使用tftp以binary file格式下載file到target。
第1個參數是destination address。
第2個參數是file name,這個file必須已經存在host的tftpboot/底下。
要注意serverip與ipaddr必須已經設定好,file必須已經存在host的tftpboot/底下。
3.nfs [loadAddress] [host ip addr:bootfilename]
使用nfs下載file到target上指定的位址,若未指定host ip, path以及target的address的話,會使用預設值下載kernel image。
第1個參數是destination address。
第2個參數是host端的path與file name。
要注意serverip與ipaddr必須已經設定好,host端的path與file必須已經export。
4.bootm [addr [arg ...]]
從RAM或Flash開機,uImage必須已經load好,rootfs的mount pointer也都指定好。
第1個參數是image address,image必須是u-boot格式。
第2個參數是要pass給kernel的argument,也可以做為RAMDISK address。
5.erase all
erase [start add.] [end add.]
erase bank N
可以設定erase整個nor flash,或指定的區域,或某個bank。
6.nand
nand info - 顯示所有可用的nand flash.
nand read[.jffs2[s]] addr off size - 從」off」讀」size」大小的資料到」addr」,addr指的是memory,off指的是flash。
nand write[.jffs2] addr off size - 從」addr」寫」size」大小的資料到」off」。
nand erase [clean] [off size] - 從」off」開始,清除」size」大小的資料。
nand bad - 顯示壞掉的block。
7.flinfo
flinfo N
可以列出flash所有bank的infomation或只列印指定的bank。
8.iminfo addr [addr ...]
可以列出指定address的data的header。
9.loadb [offset] [baudrate]
透過serial port下載binary data。
10.loads [offset]
透過serial port下載S-Record的data。
11.printenv [name]
印出environment variable的value,若未指定variable則印出全部。
12.setenv name [value]
設定environment variable。
13.md address [address]
印出指定位址(區域)的hex data。
U-Boot Souce Code Architecture
Dirctory Explain
board board dependent files and u-boot.lds.
cpu CPU specific files
lib_arm
common misc architecture independent functions
disk source code for disk driver.
doc simple document for u-boot.
drivers commonly used device drivers
dtt Digital Thermometer and Thermostat drivers
fs source cdoe for file system support
include header Files
lib_generic files generic to all architectures
net networking code
post Power On Self Test
rtc Real Time Clock drivers
tools Tools to build S-Record or U-Boot images, etc.
examples Example code for standalone applications, etc.
Booting Code Trace
由於使用JTAG的reset pin開機會因為RBL所做的hardware check而導致系統停在RBL不出來,所以RBL、UBL與部份的u-boot可能都沒辦法逐行trace,不過可以在u-boot進入main_loop之後再connect CCStudio,至少可以監看network behavior、load/Uncompressing image的動作,也可以監看到kernel開始run的過程。
UBL Source Code Trace
Function Description
selfcopy()
1)Enable ITCM與DTCM。
2)將__selfcopysrc中的資料搬到__selfcopydest中。
3)呼叫boot()。
boot()
1)設定為supervisor mode,disable FIQ & IRQ。
2)將Interrupt Vector Table放到ARM RAM1(0x2000)的位置。
3)設定Stack Pointer。
4)執行main()。
5)執行main()從flash或uart端搬進DDR2的application。
main()
1)執行PSCInit(),初始化Power & Sleep Control的feature。
2)檢查BOOTCFG的第6~7個bit,若為0則表示從NAND開機,若為1則表示從NOR開機,若都不
是則進入無窮迴圈等待RBL對UART的存取結束。
3)呼叫DM644xInit(),對UARTs/PLL1/PLL2/DDR2/IVT做initial。
4)將current_mem_loc設為0,也就是RAM0開始的位置(0x0000)。
5)分別呼叫NAND_Copy()與NOR_Copy(),到flash中去尋找符合的application,並且將它搬
到DDR2中。
6)若flash中沒有符合的applcation,則使用UART下載。
7)application放進DDR2之後,return回boot(),執行application。
PSCInit()
1) PSC是Power and Sleep Control的意思。
2)Reset DSP core,Power on internal component。
3)設定EMURSTIE。
4)設定」Always on」與」DSP」兩部份的power domain。
5)清除EMURSTIE。
ryan0988 發表在 痞客邦 留言(0) 人氣(325)

DM6441的開機選項
Power on,根據BOOTCFG register,共有四種開機選項:
1.BOOTCFG=0x01, EMIFA boot mode, 直接從NOR flash(0x02000000)開始執行。
2.BOOTCFG=0x00, NAND boot mode, 從internal ROM執行RBL,RBL將UBL從NAND載入internal RAM, UBL將u-boot從NAND載入DDR,u-boot將uImage載入DDR,執行權交給OS。
3.BOOTCFG=0x02, HPI boot mode, External CPU透過HPI(I2C, SPI, USB2.0, VLYNQ) 將UBL載入,餘同 上。
4.BOOTCFG=0x03, UART boot mode, Host透過serial port將UBL載入,餘同上。
DM6441的開機流程
1.RBL不能修改,而真正做hardware initial與load kernel image的是u-boot,所以只要是從internal ROM開機,就需要在RBL的search path上放置它讀得懂的code(UBL),讓UBL去load boot loader。
2.Internal RAM只有16kb,但UBL目前有14kb,u-boot則是96~115kb不等,所以想要把u-boot結合UBL放進internal RAM有困難。
3.可以考慮直接從NOR flash執行u-boot開機,減少search NAND flash與驗證的時間。但有hardware成本問題。
4.可以考慮使用u-boot做為updater,因為u-boot執行期間OS/Driver/GUI都還沒載入,所以可以update完直接開機。
5.恐怕Service Center需要可以off-line操作且具有GUI的updater,可能還需要support USB與SD card driver與file system,這樣就得porting Angelus I所使用的updater給Angelus II使用。
6.恐怕工廠的selftester也會有跟updater一樣的需求,而且selftester可能需要載入大多數的driver。
VanHelsing EVM board的開機流程
ryan0988 發表在 痞客邦 留言(0) 人氣(861)
偶然逛到別人的網站找到的
该实现中创建了两个队列,一个empty队列,用于存放预分配的缓冲区,也就是一个缓存池,另外一个是full队列。实际使用中,写者从empty队列中获取一个队列项,并将数据写入该队列项指定的地址,然后将该队列项放入full队列。读者从full队列中获得一个队列项,然后对这个队列项进行处理,处理完后将这个队列项重新放入empty队列中。
#include <osa_buf.h>
#include <string.h>
int OSA_bufDelete(OSA_BufHndl *hndl)
{
int status = OSA_SOK;
if(hndl == NULL)
return OSA_EFAIL;
status = OSA_queDelete(&hndl->emptyQue);
status |= OSA_queDelete(&hndl->fullQue);
return status;
}
int OSA_bufCreate(OSA_BufHndl *hndl, OSA_BufCreate *bufInit)
{
int status = OSA_SOK;
int i;
if(hndl == NULL || bufInit == NULL)
return OSA_EFAIL;
if(bufInit->numBuf > OSA_BUF_NUM_MAX)
return OSA_EFAIL;
memset(hndl, 0, sizeof(OSA_BufHndl));
status = OSA_queCreate(&hndl->emptyQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
status = OSA_queCreate(&hndl->fullQue, bufInit->numBuf);
if(status != OSA_SOK) {
OSA_queDelete(&hndl->emptyQue);
OSA_ERROR("OSA_bufCreate() = %d \r\n", status);
return status;
}
hndl->numBuf = bufInit->numBuf;
for(i = 0; i < hndl->numBuf; i++) {
hndl->bufInfo[i].size = 0;
hndl->bufInfo[i].flags = 0;
hndl->bufInfo[i].timestamp = 0;
hndl->bufInfo[i].physAddr = bufInit->bufPhysAddr[i];
hndl->bufInfo[i].virtAddr = bufInit->bufVirtAddr[i];
OSA_quePut(&hndl->emptyQue, i, OSA_TIMEOUT_FOREVER);
}
return status;
}
int OSA_bufSwitchFull(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetEmpty(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutFull(hndl, *bufId);
*bufId = newBufId;
}
return status;
}
int OSA_bufSwitchEmpty(OSA_BufHndl *hndl, int *bufId)
{
int status;
int newBufId;
status = OSA_bufGetFull(hndl, &newBufId, OSA_TIMEOUT_NONE);
if(status == OSA_SOK) {
if(*bufId != OSA_BUF_ID_INVALID)
OSA_bufPutEmpty(hndl, *bufId);
*bufId = newBufId;
}
return status;
}
ryan0988 發表在 痞客邦 留言(0) 人氣(36)
mt9d131 效果一般, 因为海思带它的驱动, 所以用的人还挺多, 呵呵.
很多芯片的驱动比较简单, 就是直接给某个寄存器赋某个值, 就ok, 具体这个寄存器是什么意思, 值是什么意思, 看datasheet就可以了.
mt9d131 要略微复杂一点
因为 mt9d131 里面可以配置的东西很多, 所以 mt9d131 把可以设置的东西分成3类
ryan0988 發表在 痞客邦 留言(0) 人氣(109)