This document is used to record my understanding against camera souce code.
PART 1: Hardware connection
TVP5150 TCC8900
======= =======
SDA | <---------------> | GPIO_A1 CAM_I2C data
SCL | <---------------- | GPIO_A0 CAM_I2C clk
YOUT 0 - 6 | <---------------> | GPIO_E[12-18] CAM_D0 - D6
YOUT 7/I2CSEL | <---------------> | GPIO_E19 CAM_D7
P/SCLK | ----------------> | GPIO_E20 CAM_CKI
HSYNC | <---------------- | GPIO_E22 CAM_HS
VSYNC/PAL1 | <---------------- | GPIO_E21 CAM_VS
INTERQ | ----------------> | GPIO_D7 CAM_INTERQ
RESETB | <---------------- | GPIO_D8 CAM_RST
PART 2: Memory usage
Overview:
-------------
0x4b800000 | static FB | ----------------->
------------- -------------
| M2M Scalar|
-------------
------------- |
0x4c800000 | V4L2 buf | <----------------
-------------
-------------
| M2M Scalar|
-------------
------------- |
0x47c00000 | VIQE buf | <---------------
-------------
VIQE: VIQE occupies 4 buffers, the size of each buffer is 0x180000.
The VIQE buffer is hard-coded in tcc_cam.c:
#define VIQE_OUT_BASE 0x47c00000
47c00000 -> ---------------------
| 0 |
47d80000 -> ---------------------
| 1 |
47f00000 -> ---------------------
| 2 |
48080000 -> ---------------------
| 3 |
48200000 -> ---------------------
static FB: On start-up, there are 3 FBs. FB0 8M, FB 1/2 4M each.
4b800000 -> ---------------------
| 0 |
4c000000 -> ---------------------
| 1 |
4c400000 -> ---------------------
| 2 |
4c800000 -> ---------------------
V4L2 buf: V4L2 occupies 8 buffers, the size of each buffer is 0xcb000.
4c800000 is the start address of the memory reserved for VPU.
tcc_cam.c -> tccxxx_cif_init():
buf->addr = PA_VIDEO_BASE;
PA_VIDEO_BASE is defined in tcc_cam_inc.h, which is ox4c800000.
4c800000 -> ---------------------
| 0 |
4c8cb000 -> ---------------------
| 1 |
4c996000 -> ---------------------
| 2 |
4ca61000 -> ---------------------
| 3 |
4cb2c000 -> ---------------------
| 4 |
4cbf7000 -> ---------------------
| 5 |
4ccc2000 -> ---------------------
| 6 |
4cd8d000 -> ---------------------
| 7 |
4ce58000 -> ---------------------
M2M-Scalar: The M2M-Scalar does not allocate buffers, instead, it uses
V4L2 buffers as SOURCE and uses VIQE buffers as TARGET.
FB: At run-time, FB pointer points to one of the VIQE buffers.
PART 3: The system calls
FB: FBIOGET_FSCREENINFO
FBIOGET_VSCREENINFO
FBIOSET_VSCREENINFO
TCCFB: TCC_LCD_FB_IOCTL_SET_IMGWINDOW
TCC_LCD_FB_IOCTL_SET_FORMAT
TCC_LCD_FB_IOCTL_DISP_ONOFF
V4L2: VIDIOC_QUERYCAP
VIDIOC_QUERYBUF
VIDIOC_REQBUFS
VIDIOC_QBUF
VIDIOC_DQBUF
VIDIOC_G_FMT
VIDIOC_S_FMT
VIDIOC_STREAMON
VIDIOC_STREAMOFF
VIDIOC_G_INPUT //to read TVP5150 REG #1
VIDIOC_S_INPUT //to dump TVP5150 registers
MEMORY: mmap / munmap
PART 4: The flowchart of IOCTL VIDIOC_STREAMON/VIDIOC_STREAMOFF
VIDIOC_STREAMON:
1. CIF_OpStop() //reset DDI_CFG & CIF
2. sensor_change_mode() //set TVP5150 as PREVIEW mode
3. cif_global_reset() //set CIF registers:
ICPCR1 / CIRQ /656FCR2 (format)
CDCR1 (8 words burst DMA mode)
* 4. cif_preview_dma_set() // set preview_buf[8]
* 5. cif_dma_hw_reg() // set CIF -> CDCR2[2-4] as V4L2
6. data -> stream_state = STREAM_ON
* 7. cif_interrupt_enable() // enable interrupt
set PIC_IEN0/SEL0 bit 17
set CIRQ bit 31
8. reset VIQE variables // OutputIdx = 0;
VIQE_base[4] = 0;
PreState = 1;
CurState = 0;
DISPLAY_START = 1;
VIDIOC_STREAMOFF:
1. cif_timer_deregister()
2. cif_interrupt_disable()
3. stream_state = STREAM_OFF
PART 5: The application, camapp
LAUNCH:
1. init_camera_data() // init struct CameraDevice.
2. open_device() // open dev/video0 & dev/fb0
"open"
3. camif_get_dev_info() // get camera's capability
"VIDIOC_QUERYCAP"
4. main_loop:
START:
1. Set VIQE flag and DISPLAY_W/H
2. rsc_init_lcdc() // init FB.
FBIOGET_FSCREENINFO
FBIOGET_VSCREENINFO
FBIOSET_VSCREENINFO (?)
TCC_LCD_FB_IOCTL_SET_FORMAT
TCC_LCD_FB_IOCTL_SET_IMGWINDOW
rsc_viqe_initial() // init VIQE
mmap / munmap
3. camif_set_resolution() //init V4L2 buffers
VIDIOC_REQBUFS
VIDIOC_QUERYBUF
VIDIOC_G_FMT
VIDIOC_S_FMT
4. camif_start_stream() // start to run, mode = PREVIEW
VIDIOC_QBUF
VIDIOC_STREAMON
5. rsc_set_lcd_ch0() // turn on fb0, turn off fb1, fb2.
TCC_LCD_FB_IOCTL_DISP_ONOFF
* 6. handle_camera() // VIDIOC_DQBUF
STOP:
1. camif_stop_stream() // VIDIOC_STREAMOFF, mode = START
2. rsc_set_lcd_ch0() // turn off fb0, turn on fb1, fb2.
PART 6: Questions
PART 1: Hardware connection
TVP5150 TCC8900
======= =======
SDA | <---------------> | GPIO_A1 CAM_I2C data
SCL | <---------------- | GPIO_A0 CAM_I2C clk
YOUT 0 - 6 | <---------------> | GPIO_E[12-18] CAM_D0 - D6
YOUT 7/I2CSEL | <---------------> | GPIO_E19 CAM_D7
P/SCLK | ----------------> | GPIO_E20 CAM_CKI
HSYNC | <---------------- | GPIO_E22 CAM_HS
VSYNC/PAL1 | <---------------- | GPIO_E21 CAM_VS
INTERQ | ----------------> | GPIO_D7 CAM_INTERQ
RESETB | <---------------- | GPIO_D8 CAM_RST
PART 2: Memory usage
Overview:
-------------
0x4b800000 | static FB | ----------------->
------------- -------------
| M2M Scalar|
-------------
------------- |
0x4c800000 | V4L2 buf | <----------------
-------------
-------------
| M2M Scalar|
-------------
------------- |
0x47c00000 | VIQE buf | <---------------
-------------
VIQE: VIQE occupies 4 buffers, the size of each buffer is 0x180000.
The VIQE buffer is hard-coded in tcc_cam.c:
#define VIQE_OUT_BASE 0x47c00000
47c00000 -> ---------------------
| 0 |
47d80000 -> ---------------------
| 1 |
47f00000 -> ---------------------
| 2 |
48080000 -> ---------------------
| 3 |
48200000 -> ---------------------
static FB: On start-up, there are 3 FBs. FB0 8M, FB 1/2 4M each.
4b800000 -> ---------------------
| 0 |
4c000000 -> ---------------------
| 1 |
4c400000 -> ---------------------
| 2 |
4c800000 -> ---------------------
V4L2 buf: V4L2 occupies 8 buffers, the size of each buffer is 0xcb000.
4c800000 is the start address of the memory reserved for VPU.
tcc_cam.c -> tccxxx_cif_init():
buf->addr = PA_VIDEO_BASE;
PA_VIDEO_BASE is defined in tcc_cam_inc.h, which is ox4c800000.
4c800000 -> ---------------------
| 0 |
4c8cb000 -> ---------------------
| 1 |
4c996000 -> ---------------------
| 2 |
4ca61000 -> ---------------------
| 3 |
4cb2c000 -> ---------------------
| 4 |
4cbf7000 -> ---------------------
| 5 |
4ccc2000 -> ---------------------
| 6 |
4cd8d000 -> ---------------------
| 7 |
4ce58000 -> ---------------------
M2M-Scalar: The M2M-Scalar does not allocate buffers, instead, it uses
V4L2 buffers as SOURCE and uses VIQE buffers as TARGET.
FB: At run-time, FB pointer points to one of the VIQE buffers.
PART 3: The system calls
FB: FBIOGET_FSCREENINFO
FBIOGET_VSCREENINFO
FBIOSET_VSCREENINFO
TCCFB: TCC_LCD_FB_IOCTL_SET_IMGWINDOW
TCC_LCD_FB_IOCTL_SET_FORMAT
TCC_LCD_FB_IOCTL_DISP_ONOFF
V4L2: VIDIOC_QUERYCAP
VIDIOC_QUERYBUF
VIDIOC_REQBUFS
VIDIOC_QBUF
VIDIOC_DQBUF
VIDIOC_G_FMT
VIDIOC_S_FMT
VIDIOC_STREAMON
VIDIOC_STREAMOFF
VIDIOC_G_INPUT //to read TVP5150 REG #1
VIDIOC_S_INPUT //to dump TVP5150 registers
MEMORY: mmap / munmap
PART 4: The flowchart of IOCTL VIDIOC_STREAMON/VIDIOC_STREAMOFF
VIDIOC_STREAMON:
1. CIF_OpStop() //reset DDI_CFG & CIF
2. sensor_change_mode() //set TVP5150 as PREVIEW mode
3. cif_global_reset() //set CIF registers:
ICPCR1 / CIRQ /656FCR2 (format)
CDCR1 (8 words burst DMA mode)
* 4. cif_preview_dma_set() // set preview_buf[8]
* 5. cif_dma_hw_reg() // set CIF -> CDCR2[2-4] as V4L2
6. data -> stream_state = STREAM_ON
* 7. cif_interrupt_enable() // enable interrupt
set PIC_IEN0/SEL0 bit 17
set CIRQ bit 31
8. reset VIQE variables // OutputIdx = 0;
VIQE_base[4] = 0;
PreState = 1;
CurState = 0;
DISPLAY_START = 1;
VIDIOC_STREAMOFF:
1. cif_timer_deregister()
2. cif_interrupt_disable()
3. stream_state = STREAM_OFF
PART 5: The application, camapp
LAUNCH:
1. init_camera_data() // init struct CameraDevice.
2. open_device() // open dev/video0 & dev/fb0
"open"
3. camif_get_dev_info() // get camera's capability
"VIDIOC_QUERYCAP"
4. main_loop:
START:
1. Set VIQE flag and DISPLAY_W/H
2. rsc_init_lcdc() // init FB.
FBIOGET_FSCREENINFO
FBIOGET_VSCREENINFO
FBIOSET_VSCREENINFO (?)
TCC_LCD_FB_IOCTL_SET_FORMAT
TCC_LCD_FB_IOCTL_SET_IMGWINDOW
rsc_viqe_initial() // init VIQE
mmap / munmap
3. camif_set_resolution() //init V4L2 buffers
VIDIOC_REQBUFS
VIDIOC_QUERYBUF
VIDIOC_G_FMT
VIDIOC_S_FMT
4. camif_start_stream() // start to run, mode = PREVIEW
VIDIOC_QBUF
VIDIOC_STREAMON
5. rsc_set_lcd_ch0() // turn on fb0, turn off fb1, fb2.
TCC_LCD_FB_IOCTL_DISP_ONOFF
* 6. handle_camera() // VIDIOC_DQBUF
STOP:
1. camif_stop_stream() // VIDIOC_STREAMOFF, mode = START
2. rsc_set_lcd_ch0() // turn off fb0, turn on fb1, fb2.
PART 6: Questions