Introduction
This page describe the basic control over the sensor registers using Arducam camera breakout board, it might not be able to cover all the detail register operations, but give you an insight how to adjust these settings using Arducam USB Camera shield evaluation tool. It also helpful to hack the camera when using other platforms like Raspberry pi or Jetson Nano which might come with the default camera driver.
Sensor I2C Slave Address
The IMX477/IMX577 camera I2C 8-bit slave address is configured through SLASEL pin (A8 pin). When SLASEL pin is connected to ground or float, the slave address is 0x34, or else it is 0x20. The 8bit register value can be accessed from 16bit register address. The Raspberry Pi High Quality camera uses the 0x34 as its I2C slave address.

The device identification register is 0x0016 and 0x0017. Using Arducam USB Camera shield tool, we can read out the default value is 0x04 and 0x77 as read only register values from IMX477 camera module. For IMX577 the device id should be 0x05 and 0x77 instead.


Sensor Initialization
You need a basic settings to bring up the sensor and make it working in normal streaming mode. Please contact us for the config file for the Arducam USB Camera shield Window GUI. In the demo below, it use ArduCAM USB2 camera shield Rev.E, which only get 3fps at 12MP full resolution due to the USB2.0 bandwidth limitation.

Gain Settings
There are analog gain and digital gain before and after ADC. The max analog gain is 27dB and digital gain max is 24dB.
Analog Gain formula is :
Analog Gain[times] = 1024/(1024-ANA_GAIN_GLOBAL)
Where ANA_GAIN_GLOBAL is range from 0~978 (0dB~27dB):
Register Addr | Bits | Description |
0x0204 | [1:0] | ANA_GAIN_GLOBAL[9:8] |
0x0205 | [7:0] | ANA_GAIN_GLOBAL[7:0] |
Digital Gain Can be set by global register or by separate colors.
Register Addr | Bit | Register Name | Description |
0x3FF9 | [0] | DPGA_USE_GLOBAL_GAIN | 0 = By color 1 = All color (Same as DIG_GAIN_GR reg value) |
Register Addr | Bit | Register Name | Description |
0x020E | [7:0] | DIG_GAIN_GR[15:8] | Range: |
0x020F | [7:0] | DIG_GAIN_GR[7:0] | 0x0100~0x0FFF |
0x0210 | [7:0] | DIG_GAIN_R[15:8] | Range: |
0x0211 | [7:0] | DIG_GAIN_R[7:0] | 0x0100~0x0FFF |
0x0212 | [7:0] | DIG_GAIN_B[15:8] | Range: |
0x0213 | [7:0] | DIG_GAIN_B[7:0] | 0x0100~0x0FFF |
0x0214 | [7:0] | DIG_GAIN_GB[15:8] | Range: |
0x0215 | [7:0] | DIG_GAIN_GB[7:0] | 0x0100~0x0FFF |
Digital gain [times] = upper_byte + lower_byte/256
The upper_byte ranges from 1 ~ 15, and lower_byte ranges from 0 ~ 255. So the Digital gain ranges from:
1+0/256[times](=0[dB]) ≤ Digitalgain ≤ 15+255/256[times] (≈ 24dB)
Exposure Time Settings
The exposure time or shutter speed is based on lines, the COARSE_INTEG_TIME register defines the coarse integration time.
Register Addr | Bit | Register Name | Description |
0x0202 | [7:0] | COARSE_INTEG_TIME[15:8] | coarse integration time. |
0x0203 | [7:0] | COARSE_INTEG_TIME[7:0] | Unit: lines |
Tline = LINE_LENGTH_PCK [pixels/line] × IVTPXCK_period / 4 ( Total number of image pipe lines )
Tsh = Tline × ( COARSE_INTEG_TIME [lines] + FINE_INTEG_TIME [pixels] / LINE_LENGTH_PCK [pixels/line] )
Register Addr | Bit | Register Name | Description |
0x0200 | [7:0] | FINE_INTEG_Time[15:8] | Read Only |
0x0201 | [7:0] | FINE_INTEG_Time[7:0] | |
0x0342 | [7:0] | LINE_LENGTH_PCK[15:8] | The total line length |
0x0343 | [7:0] | LINE_LENGTH_PCK[7:0] | Unit: pixels |