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> |