Tìm hiểu và viết chương trình cơ chế nhận và xuất tín hiệu video sử dụng card ADSP BF533 Yêu cầu: Ngôn ngữ lập trình sử dụng CC++Assemly… Chương trình cần phải nhận và xuất dòng dữ liệu video từ card trên.
Trang 1Trang 1
LỜI CẢM ƠN
Chúng em xin chân thành cám ơn thầy TS.Đặng Thành Tín và thầy Huỳnh Xuân Cảnh đã tận tình hướng dẫn, chỉ bảo và nhắc nhở những thiếu sót trong đề tài Chính sự nhiệt tình chỉ dẫn của các thầy đã giúp chúng em hoàn thành đồ án khá tốt, đạt được những yêu cầu cơ bản
mà đề tài đặt ra Và qua đó, chúng em đã hiểu thêm về card giao tiếp video qua máy tính… Mặc dù có thể còn một vài thiếu sót nhưng dù sao chúng em cũng đã cố gắng hết sức để hoàn thành đề tài này Chúng em xin chân thành cám ơn các thầy
Bên cạnh đó, chúng em xin chân thành gửi lời cám ơn đến Phòng máy tính – Khoa Điện - Điện tử đã tạo điện kiện tốt nhất để nhóm chúng em có thể hoàn thành đồ án
Chúng em xin gửi lời cám ơn đến tất cả
Tp.Hồ Chí Minh, ngày 19 tháng 06 năm 2013 Nhóm sinh viên thực hiện
Thiều Hữu Trung
Lê Quang Long
Trang 2Phần A: GIỚI THIỆU ĐỀ TÀI……… Trang3
I.YÊU CẦU ĐỀ TÀI ……… Trang3
II.HƯỚNG TÌM HIỂU……… Trang3
PHẦN B: NỘI DUNG ĐỀ TÀI……… Trang4
1 Tổng quan về ADSP BF533 Processor:……… Trang4
2 Sơ đồ mắc dây và cách vận hành sử dụng Card ADSP BF533………Trang6
3 Nội dung soure code ShowFrame.c:……… … Trang7
3.1Một vài thông số ban đầu:……….……… Trang7
Trang 3Trang 3
Phần A: GIỚI THIỆU ĐỀ TÀI
I.Yêu cầu của đề tài :
Đề tài số 10: Tìm hiểu và viết chương trình cơ chế nhận và xuất tín hiệu video sử dụng
card ADSP BF533
Yêu cầu:
- Ngôn ngữ lập trình sử dụng C/C++/Assemly…
- Chương trình cần phải nhận và xuất dòng dữ liệu video từ card trên
II Hướng tìm hiểu:
Tìm hiểu tổng quan phần cứng và cách vận hành của card ADSP BF533
Đọc tìm hiểu sour code ShowFrame.c
Cách thức thay đổi thới gian bắt ảnh và cách bắt ảnh từ Dish video từ đầu DVD qua card ADSP BF533
Trang 4Trang 4
Phần B : NỘI DUNG ĐỀ TÀI
1 Tổng quan về ADSP BF533 Processor:
ADSP – BF533 là một trong những bộ vi xử lý thuộc họ Blackfin (ADSP – BF532, ADSP – BF532) có hiệu suất lớn hơn, công suất thấp sơn nhưng chúng dễ dàng tương thích code hơn những bộ vi xử lý trước
Hệ thống thiết bị ngoại vi liên quan đến bộ vi xử lý này:
➢ Parallel Peripheral Interface (PPI)
➢ Serial Ports (SPORTs)
➢ Serial Peripheral Interface (SPI)
➢ General-Purpose timers
➢ Universal Asynchronous Receiver Transmitter (UART)
➢ Real-Time Clock (RTC)
➢ Watchdog timer
➢ General-purpose I/O (programmable flags)
Sơ đồ khồi của bộ vi xử lý:
Trang 5Trang 5
Trang 6Trang 6
2 Sơ đồ mắc dây và cách vận hành sử dụng Card ADSP BF533:
2.1 Sơ đồ mắc dây vào Card ADSP BF533:
2.2 Cách vận hành :
Bước 1: Lắp dây như trên Khởi động máy tính , đầu đĩa DVD và cấp nguồn cho Card
Bước 2: Cho chương trình VisualDSP+++ và đầu đĩa DVD chạy
Bước 3: Mở sourecode ShowFrame và chạy trên VisualDSP+++
Bước 4: Buid sourecode lên card và sau đó cho Run rồi quan sát kết quả thu được Nếu chưa có thì thực hiện lại các bước trên
Dây từ đầu CD
Dây từ card ra và chuyển thành S-video
để vào TV
SW1 và SW2 (ở mặt sau) tất cả off
SW3: 1-5 OFF
6 ON
SW9: 1-4 ON 5-6 OFF
Nguồn cho card
Cổng USB nối với máy tính
Trang 7Trang 7
2 Nội dung soure code ShowFrame.c:
3.1 Một vài thông số ban đầu:
#define USE_LOOPBACK // sử dụng vòng lặp
#define PAL_FRAME //sử dụng khung hình song song
=> set các thông số như sau:
#if defined(PAL_FRAME) // nếu sử dụng khung hình song song
#define FRAME_DATA_LEN 1728 // Chiều dài dữ liệu trên một hàng PAL video
#define NUM_LINES 625 // Số hàng trên một khung hình
#define ACTIVE_FIELD1 22 // số hàng của first active field1
#define ACTIVE_FIELD2 335 // số hàng của of first active field2
#define HORIZONTAL_BLANKING 72 // chiều rộng (32bits) của horizontal blanking
#define NUM_LINES_ACTIVE 288 // Số hàng chủ động trên một khung hình
#else
…
#endif
Kích thước của một khung hình=FRAME_DATA_LEN*NUM_LINES=1728*625
#define FRAME_SIZE FRAME_DATA_LEN*NUM_LINES
Chiều dài dữ liệu trên một hàng PAL video, 32 bit=FRAME_DATA_LEN/4=1728/4=432
#define FRAME_DATA_LEN_32BIT FRAME_DATA_LEN/4
int Resultat=0; // response count
// initialize the system services
InitSystemServices();
// enable all LED's
for(j=0;j<EZ_NUM_LEDS;j++)
Trang 8// initialize the device manager
Resultat = adi_dev_Init(DevMgrData, // pointer to data for the device manager to use
sizeof(DevMgrData), // size of the data in bytes
&ResponseCount, // location where the number of devices that
//can be managed will be stored &DeviceManagerHandle,// location where the device manager
//handle will be stored NULL); // parameter for adi_int_EnterCriticalRegion() function
//(always NULL for standalone and VDK)
StartADV7183();
StartADV7171();
//last button(SW7) isn't pushed => work
while (ezIsButtonPushed(EZ_LAST_BUTTON) == FALSE) ;
// close the device
Trang 9// initialize the interrupt manager
ezErrorCheck( adi_int_Init(IntMgrData, // pointer to memory for interrupt manager to use sizeof(IntMgrData), // memory size (in bytes)
&i, // location where the number of secondary handlers
//that can be supported will be stored NULL)); // parameter for adi_int_EnterCriticalRegion
//(always NULL for VDK and standalone systems)
// hook the exception and hardware error interrupts
ezErrorCheck( adi_int_CECHook(3, ExceptionHandler, NULL, FALSE));
ezErrorCheck( adi_int_CECHook(5, HWErrorHandler, NULL, FALSE));
// initialize the dma manager
ezErrorCheck(adi_dma_Init(DMAMgrData, // pointer to memory for the DMA manager to
//use sizeof(DMAMgrData), // memory size (in bytes)
&i, // location where # of DMA channels is stored &DMAManagerHandle,// location where DMA manager handle is
//stored NULL)); // parameter for adi_int_EnterCriticalRegion
//(always NULL for VDK and standalone systems) // return
}
3.4 ezInit:
*Thanh ghi pEBIU_AMGCTL
Trang 10Trang 10
EBIU_AMGCTL = 0x00FF
AMCKEN=1: kích hoạt CLKOUT
AMBEN=111: cả 4 bank0, bank1, bank2, bank3 kích hoạt
CDPRIO=0: lõi được ưu tiên hơn DMA cho sự truy cập từ bên ngoài
*Thanh ghi EBIU_AMGCTL0
Trang 11Trang 11
*Thanh ghi EBIU_AMGCTL1
Trang 12Trang 12
Giá trị: EBIU_AMGCTL0=0x7bb07bb0; EBIU_AMGCTL1=0x7bb07bb0
BxRDYEN và BxRDYPOL đều = 0: không có ARDY
BxTT=00: thời gian chuyển dịch của bank x: 4 chu kì
BxST=11: thời gian cài đặt cùa bank x: 3 chu kì
BxHT=10: thời gian chờ của bank x: 2 chu kì
BxRAT=b16=10112: thời gian đọc của bank x: 11 chu kì
BxWAT=716=01112: thời gian ghi của bank x: 7 chu kì
x= 0,1,2,3
code
Trang 13Trang 13
void ezInit(u32 NumCores)
{
// configure async memory
#if defined( ADSP_EDINBURGH ) // ADSP-BF533 EZ-Kit specific info
*pEBIU_AMBCTL0 = 0x7bb07bb0; // Write access time = 7 cycles, read access time = 11
//cycles, no ARDY *pEBIU_AMBCTL1 = 0x7bb07bb0; // Hold time = 2 cycles, setup time = 3 cycles,
//transition time = 4 cycles *pEBIU_AMGCTL = 0x00FF;
#endif
// configure flash
#if defined( ADSP_EDINBURGH ) // ADSP-BF533 EZ-Kit specific info
*pFlashA_PortA_Out = 0; // resets port A to initial value
*pFlashA_PortA_Dir = 0xFF; // configure everything on port A as outputs
*pFlashA_PortB_Out = 0; // resets port B to initial value
*pFlashA_PortB_Dir = 0x3f; // configure everything on port B as outputs
ezEnableVideoDecoder();// enable AD7183
ezDelay(500); // wait for 7183 to come out of reset
// open the ad7183 driver
ezErrorCheck(adi_dev_Open(DeviceManagerHandle, // DevMgr handle
Trang 14Trang 14
&ADIADV7183EntryPoint, // pdd entry point
(void *)0x7183, // client handle (0x7183 will be
//given to the AD7183 decoder //driver)
&AD7183DriverHandle, // DevMgr handle for this
//device ADI_DEV_DIRECTION_INBOUND,// data direction for this device DMAManagerHandle, // handle to DmaMgr for this
//device
CallbackFunction)); // client's callback function
/********* open AD7183-PPI **************************************/
//Send Pseudo TWI Configuration table to AD7183 if register configuratian is needed
//ezErrorCheck(adi_dev_Control(AD7183DriverHandle,ADI_AD7183_CMD_SET_TWI_CON FIG_TABLE,(void*)PseudoTWIConfig));
// open the AD7183-PPI device 0 (see Schematic)
ezErrorCheck(adi_dev_Control(AD7183DriverHandle, ADI_AD7183_CMD_OPEN_PPI, (void *)0));
/******************* AD7183 Inbound Buffers ***************************/
// populate the buffers that we'll use for the PPI input
Trang 15/********* AD7183 registers access **************************************/
// Send Pseudo TWI Configuration table to AD7183 if register configuratian is needed
ezErrorCheck(adi_dev_Control(AD7183DriverHandle,ADI_AD7183_CMD_SET_TWI_CONF IG_TABLE,(void*)PseudoTWIConfig));
// do the register configuration here if needed
}
Trang 16ezEnableVideoEncoder();// enable AD7171
//ezDisableVideoEncoder();// enable AD7171
// open the ad7171 driver
ezErrorCheck(adi_dev_Open( DeviceManagerHandle, // device manager
//handle &ADIADV7171EntryPoint, // entry point of device driver to open
0, // the device number (0th AD7171)
(void *)0x7171, // client handle (0x7171 will be given
//to the AD7171 encoder driver) &AD7171DriverHandle, // location where AD7171 device
//driver handle will be stored ADI_DEV_DIRECTION_OUTBOUND,// direction the device is
//to be opened DMAManagerHandle, // DMA Manager handle
NULL, // DCB handle (NULL cause we want live
//callbacks) CallbackFunction)); // address of callback function
// configure the AD7171 driver(Set PPI Device number)
Trang 17// populate AD7171 outbound buffers
Out1_Buffer2D.Data = (void*)sFrame0;// address of the data storage
Out1_Buffer2D.pNext = &Out2_Buffer2D;// point to the next buffer in the chain
Out2_Buffer2D.Data = (void*)sFrame1;// address of the data storage
Out2_Buffer2D.ElementWidth = sizeof(u32);
Out2_Buffer2D.XCount = (FRAME_DATA_LEN/2);
Trang 18Out2_Buffer2D.pNext = NULL;// terminate the chain of buffers
// configure the ad7171 dataflow method
Trang 19Trang 19
Trang 20Trang 20
Trang 21Trang 21