This shows you the differences between two versions of the page.
|
tutorials:dvk521:documentations:driver_porting_and_configuration [2013/11/21 11:55] waveshare created |
tutorials:dvk521:documentations:driver_porting_and_configuration [2013/12/23 14:50] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Driver Porting And Configuration ====== | + | ==== Porting I/O Control Driver ==== |
| + | The I/O control driver is built as a module, can be used for controlling common peripherals, such as LED, push button, buzzer. | ||
| - | <WRAP noprint><WRAP left box 60%> | + | Copy [[http://dl.cubieboard.org/parteners/waveshare/Source_Code/Driver%20and%20API/Driver/|io_control_dev]] to your ubuntu system, compile it with your own system setting (refer to Appendix 1 "Compiling Driver Module"), and copy the generated io_control.ko file to the board, use the following command to load the driver module: |
| - | //__About this Article__// | + | $insmod io_control.ko |
| - | * **Author**: waveshare --- waveshare@waveshare.net --- 2013/11/21 11:55 | + | Now you can start to try the I/O control API demo (refer to Appendix 2 "Running API Demo"). |
| - | * **Copyrights**: [[http://creativecommons.org/licenses/by-sa/3.0/|CC Attribution-Share Alike 3.0 Unported]] | + | |
| - | * **Contributors**: [[http://cubieboard.org/|Cubieboard Community]] : ... | + | |
| - | </WRAP></WRAP> | + | |
| - | ===== Abstract ===== | + | The buzzer can be shut up via configuring the related I/O port. Config the script.fex as follows: |
| + | [lcd0_para] | ||
| + | lcd_gpio_0 = port:PH15<0><0><default><default> | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | Reboot the system to apply new configuration. | ||
| - | ===== Headline ===== | + | ==== Porting Dallas’s 1-wire Driver ==== |
| + | === Config the Kernel === | ||
| + | Config the kernel to include Dallas’s 1-wire(DS18B20) driver. | ||
| + | Under the root directory, enter the following commnad: | ||
| + | #make menuconfig | ||
| + | (All the make menuconfig that follows in this document, is executed under root directory) | ||
| - | ==== Headline ==== | + | Config as follows: |
| + | Device Drivers ---> | ||
| + | <*> Dallas's 1-wire support ---> | ||
| + | 1-wire Bus Masters ---> | ||
| + | <*> GPIO 1-wire busmaster | ||
| + | 1-wire Slaves ---> | ||
| + | <*> Thermal family implementation | ||
| + | Save and exit, re-compile the kernel: | ||
| + | #make uImage | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | === Config the script.fex === | ||
| + | Config the script.fex as follows, add the [w1_para] setting: | ||
| + | [w1_para] | ||
| + | w1_used = 1 | ||
| + | w1_pin = port:PB10<1><default><default><default> | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| - | ===== Headline ===== | + | Reboot the system, insert the DS18B20 device. |
| - | === See Also === | + | Copy [[http://dl.cubieboard.org/parteners/waveshare/Source_Code/Driver%20and%20API/Driver/|ds18b20l_dev]] to your ubuntu system, compile it with your own system setting (refer to Appendix 1 "Compiling Driver Module"), and copy the generated w1-sunsi.ko file to the board, use the following command to load the driver: |
| + | $insmod io_control.ko | ||
| + | |||
| + | Enter the /sys/bus/w1/devices/w1_bus_master1 directory, there's a folder with the name preceding with "28-", which represents the DS18B20 device. The 28 means the current temperature sensor is DS18B20, the characters/numbers string follows stands for the device unique ID. Enter the folder, you should find it's device file named w1_slave, to get current temperature, enter this command on the terminal: | ||
| + | $cat w1_slave | ||
| + | As shown in the picture below: | ||
| + | |||
| + | {{.:Documentations-6_1.jpg}} | ||
| + | |||
| + | ==== Porting I2C Bus Driver ==== | ||
| + | === Config the Kernel === | ||
| + | Config the kernel to include I2C bus driver: | ||
| + | #make menuconfig | ||
| + | Device Drivers ---> | ||
| + | {*} I2C support ---> | ||
| + | I2C Hardware Bus support ---> | ||
| + | <*> Allwinner Technology SUNXI I2C interface | ||
| + | Save and exit. | ||
| + | Comment out lines 914 to 918 of the i2c-sunxi.c file, which is located in drivers/i2c/busses directory, as follows: | ||
| + | 914 /* else if (ret != num){ | ||
| + | 915 printk("incomplete xfer (0x%x)\n", ret); | ||
| + | 916 ret = -ECOMM; | ||
| + | 917 //dev_dbg(i2c->adap.dev, "incomplete xfer (%d)\n", ret); 918 }*/ | ||
| + | Save, and re-compile the kernel: | ||
| + | #make uImage | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document <4. Prepare for Kernel and Drivers Porting>) | ||
| + | |||
| + | === Config the script.fex === | ||
| + | Our AT24/FM24 module can be used to test the I2C driver, which is connected to the I2C1 controller. Therefore, config the [twi1_para] setting in the script.fex as follows: | ||
| + | [twi1_para] | ||
| + | twi1_used = 1 | ||
| + | twi1_scl = port:PB18<2><default><default><default> | ||
| + | twi1_sda = port:PB19<2><default><default><default> | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | Reboot the system. | ||
| + | |||
| + | For more info about testing the AT24/FM24 module, like reading/writing data, please refer to the document [[tutorials:DVK521:Documentations:DVK521 User Manual|DVK521 User Manual]] and Appendix 2 "Running API Demo". | ||
| + | |||
| + | |||
| + | ==== Porting SPI Devices Driver ==== | ||
| + | === Config the Kernel === | ||
| + | Config the kernel to include SPI driver: | ||
| + | #make menuconfig | ||
| + | Device Drivers ---> | ||
| + | [*] SPI support ---> | ||
| + | <*> SUN4I SPI Controller | ||
| + | [*] SUN4I SPI Normal DMA mode select | ||
| + | <*> DesignWare SPI controller core support | ||
| + | <*> User mode SPI device driver support | ||
| + | Save and exit, re-compile the kernel: | ||
| + | #make uImage | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | === Config the script.fex === | ||
| + | Our SPI module AT45DBXX DataFlash Board is connected to the SPI0 controller, therefore, config the [spi0_para], [spi_devices], and [spi_board0] settings in the script.fex as follows: | ||
| + | [spi0_para] | ||
| + | spi_used = 1 | ||
| + | spi_cs_bitmap = 1 | ||
| + | spi_cs0 = port:PI10<2><default><default><default> | ||
| + | spi_sclk = port:PI11<2><default><default><default> | ||
| + | spi_mosi = port:PI12<2><default><default><default> | ||
| + | spi_miso = port:PI13<2><default><default><default> | ||
| + | |||
| + | [spi_devices] | ||
| + | spi_dev_num = 1 | ||
| + | |||
| + | [spi_board0] | ||
| + | modalias = "spidev" | ||
| + | max_speed_hz = 12000000 | ||
| + | bus_num = 0 | ||
| + | chip_select = 0 | ||
| + | mode = 3 | ||
| + | full_duplex = 0 | ||
| + | manual_cs = 0 | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | Now the kernel and script.fex configuration for SPI device have completed, the last step is to load the io_control.ko driver module (refer to the previous section " Porting I/O Control Driver"). | ||
| + | |||
| + | Reboot the system. | ||
| + | |||
| + | Now you can use the AT45DBXX DataFlash Board to test the SPI driver (refer to Appendix 2 "Running API Demo"). | ||
| + | |||
| + | ==== Porting LCD Driver ==== | ||
| + | === Config the Kernel === | ||
| + | The LCD driver support has been included in linux-sunxi-sunxi-3.4.61, the driver file can be found on drivers/video/sunxi/lcd. | ||
| + | |||
| + | Check the kernel configuration, confirm that the driver is included: | ||
| + | #make menuconfig | ||
| + | Device Drivers ---> | ||
| + | Graphics support ---> | ||
| + | {*} Support for frame buffer devices ---> | ||
| + | <*> DISP Driver Support(sunxi) | ||
| + | -*- Reserve memory block for sunxi/fb | ||
| + | [*] Enable FB/UMP Integration | ||
| + | <*> LCD Driver Support(sunxi) | ||
| + | <*> HDMI Driver Support(sunxi) | ||
| + | Save and exit, re-compile the kernel: | ||
| + | #make uImage | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | === Config the script.fex === | ||
| + | The A10 supports two channel video output, however, only LCD0 is available on Cubieboard, therefore, we connect the 7inch capacitive LCD to the LCD0 controller. | ||
| + | |||
| + | Config the script.fex, [dis_init] setting for display device initialization, and [lcd0_para] setting for LCD parameters (depending on the specifications of concrete LCD), as follows: | ||
| + | [disp_init] | ||
| + | disp_init_enable = 1 | ||
| + | disp_mode = 0 | ||
| + | screen0_output_type = 1 | ||
| + | screen0_output_mode = 4 | ||
| + | screen1_output_type = 1 | ||
| + | screen1_output_mode = 4 | ||
| + | fb0_framebuffer_num = 2 | ||
| + | fb0_format = 10 | ||
| + | fb0_pixel_sequence = 0 | ||
| + | fb0_scaler_mode_enable = 0 | ||
| + | fb1_framebuffer_num = 2 | ||
| + | fb1_format = 10 | ||
| + | fb1_pixel_sequence = 0 | ||
| + | fb1_scaler_mode_enable = 0 | ||
| + | lcd0_bright = 197 | ||
| + | lcd1_bright = 197 | ||
| + | lcd0_screen_bright = 50 | ||
| + | lcd0_screen_contrast = 50 | ||
| + | lcd0_screen_saturation = 57 | ||
| + | lcd0_screen_hue = 50 | ||
| + | lcd1_screen_bright = 50 | ||
| + | lcd1_screen_contrast = 50 | ||
| + | lcd1_screen_saturation = 57 | ||
| + | lcd1_screen_hue = 50 | ||
| + | |||
| + | [lcd0_para] | ||
| + | lcd_used = 1 | ||
| + | lcd_x = 800 | ||
| + | lcd_y = 480 | ||
| + | lcd_dclk_freq = 33 | ||
| + | lcd_pwm_not_used = 0 | ||
| + | lcd_pwm_ch = 0 | ||
| + | lcd_pwm_freq = 10000 | ||
| + | lcd_pwm_pol = 0 | ||
| + | lcd_if = 0 | ||
| + | lcd_hbp = 215 | ||
| + | lcd_ht = 1055 | ||
| + | lcd_vbp = 34 | ||
| + | lcd_vt = 1050 | ||
| + | lcd_hv_if = 0 | ||
| + | lcd_hv_smode = 0 | ||
| + | lcd_hv_s888_if = 0 | ||
| + | lcd_hv_syuv_if = 0 | ||
| + | lcd_hv_vspw = 0 | ||
| + | lcd_hv_hspw = 48 | ||
| + | lcd_lvds_ch = 0 | ||
| + | lcd_lvds_mode = 0 | ||
| + | lcd_lvds_bitwidth = 0 | ||
| + | lcd_lvds_io_cross = 0 | ||
| + | lcd_cpu_if = 0 | ||
| + | lcd_frm = 0 | ||
| + | lcd_io_cfg0 = 268435456 | ||
| + | lcd_gamma_correction_en = 0 | ||
| + | lcd_gamma_tbl_0 = 0x0 | ||
| + | lcd_gamma_tbl_1 = 0x10101 | ||
| + | lcd_gamma_tbl_255 = 0xffffff | ||
| + | lcd_bl_en_used = 1 | ||
| + | lcd_bl_en = port:PH07<1><0><default><1> | ||
| + | lcd_power_used = 1 | ||
| + | lcd_power = port:PH08<1><0><default><1> | ||
| + | lcd_pwm_used = 1 | ||
| + | lcd_pwm = port:PB02<2><default><default><default> | ||
| + | lcd_gpio_0 = port:PH15<0><0><default><default> | ||
| + | lcd_gpio_1 = | ||
| + | lcd_gpio_2 = | ||
| + | lcd_gpio_3 = | ||
| + | lcdd0 = port:PD00<2><0><default><default> | ||
| + | lcdd1 = port:PD01<2><0><default><default> | ||
| + | lcdd2 = port:PD02<2><0><default><default> | ||
| + | lcdd3 = port:PD03<2><0><default><default> | ||
| + | lcdd4 = port:PD04<2><0><default><default> | ||
| + | lcdd5 = port:PD05<2><0><default><default> | ||
| + | lcdd6 = port:PD06<2><0><default><default> | ||
| + | lcdd7 = port:PD07<2><0><default><default> | ||
| + | lcdd8 = port:PD08<2><0><default><default> | ||
| + | lcdd9 = port:PD09<2><0><default><default> | ||
| + | lcdd10 = port:PD10<2><0><default><default> | ||
| + | lcdd11 = port:PD11<2><0><default><default> | ||
| + | lcdd12 = port:PD12<2><0><default><default> | ||
| + | lcdd13 = port:PD13<2><0><default><default> | ||
| + | lcdd14 = port:PD14<2><0><default><default> | ||
| + | lcdd15 = port:PD15<2><0><default><default> | ||
| + | lcdd16 = port:PD16<2><0><default><default> | ||
| + | lcdd17 = port:PD17<2><0><default><default> | ||
| + | lcdd18 = port:PD18<2><0><default><default> | ||
| + | lcdd19 = port:PD19<2><0><default><default> | ||
| + | lcdd20 = port:PD20<2><0><default><default> | ||
| + | lcdd21 = port:PD21<2><0><default><default> | ||
| + | lcdd22 = port:PD22<2><0><default><default> | ||
| + | lcdd23 = port:PD23<2><0><default><default> | ||
| + | lcdclk = port:PD24<2><0><default><default> | ||
| + | lcdde = port:PD25<2><0><default><default> | ||
| + | lcdhsync = port:PD26<2><0><default><default> | ||
| + | lcdvsync = port:PD27<2><0><default><default> | ||
| + | |||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document <4. Prepare for Kernel and Drivers Porting>) | ||
| + | |||
| + | Reboot the system, the LCD should be ready to work. | ||
| + | |||
| + | |||
| + | ==== Porting CTP Driver ==== | ||
| + | === Config the Kernel === | ||
| + | linux-sunxi-sunxi-3.4.61 includes several capacitive touch panel drivers, such as FT5206/FT5406 driver, Goodix driver. The driver file can be found on drivers/input/touchscreen. | ||
| + | |||
| + | Config the Kernel to include touchscreen driver: | ||
| + | #make menuconfig | ||
| + | Device Drivers ---> | ||
| + | Input device support ---> | ||
| + | [*] Touchscreens ---> | ||
| + | <*> ft5x touchscreen driver | ||
| + | Re-compile the kernel: | ||
| + | #make uImage | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | === Config the script.fex === | ||
| + | Since the touch screen is connected to I2C1 controller, make sure the I2C driver has been ported (refer to the previous section "Porting I2C Bus Driver"). | ||
| + | Config the [ctp_para] setting in script.fex. | ||
| + | ctp_name:driver name | ||
| + | ctp_twi_id:I2C controller which is actually used | ||
| + | ctp_twi_addr:I2C device address (7bit) | ||
| + | ctp_screen_max_x:touch panel resolution | ||
| + | ctp_screen_max_y:touch panel resolution | ||
| + | ctp_revert_x_flag:set 1 to revert x axis | ||
| + | ctp_revert_y_flag:set 1 to revert y axis | ||
| + | ctp_exchange_x_y_flag:set 1 to exchange x axis and y axis | ||
| + | ctp_int_port:touch interrupt pin | ||
| + | ctp_wakeup:touch wakeup pin | ||
| + | ctp_io_port:interrupt pin configuration | ||
| + | |||
| + | According to the specifications and hardware connection of our 7inch capacitive LCD, config as follows: | ||
| + | [ctp_para] | ||
| + | ctp_used = 1 | ||
| + | ctp_name = "ft5x_ts" | ||
| + | ctp_twi_id = 1 | ||
| + | ctp_twi_addr = 0x38 | ||
| + | ctp_screen_max_x = 800 | ||
| + | ctp_screen_max_y = 480 | ||
| + | ctp_revert_x_flag = 0 | ||
| + | ctp_revert_y_flag = 1 | ||
| + | ctp_exchange_x_y_flag = 0 | ||
| + | ctp_int_port = port:PH7<6><default> | ||
| + | ctp_wakeup = port:PB13<1><default><default><1> | ||
| + | ctp_io_port = port:PH7<0><default> | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | Connect the 7inch capacitive LCD, reboot the system, try to touch the icons on the screen. | ||
| + | |||
| + | ==== Porting VGA Driver ==== | ||
| + | VAG driver has been includes in the kernel, just config the script.fex directly: | ||
| + | [disp_init] | ||
| + | disp_init_enable = 1 | ||
| + | disp_mode = 0 | ||
| + | screen0_output_type = 4 | ||
| + | screen0_output_mode = 4 | ||
| + | |||
| + | screen1_output_type = 2 | ||
| + | screen1_output_mode = 14 | ||
| + | |||
| + | fb0_framebuffer_num = 2 | ||
| + | fb0_format = 10 | ||
| + | fb0_pixel_sequence = 0 | ||
| + | fb0_scaler_mode_enable = 1 | ||
| + | |||
| + | fb1_framebuffer_num = 2 | ||
| + | fb1_format = 10 | ||
| + | fb1_pixel_sequence = 0 | ||
| + | fb1_scaler_mode_enable = 1 | ||
| + | |||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document <4. Prepare for Kernel and Drivers Porting>) | ||
| + | Reboot the system, now the VGA can be used for displaying. | ||
| + | |||
| + | ==== Porting HDMI Driver ==== | ||
| + | HDMI driver has been includes in the kernel, just config the script.fex directly: | ||
| + | [disp_init] | ||
| + | disp_init_enable = 1 | ||
| + | disp_mode = 0 | ||
| + | screen0_output_type = 3 | ||
| + | screen0_output_mode = 5 | ||
| + | screen1_output_type = 1 | ||
| + | screen1_output_mode = 4 | ||
| + | Reboot the system, now the HDMI can be used for displaying. | ||
| + | |||
| + | ==== Porting CSI Driver === | ||
| + | === Config the Kernel === | ||
| + | #make menuconfig | ||
| + | Device Drivers ---> | ||
| + | <*> Multimedia support ---> | ||
| + | <*> Video For Linux | ||
| + | [*] CSI Driver Config for sun4i ---> | ||
| + | <M> OmniVision OV7670 sensor support | ||
| + | |||
| + | Built the camera driver as module, save and exit. | ||
| + | |||
| + | Comment out the print messages in the __s32 img_sw_para_to_reg(__u8 type, __u8 mode, __u8 value) function in disp_layer.c file, which is under drivers/video/sunxi/disp directory. | ||
| + | |||
| + | Lines 95 to 99: | ||
| + | 95 /* else { | ||
| + | 96 DE_WRN("not supported yuv channel format:%d in " | ||
| + | 97 "img_sw_para_to_reg\n", value); | ||
| + | 98 return 0; | ||
| + | 99 }*/ | ||
| + | Lines 125 to 129: | ||
| + | 125 /* else { | ||
| + | 126 DE_WRN("not supported yuv channel pixel sequence:%d " | ||
| + | 127 "in img_sw_para_to_reg\n", value); | ||
| + | 128 return 0; | ||
| + | 129 }*/ | ||
| + | Lines 168 to 172: | ||
| + | 168 /* else { | ||
| + | 169 DE_WRN("not supported image0 pixel sequence:%d in " | ||
| + | 170 "img_sw_para_to_reg\n", value); | ||
| + | 171 return 0; | ||
| + | 172 }*/ | ||
| + | Line 175: | ||
| + | 175 // DE_WRN("not supported type:%d in img_sw_para_to_reg\n", type); | ||
| + | Save, re-compile the kernel: | ||
| + | #make uImage | ||
| + | Compile the kernel modules: | ||
| + | #make modules | ||
| + | Install the kernel modules: | ||
| + | #make modules_install | ||
| + | The installation copies the compiled kernel module from the kernel source code to the ubuntu /lib/modules directory. | ||
| + | |||
| + | The related driver module files include: videobuf-core.ko, videobuf-dma-contig.ko, sun4i_csi1.ko, ov7670.ko, which are located respectively in: | ||
| + | videobuf-core.ko, videobuf-dma-contig.ko: | ||
| + | /lib/modules/3.4.61+/kernel/drivers/media/video | ||
| + | ov7670.ko: | ||
| + | /lib/modules/3.4.61+/kernel/drivers/media/video/sun4i_csi/device | ||
| + | sun4i_csi1.ko: | ||
| + | /lib/modules/3.4.61+/kernel/drivers/media/video/sun4i_csi/csi1 | ||
| + | Replace the earlier uImage on the board with the new generated uImage under arch/arm/boot/ directory via NFS. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | Copy the above 4 driver files to the board, and install them in order: | ||
| + | $insmod videobuf-core.ko | ||
| + | $insmod videobuf-dma-contig.ko | ||
| + | $insmod ov7670.ko | ||
| + | $insmod sun4i_csi1.ko | ||
| + | Note: please pay attention to the installing order, camera driver should be installed before sun4i_csi1.ko. | ||
| + | |||
| + | === Config the script.fex === | ||
| + | Since our OV7670 camera is connected to the CSI1 controller, config the [csi1_para] setting in script.fex. The suffix _b in the parameter name indicates that this is a secondary camera parameter while two cameras were connected to the same CSI. | ||
| + | |||
| + | The parameters are interpreted as follows: | ||
| + | csi_used = xx:enable/disable csi0 or csi1 | ||
| + | csi_mode = xx:CSI receiver buffer mode: | ||
| + | 0:a stand-alone buffer for each CSI receiver | ||
| + | 1:a shared buffer for both CSI receiver | ||
| + | csi_dev_qty = xx:CSI device quantity, 1 or 2 | ||
| + | csi_stby_mode = xx:standby power statue | ||
| + | 0:power on when standby | ||
| + | 1:power off when standby | ||
| + | csi_mname = “xxx”: CSI module name, matches with the driver, valid option includes: ov7670/gc0308/gt2005/hi704/sp0338/mt9m112/gc0307/mt9m113/mt9d112/hi253/ov5640 | ||
| + | csi_twi_id = xx:I2C | ||
| + | csi_twi_addr = xx:I2C address | ||
| + | csi_if = xx:interface timing: | ||
| + | 0:8bit data line, with Hsync,Vsync | ||
| + | 1:16bit data line, with Hsync,Vsync | ||
| + | 2:24bit data line, with Hsync,Vsync | ||
| + | 3:8bit data line, BT656 embedded sync, single-channel | ||
| + | 4:8bit data line, BT656 embedded sync, dual-channels | ||
| + | 5:8bit data line, BT656 embedded sync, four-channels | ||
| + | csi_vflip = xx:video vertical flip | ||
| + | 0:normal | ||
| + | 1:flip | ||
| + | csi_hflip = xx:video horizontal flip | ||
| + | 0:normal | ||
| + | 1:flip | ||
| + | csi_iovdd = "", csi_avdd = "", and csi_dvdd = "": power supply of the camera module's IO, Analog, and Core. | ||
| + | "axp20_pll": powering from AXP20 LDO3 | ||
| + | "axp20_hdmi": powering from AXP20 LDO4 | ||
| + | "": powering from other source | ||
| + | csi_flash_pol = xx:flash polarity for cameras that feature flash IO control | ||
| + | 0: flash lights when IO low level | ||
| + | 1: flash lights when IO high level | ||
| + | csi_pck = xx:GPIO configuration for clock signal from module to CSI | ||
| + | csi_ck = xx:GPIO configuration for clock signal from CSI to module | ||
| + | csi_hsync = xx:GPIO configuration for horizontal sync signal from module to CSI | ||
| + | csi_vsync = xx:GPIO configuration for vertical sync signal from module to CSI | ||
| + | csi_d0 = xx to csi_d15 = xx:GPIO configuration for 8bit/16bit data from module to CSI | ||
| + | csi_reset = xx:GPIO configuration for module reset | ||
| + | csi_power_en = xx:GPIO configuration for module power, high active by default | ||
| + | csi_stby = xx:GPIO configuration for module standby | ||
| + | csi_af_en = xx:GPIO configuration for module AF power | ||
| + | |||
| + | The details configuration: | ||
| + | [csi1_para] | ||
| + | csi_used = 1 | ||
| + | csi_mode = 0 | ||
| + | csi_dev_qty = 1 | ||
| + | csi_stby_mode = 0 | ||
| + | csi_mname = "ov7670" | ||
| + | csi_twi_id = 1 | ||
| + | csi_twi_addr = 0x42 | ||
| + | csi_if = 0 | ||
| + | csi_vflip = 1 | ||
| + | csi_hflip = 0 | ||
| + | csi_iovdd = "" | ||
| + | csi_avdd = "" | ||
| + | csi_dvdd = "" | ||
| + | csi_flash_pol = 1 | ||
| + | csi_mname_b = "" | ||
| + | csi_twi_id_b = 0 | ||
| + | csi_twi_addr_b = 0x78 | ||
| + | csi_if_b = 0 | ||
| + | csi_vflip_b = 1 | ||
| + | csi_hflip_b = 0 | ||
| + | csi_iovdd_b = "" | ||
| + | csi_avdd_b = "" | ||
| + | csi_dvdd_b = "" | ||
| + | csi_flash_pol_b = 1 | ||
| + | csi_pck = port:PG00<3><default><default><default> | ||
| + | csi_ck = port:PG01<3><default><default><default> | ||
| + | csi_hsync = port:PG02<3><default><default><default> | ||
| + | csi_vsync = port:PG03<3><default><default><default> | ||
| + | csi_field = | ||
| + | csi_d0 = port:PG04<3><default><default><default> | ||
| + | csi_d1 = port:PG05<3><default><default><default> | ||
| + | csi_d2 = port:PG06<3><default><default><default> | ||
| + | csi_d3 = port:PG07<3><default><default><default> | ||
| + | csi_d4 = port:PG08<3><default><default><default> | ||
| + | csi_d5 = port:PG09<3><default><default><default> | ||
| + | csi_d6 = port:PG10<3><default><default><default> | ||
| + | csi_d7 = port:PG11<3><default><default><default> | ||
| + | csi_d8 = | ||
| + | csi_d9 = | ||
| + | csi_d10 = | ||
| + | csi_d11 = | ||
| + | csi_d12 = | ||
| + | csi_d13 = | ||
| + | csi_d14 = | ||
| + | csi_d15 = | ||
| + | csi_d16 = | ||
| + | csi_d17 = | ||
| + | csi_d18 = | ||
| + | csi_d19 = | ||
| + | csi_d20 = | ||
| + | csi_d21 = | ||
| + | csi_d22 = | ||
| + | csi_d23 = | ||
| + | csi_reset = port:PH14<1><default><default><0> | ||
| + | csi_power_en = | ||
| + | csi_stby = port:PH17<1><default><default><0> | ||
| + | csi_flash = | ||
| + | csi_af_en = | ||
| + | csi_reset_b = | ||
| + | csi_power_en_b = | ||
| + | csi_stby_b = | ||
| + | csi_flash_b = | ||
| + | csi_af_en_b = | ||
| + | Then convert it into script.bin format by using fex2bin, and replace the earlier script.bin on the board. (for more info, refer to the document [[tutorials:DVK521:Documentations:Prepare for Kernel and Drivers Porting|Prepare for Kernel and Drivers Porting]] | ||
| + | |||
| + | Connect the OV7670 camera module and the LCD to the board, reboot the system. | ||
| + | |||
| + | Now you can start to try the camera API demo (refer to Appendix 2 "Running API Demo"). | ||
| + | |||
| + | ==== Appendix 1: Compiling Driver Module ==== | ||
| + | The provided xx.ko files under [[http://dl.cubieboard.org/parteners/waveshare/Source_Code/Driver%20and%20API/Driver/|Driver]] is compiled to run on our system image only. | ||
| + | |||
| + | If the drivers are going to being loaded on your own system, they need to be re-compiled according to you system kernel path. | ||
| + | |||
| + | Use the io_control_dev.ko for demonstration. | ||
| + | |||
| + | 1.1 Copy the [[http://dl.cubieboard.org/parteners/waveshare/Source_Code/Driver%20and%20API/Driver/|io_control_dev]] to ubuntu, assume the target directory is /home/waveshare/cubieboard/waveshare_demo/driver . | ||
| + | Modify the files permission: | ||
| + | #cd /home/waveshare/cubieboard/waveshare_demo/driver/io_control_dev | ||
| + | {{.:Documentations-6_2.jpg}} | ||
| + | #chmod 777 ./* | ||
| + | |||
| + | 1.2 Modify the Makefile | ||
| + | #vi Makefile | ||
| + | {{.:Documentations-6_3.jpg}} | ||
| + | Assign the KERNELDIR according to your actual kernel path. | ||
| + | |||
| + | 1.3 Clear the old files | ||
| + | #make clean | ||
| + | {{.:Documentations-6_4.jpg}} | ||
| + | |||
| + | 1.4 Compile | ||
| + | #make | ||
| + | |||
| + | An error might occur while compiling: | ||
| + | io_control.c:1:23: fatal error: linux/init.h: No such file or directory | ||
| + | compilation terminated. | ||
| + | make: *** [modules] Error 1 | ||
| + | As shown in the picture below: | ||
| + | {{.:Documentations-6_5.jpg}} | ||
| + | |||
| + | It is caused by the different kernel version, can be just omitted. | ||
| + | {{.:Documentations-6_6.jpg}} | ||
| + | Copy the new generated io_control.ko file to your own system and load it. | ||
| + | |||
| + | ==== Appendix 2 "Running API Demo" ==== | ||
| + | When the driver has been loaded, you can start to try the API demo. | ||
| + | |||
| + | Copy the API source code to your ubuntu, and modify the files permission: | ||
| + | #chmod 777 ./* | ||
| + | Execute the following command to compile: | ||
| + | #make | ||
| + | Then copy the executable file to the board, say, "test_led", use the following command to run it: | ||
| + | #./ test_led | ||
| - | <WRAP noprint> | ||
| - | {{tag>Cubieboard Cubietruck}} | ||
| - | </WRAP> | ||