From 56a9a49b194a1eec145e33e5cba54406677421ea Mon Sep 17 00:00:00 2001 From: Stefan Mavrodiev Date: Mon, 30 Apr 2018 15:55:56 +0300 Subject: [PATCH] Update olinuxino BSP packages --- config/boards/olimex-som204-a20.csc | 2 +- config/fex/olimex-som204-a20.fex | 10 +- config/kernel/linux-sun7i-default.config | 1 + config/sources/sun7i.conf | 26 +- .../xorg.conf.d}/02-olinuxino-hdmi-fbdev.conf | 0 .../system}/olinuxino-bluetooth.service | 0 .../lib/systemd/system/olinuxino-lcd.service | 10 + .../bsp/olinuxino/{ => usr/bin}/rtk_hciattach | Bin .../bsp/olinuxino/usr/sbin/change-display | 808 ++++++++++++++++++ packages/bsp/olinuxino/usr/sbin/devmem | Bin 0 -> 7820 bytes .../kernel/sun7i-default/olinuxino-lcd.patch | 421 +++++++++ 11 files changed, 1266 insertions(+), 12 deletions(-) rename packages/bsp/olinuxino/{ => etc/X11/xorg.conf.d}/02-olinuxino-hdmi-fbdev.conf (100%) rename packages/bsp/olinuxino/{ => lib/systemd/system}/olinuxino-bluetooth.service (100%) create mode 100644 packages/bsp/olinuxino/lib/systemd/system/olinuxino-lcd.service rename packages/bsp/olinuxino/{ => usr/bin}/rtk_hciattach (100%) create mode 100755 packages/bsp/olinuxino/usr/sbin/change-display create mode 100755 packages/bsp/olinuxino/usr/sbin/devmem create mode 100644 patch/kernel/sun7i-default/olinuxino-lcd.patch diff --git a/config/boards/olimex-som204-a20.csc b/config/boards/olimex-som204-a20.csc index 302f89cde..36f55a2f8 100644 --- a/config/boards/olimex-som204-a20.csc +++ b/config/boards/olimex-som204-a20.csc @@ -2,7 +2,7 @@ BOARD_NAME="SOM204-A20" BOARDFAMILY="sun7i" BOOTCONFIG="A20-Olimex-SOM204-EVB-eMMC_defconfig" -MODULES="8021q a20_tp bonding g_serial gpio_sunxi m25p80 spi_sun7i sunxi_lirc_new sunxi_can" +MODULES="8021q a20_tp bonding ft5x_ts g_serial gpio_sunxi m25p80 spi_sun7i sunxi_lirc_new sunxi_can" MODULES_NEXT="bonding g_serial gpio-ir-tx r8723bs" MODULES_DEV="bonding g_serial gpio-ir-tx r8723bs " # diff --git a/config/fex/olimex-som204-a20.fex b/config/fex/olimex-som204-a20.fex index 3d1836e04..80df2ad5d 100644 --- a/config/fex/olimex-som204-a20.fex +++ b/config/fex/olimex-som204-a20.fex @@ -281,18 +281,18 @@ rtp_regidity_level = 5 rtp_press_threshold_enable = 0 rtp_press_threshold = 0x1f40 rtp_sensitive_level = 0xf -rtp_exchange_x_y_flag = 0 +rtp_exchange_x_y_flag = 1 [ctp_para] ctp_used = 1 ctp_name = "ft5x_ts" ctp_twi_id = 2 ctp_twi_addr = 0x38 -ctp_screen_max_x = 1024 -ctp_screen_max_y = 600 +ctp_screen_max_x = 800 +ctp_screen_max_y = 480 ctp_revert_x_flag = 0 ctp_revert_y_flag = 0 -ctp_exchange_x_y_flag = 1 +ctp_exchange_x_y_flag = 0 ctp_firm = 1 ctp_int_port = port:PH02<6> ctp_wakeup = port:PI01<1><1> @@ -411,6 +411,8 @@ 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:PB02<1><0><1> lcd_power_used = 1 lcd_power = port:PC24<1><0><1> lcd_pwm_used = 1 diff --git a/config/kernel/linux-sun7i-default.config b/config/kernel/linux-sun7i-default.config index db02a861c..e0257a464 100644 --- a/config/kernel/linux-sun7i-default.config +++ b/config/kernel/linux-sun7i-default.config @@ -1317,6 +1317,7 @@ CONFIG_SENSORS_LIS3LV02D=m CONFIG_SUNXI_DBGREG=m # CONFIG_ATMEL_PWM is not set CONFIG_SUNXI_PWM=y +CONFIG_OLINUXINO_LCD=m # CONFIG_ICS932S401 is not set # CONFIG_ENCLOSURE_SERVICES is not set # CONFIG_APDS9802ALS is not set diff --git a/config/sources/sun7i.conf b/config/sources/sun7i.conf index ad3fa890f..ac030e7da 100644 --- a/config/sources/sun7i.conf +++ b/config/sources/sun7i.conf @@ -42,21 +42,33 @@ family_tweaks_s() if [[ $BRANCH != default ]]; then # Enable bluetooth chroot $SDCARD /bin/bash -c "systemctl --no-reload enable olinuxino-bluetooth.service >/dev/null 2>&1" + else + # Install touchscreen calibrator + [[ $BUILD_DESKTOP == yes ]] && chroot $SDCARD /bin/bash -c "apt-get -y -qq install xinput-calibrator >/dev/null 2>&1" fi fi } family_tweaks_bsp_s() { - if [[ $BRANCH != default && $BOARD == olimex-som204-a20 ]]; then + if [[ $BOARD == olimex-som204-a20 ]]; then - # Copy bluetooth service - install -m 755 $SRC/packages/bsp/olinuxino/rtk_hciattach $destination/usr/bin - cp $SRC/packages/bsp/olinuxino/olinuxino-bluetooth.service $destination/lib/systemd/system + if [[ $BRANCH == default ]]; then + # Copy LCD ralated files + install -m 755 $SRC/packages/bsp/olinuxino/usr/sbin/devmem $destination/usr/sbin + install -m 755 $SRC/packages/bsp/olinuxino/usr/sbin/change-display $destination/usr/sbin - if [[ $BRANCH == dev ]]; then - # Copy fbdev configuration - cp $SRC/packages/bsp/olinuxino/02-olinuxino-hdmi-fbdev.conf $destination/etc/X11/xorg.conf.d/ + # Copy LCD-OLinuXino-15.6FHD service. Initially the service should be disabled + cp $SRC/packages/bsp/olinuxino/lib/systemd/system/olinuxino-lcd.service $destination/lib/systemd/system + else + # Copy bluetooth service + install -m 755 $SRC/packages/bsp/olinuxino/usr/bin/rtk_hciattach $destination/usr/bin + cp $SRC/packages/bsp/olinuxino/lib/systemd/system/olinuxino-bluetooth.service $destination/lib/systemd/system + + if [[ $BRANCH == dev ]]; then + # Copy fbdev configuration + cp $SRC/packages/bsp/olinuxino/etc/X11/xorg.conf.d/02-olinuxino-hdmi-fbdev.conf $destination/etc/X11/xorg.conf.d/ + fi fi fi } diff --git a/packages/bsp/olinuxino/02-olinuxino-hdmi-fbdev.conf b/packages/bsp/olinuxino/etc/X11/xorg.conf.d/02-olinuxino-hdmi-fbdev.conf similarity index 100% rename from packages/bsp/olinuxino/02-olinuxino-hdmi-fbdev.conf rename to packages/bsp/olinuxino/etc/X11/xorg.conf.d/02-olinuxino-hdmi-fbdev.conf diff --git a/packages/bsp/olinuxino/olinuxino-bluetooth.service b/packages/bsp/olinuxino/lib/systemd/system/olinuxino-bluetooth.service similarity index 100% rename from packages/bsp/olinuxino/olinuxino-bluetooth.service rename to packages/bsp/olinuxino/lib/systemd/system/olinuxino-bluetooth.service diff --git a/packages/bsp/olinuxino/lib/systemd/system/olinuxino-lcd.service b/packages/bsp/olinuxino/lib/systemd/system/olinuxino-lcd.service new file mode 100644 index 000000000..762203ab3 --- /dev/null +++ b/packages/bsp/olinuxino/lib/systemd/system/olinuxino-lcd.service @@ -0,0 +1,10 @@ +[Unit] +Description=LCD-OLinuXino-15.6FHD source clock tune +After=basic.target + +[Service] +Type=oneshot +ExecStart=/usr/sbin/devmem 0x01c20118 w 0xc3000000 + +[Install] +WantedBy=multi-user.target diff --git a/packages/bsp/olinuxino/rtk_hciattach b/packages/bsp/olinuxino/usr/bin/rtk_hciattach similarity index 100% rename from packages/bsp/olinuxino/rtk_hciattach rename to packages/bsp/olinuxino/usr/bin/rtk_hciattach diff --git a/packages/bsp/olinuxino/usr/sbin/change-display b/packages/bsp/olinuxino/usr/sbin/change-display new file mode 100755 index 000000000..ce8627e8b --- /dev/null +++ b/packages/bsp/olinuxino/usr/sbin/change-display @@ -0,0 +1,808 @@ +#!/bin/bash + +# read in board info +[[ -f /etc/armbian-release ]] && source /etc/armbian-release +backtitle="OLinuXino display configurator for Armbian v${VERSION}" + +bin_file="/boot/script.bin" +log_file="/var/log/change_display.log" + +function change_parameters() +{ + local __parameters=("$@") + local __fex_file=$(mktemp) + local __total=${#__parameters[@]} + local __i=0 + + # Convert bin -> fex + if ! bin2fex $bin_file $__fex_file 2>$log_file; then + display_error_dialog "Something happened" "Failed converting configuration file!\n\n +Command: bin2fex $bin_file $__fex_file\n +Output:\n +$(cat $log_file)" + exit 1 + fi + + ( for par in "${__parameters[@]}"; do + local __section=$(awk -F'[|=]' '{print $1}' <<< $par) + local __parameter=$(awk -F'[|=]' '{print $2}' <<< $par) + local __value=$(awk -F'[|=]' '{print $3}' <<< $par) + + # Calculate progress + local __progress=$((100 * (++__i) / $__total)) + + # Display progress + cat << __EOF__ +XXX +$__progress + +[$__section]$__parameter=$__value +XXX +__EOF__ + # Find section start + local __section_start=$(grep -m 1 -n "\[$__section]" $__fex_file | cut -d':' -f1) + if [[ -z $__section_start ]]; then + # If not found append it to the end of file + echo -e "[$__section]\n">> $__fex_file + __section_start=$(grep -m 1 -n "\[$__section]" $__fex_file | cut -d':' -f1) + fi + + # Find section end + local __section_end=$(tail -n +$__section_start $__fex_file | grep -n -m 1 "^$" | cut -d':' -f1) + if [[ -z $__section_end ]]; then + display_error_dialog "Converting error" "The end of \"$__section\" section is not found!" + fi + __section_end=$(($__section_end - 1)) + + # Check if line exist in section. + # If so execute sed, otherwise insert it to the bottom + if tail -n +$__section_start $__fex_file | head -n $__section_end | grep -q "$__parameter ="; then + sed -i "$__section_start,+$__section_end s/$__parameter =.*/$__parameter = $__value/" $__fex_file + else + sed -i "$(($__section_start + $__section_end)) i $__parameter = $__value" $__fex_file + fi + + # done ) + done ) | dialog --title "Converting configuration" --backtitle "$backtitle" --gauge "Please wait..." 7 70 0 + + # Convert back to bin file + if ! fex2bin $__fex_file $bin_file 2>$log_file; then + display_error_dialog "Something happened" "Failed converting configuration file!\n\n +Command: fex2bin $__fex_file $bin_file\n +Output:\n +$(cat $log_file)" + exit 1 + fi +} + +function display_reboot_dialog() +{ + dialog --title "Almost done" --backtitle "$backtitle" --yes-label "Reboot" --no-label "Exit" --yesno "\nAll done. \n +Board must be rebooted to apply changes." 7 70 + [[ $? -ne 0 ]] && exit 0 + reboot +} + +function display_error_dialog() +{ + dialog --title "$1" --backtitle "$backtitle" --msgbox "\n$2" 0 0 + exit 1 +} +function dispaly_comfirm_dialog() +{ + dialog --title "Confirmation" --backtitle "$backtitle" --yesno "\n$1" 7 74 + [[ $? -ne 0 ]] && exit 1 +} + +function enable_ts() +{ + sed -i "/a20_tp/d" /etc/modules + ! grep -q "sun4i_ts" /etc/modules && echo "sun4i_ts" >> /etc/modules +} + +function disable_ts() +{ + sed -i "/sun4i_ts/d" /etc/modules + ! grep -q "a20_tp" /etc/modules && echo "a20_tp" >> /etc/modules +} + +function set_hdmi_resolution() +{ + options=( + 0 "480i" + 1 "576i" + 2 "480p" + 3 "576p" + 4 "720p50" + 5 "720p60" + 6 "1080i50" + 7 "1080i60" + 8 "1080p24" + 9 "1080p50" + 10 "1080p60" + 11 "pal" + 14 "ntsc") + + cmd=(dialog --title "Configure HDMI output" --backtitle "$backtitle" --menu "\nSelect HDMI resolution: \n" 21 60 14) + choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) + [[ $? -ne 0 ]] && exit 1 + + for choice in $choices; do + fex_mode=$choice + for i in "${!options[@]}"; do + if [[ "${options[$i]}" == "$choice" ]]; then + fex_desc=${options[$(($i + 1))]} + break + fi + done + done + + dispaly_comfirm_dialog "Set HDMI resolution to \"$fex_desc\"?" + + # Set parameters + hdmi_parameters=( + "disp_init|screen0_output_type=3" + "disp_init|screen1_output_type=0" + "disp_init|screen0_output_mode=$fex_mode" + "lcd0_para|lcd_used=0" + "lcd1_para|lcd_used=0" + "olinuxino_lcd_para|olinuxino_lcd_used=0") + + # Execute parameter change + change_parameters "${hdmi_parameters[@]}" + + # Remove olinuxino-lcd module and service + systemctl disable olinuxino-lcd.service 2>/dev/null + sed -i "/olinuxino-lcd/d" /etc/modules + + disable_ts +} + +function set_vga_resolution() +{ + options=( + 0 "1680x1050" + 1 "1440x900" + 2 "1360x768" + 3 "1280x1024" + 4 "1024x768" + 5 "800x600" + 6 "640x480" + 10 "1920x1080" + 11 "1280x720") + + cmd=(dialog --title "Configure VGA output" --backtitle "$backtitle" --menu "\nSelect VGA resolution: \n" 18 60 14) + choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) + [[ $? -ne 0 ]] && exit 1 + + for choice in $choices; do + fex_mode=$choice + for i in "${!options[@]}"; do + if [[ "${options[$i]}" == "$choice" ]]; then + fex_desc=${options[$(($i + 1))]} + break + fi + done + done + + dispaly_comfirm_dialog "Set HDMI resolution to \"$fex_desc\"?" + + # Set parameters + vga_parameters=( + "disp_init|screen0_output_type=4" + "disp_init|screen1_output_type=0" + "disp_init|screen0_output_mode=$fex_mode" + "lcd0_para|lcd_used=0" + "lcd1_para|lcd_used=0" + "olinuxino_lcd_para|olinuxino_lcd_used=0") + + # Execute parameter change + change_parameters "${vga_parameters[@]}" + + # Remove olinuxino-lcd module and service + systemctl disable olinuxino-lcd.service 2>/dev/null + sed -i "/olinuxino-lcd/d" /etc/modules + + disable_ts +} + +function disable_output() +{ + dispaly_comfirm_dialog "Disable all display outputs?" + + none_parameters=( + "disp_init|screen0_output_type=0" + "disp_init|screen1_output_type=0" + "lcd0_para|lcd_used=0" + "lcd1_para|lcd_used=0" + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + + # Execute parameter change + change_parameters "${none_parameters[@]}" + + # Remove olinuxino-lcd module and service + systemctl disable olinuxino-lcd.service 2>/dev/null + sed -i "/olinuxino-lcd/d" /etc/modules + + disable_ts +} + +function set_lcd_resolution() +{ + options=( + 1 "LCD-OLinuXino-4.3|480x272" + 2 "LCD-OLinuXino-5|800x480" + 3 "LCD-OLinuXino-7|800x480" + 4 "LCD-OLinuXino-10-Rev.A|1024x600" + 5 "LCD-OLinuXino-10-Rev.B|1024x600" + 6 "LCD-OLinuXino-15.6|1366x768" + 7 "LCD-OLinuXino-15.6FHD|1920x1080") + + cmd=(dialog --title "Configure LCD output" --backtitle "$backtitle" --column-separator "|" --menu "\nSelect LCD panel: \n" 15 60 14) + choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) + [[ $? -ne 0 ]] && exit 1 + + for choice in $choices; do + fex_mode=$choice + for i in "${!options[@]}"; do + if [[ "${options[$i]}" == "$choice" ]]; then + fex_desc=$(cut -d"|" -f1 <<< ${options[$(($i + 1))]} ) + break + fi + done + done + + dispaly_comfirm_dialog "Select \"$fex_desc\"?" + + for choice in $choices + do + case $choice in + 1) + lcd_parameters=( + "clock|pll3=" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=0" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=480" + "lcd0_para|lcd_y=272" + "lcd0_para|lcd_dclk_freq=12" + "lcd0_para|lcd_pwm_not_used=0" + "lcd0_para|lcd_if=0" + "lcd0_para|lcd_hbp=2" + "lcd0_para|lcd_ht=525" + "lcd0_para|lcd_vbp=2" + "lcd0_para|lcd_vt=572" + "lcd0_para|lcd_hv_vspw=10" + "lcd0_para|lcd_hv_hspw=41" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=0" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=0" + "lcd0_para|lcd_pwm_used=1" + + "lcd0_para|lcdd0=port:PD00<2><0>" + "lcd0_para|lcdd1=port:PD01<2><0>" + "lcd0_para|lcdd2=port:PD02<2><0>" + "lcd0_para|lcdd3=port:PD03<2><0>" + "lcd0_para|lcdd4=port:PD04<2><0>" + "lcd0_para|lcdd5=port:PD05<2><0>" + "lcd0_para|lcdd6=port:PD06<2><0>" + "lcd0_para|lcdd7=port:PD07<2><0>" + "lcd0_para|lcdd8=port:PD08<2><0>" + "lcd0_para|lcdd9=port:PD09<2><0>" + "lcd0_para|lcdd10=port:PD10<2><0>" + "lcd0_para|lcdd11=port:PD11<2><0>" + "lcd0_para|lcdd12=port:PD12<2><0>" + "lcd0_para|lcdd13=port:PD13<2><0>" + "lcd0_para|lcdd14=port:PD14<2><0>" + "lcd0_para|lcdd15=port:PD15<2><0>" + "lcd0_para|lcdd16=port:PD16<2><0>" + "lcd0_para|lcdd17=port:PD17<2><0>" + "lcd0_para|lcdd18=port:PD18<2><0>" + "lcd0_para|lcdd19=port:PD19<2><0>" + "lcd0_para|lcdd20=port:PD20<2><0>" + "lcd0_para|lcdd21=port:PD21<2><0>" + "lcd0_para|lcdd22=port:PD22<2><0>" + "lcd0_para|lcdd23=port:PD23<2><0>" + "lcd0_para|lcdclk=port:PD24<2><0>" + "lcd0_para|lcdde=port:PD25<2><0>" + "lcd0_para|lcdhsync=port:PD26<2><0>" + "lcd0_para|lcdvsync=port:PD27<2><0>" + + "pwm0_para|pwm_used=1" + + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + ;; + + 2) + lcd_parameters=( + "clock|pll3=" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=0" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=800" + "lcd0_para|lcd_y=480" + "lcd0_para|lcd_dclk_freq=33" + "lcd0_para|lcd_pwm_not_used=0" + "lcd0_para|lcd_if=0" + "lcd0_para|lcd_hbp=46" + "lcd0_para|lcd_ht=1055" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=1050" + "lcd0_para|lcd_hv_vspw=1" + "lcd0_para|lcd_hv_hspw=30" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=0" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=0" + "lcd0_para|lcd_pwm_used=1" + + "lcd0_para|lcdd0=port:PD00<2><0>" + "lcd0_para|lcdd1=port:PD01<2><0>" + "lcd0_para|lcdd2=port:PD02<2><0>" + "lcd0_para|lcdd3=port:PD03<2><0>" + "lcd0_para|lcdd4=port:PD04<2><0>" + "lcd0_para|lcdd5=port:PD05<2><0>" + "lcd0_para|lcdd6=port:PD06<2><0>" + "lcd0_para|lcdd7=port:PD07<2><0>" + "lcd0_para|lcdd8=port:PD08<2><0>" + "lcd0_para|lcdd9=port:PD09<2><0>" + "lcd0_para|lcdd10=port:PD10<2><0>" + "lcd0_para|lcdd11=port:PD11<2><0>" + "lcd0_para|lcdd12=port:PD12<2><0>" + "lcd0_para|lcdd13=port:PD13<2><0>" + "lcd0_para|lcdd14=port:PD14<2><0>" + "lcd0_para|lcdd15=port:PD15<2><0>" + "lcd0_para|lcdd16=port:PD16<2><0>" + "lcd0_para|lcdd17=port:PD17<2><0>" + "lcd0_para|lcdd18=port:PD18<2><0>" + "lcd0_para|lcdd19=port:PD19<2><0>" + "lcd0_para|lcdd20=port:PD20<2><0>" + "lcd0_para|lcdd21=port:PD21<2><0>" + "lcd0_para|lcdd22=port:PD22<2><0>" + "lcd0_para|lcdd23=port:PD23<2><0>" + "lcd0_para|lcdclk=port:PD24<2><0>" + "lcd0_para|lcdde=port:PD25<2><0>" + "lcd0_para|lcdhsync=port:PD26<2><0>" + "lcd0_para|lcdvsync=port:PD27<2><0>" + + "pwm0_para|pwm_used=1" + + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + ;; + + 3) + lcd_parameters=( + "clock|pll3=" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=0" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=800" + "lcd0_para|lcd_y=480" + "lcd0_para|lcd_dclk_freq=33" + "lcd0_para|lcd_pwm_not_used=0" + "lcd0_para|lcd_if=0" + "lcd0_para|lcd_hbp=46" + "lcd0_para|lcd_ht=1055" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=1050" + "lcd0_para|lcd_hv_vspw=1" + "lcd0_para|lcd_hv_hspw=30" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=0" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=0" + "lcd0_para|lcd_pwm_used=1" + + "lcd0_para|lcdd0=port:PD00<2><0>" + "lcd0_para|lcdd1=port:PD01<2><0>" + "lcd0_para|lcdd2=port:PD02<2><0>" + "lcd0_para|lcdd3=port:PD03<2><0>" + "lcd0_para|lcdd4=port:PD04<2><0>" + "lcd0_para|lcdd5=port:PD05<2><0>" + "lcd0_para|lcdd6=port:PD06<2><0>" + "lcd0_para|lcdd7=port:PD07<2><0>" + "lcd0_para|lcdd8=port:PD08<2><0>" + "lcd0_para|lcdd9=port:PD09<2><0>" + "lcd0_para|lcdd10=port:PD10<2><0>" + "lcd0_para|lcdd11=port:PD11<2><0>" + "lcd0_para|lcdd12=port:PD12<2><0>" + "lcd0_para|lcdd13=port:PD13<2><0>" + "lcd0_para|lcdd14=port:PD14<2><0>" + "lcd0_para|lcdd15=port:PD15<2><0>" + "lcd0_para|lcdd16=port:PD16<2><0>" + "lcd0_para|lcdd17=port:PD17<2><0>" + "lcd0_para|lcdd18=port:PD18<2><0>" + "lcd0_para|lcdd19=port:PD19<2><0>" + "lcd0_para|lcdd20=port:PD20<2><0>" + "lcd0_para|lcdd21=port:PD21<2><0>" + "lcd0_para|lcdd22=port:PD22<2><0>" + "lcd0_para|lcdd23=port:PD23<2><0>" + "lcd0_para|lcdclk=port:PD24<2><0>" + "lcd0_para|lcdde=port:PD25<2><0>" + "lcd0_para|lcdhsync=port:PD26<2><0>" + "lcd0_para|lcdvsync=port:PD27<2><0>" + + "pwm0_para|pwm_used=1" + + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + ;; + + 4) + lcd_parameters=( + "clock|pll3=" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=0" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=1024" + "lcd0_para|lcd_y=600" + "lcd0_para|lcd_dclk_freq=45" + "lcd0_para|lcd_pwm_not_used=0" + "lcd0_para|lcd_if=0" + "lcd0_para|lcd_hbp=160" + "lcd0_para|lcd_ht=1200" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=1250" + "lcd0_para|lcd_hv_vspw=2" + "lcd0_para|lcd_hv_hspw=10" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=0" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=0" + "lcd0_para|lcd_pwm_used=1" + + "lcd0_para|lcdd0=port:PD00<2><0>" + "lcd0_para|lcdd1=port:PD01<2><0>" + "lcd0_para|lcdd2=port:PD02<2><0>" + "lcd0_para|lcdd3=port:PD03<2><0>" + "lcd0_para|lcdd4=port:PD04<2><0>" + "lcd0_para|lcdd5=port:PD05<2><0>" + "lcd0_para|lcdd6=port:PD06<2><0>" + "lcd0_para|lcdd7=port:PD07<2><0>" + "lcd0_para|lcdd8=port:PD08<2><0>" + "lcd0_para|lcdd9=port:PD09<2><0>" + "lcd0_para|lcdd10=port:PD10<2><0>" + "lcd0_para|lcdd11=port:PD11<2><0>" + "lcd0_para|lcdd12=port:PD12<2><0>" + "lcd0_para|lcdd13=port:PD13<2><0>" + "lcd0_para|lcdd14=port:PD14<2><0>" + "lcd0_para|lcdd15=port:PD15<2><0>" + "lcd0_para|lcdd16=port:PD16<2><0>" + "lcd0_para|lcdd17=port:PD17<2><0>" + "lcd0_para|lcdd18=port:PD18<2><0>" + "lcd0_para|lcdd19=port:PD19<2><0>" + "lcd0_para|lcdd20=port:PD20<2><0>" + "lcd0_para|lcdd21=port:PD21<2><0>" + "lcd0_para|lcdd22=port:PD22<2><0>" + "lcd0_para|lcdd23=port:PD23<2><0>" + "lcd0_para|lcdclk=port:PD24<2><0>" + "lcd0_para|lcdde=port:PD25<2><0>" + "lcd0_para|lcdhsync=port:PD26<2><0>" + "lcd0_para|lcdvsync=port:PD27<2><0>" + + "pwm0_para|pwm_used=1" + + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + ;; + + 5) + lcd_parameters=( + "clock|pll3=" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=0" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=1024" + "lcd0_para|lcd_y=600" + "lcd0_para|lcd_dclk_freq=45" + "lcd0_para|lcd_pwm_not_used=0" + "lcd0_para|lcd_if=0" + "lcd0_para|lcd_hbp=160" + "lcd0_para|lcd_ht=1200" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=1250" + "lcd0_para|lcd_hv_vspw=2" + "lcd0_para|lcd_hv_hspw=10" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=0" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=0" + "lcd0_para|lcd_bl_en_used=0" + "lcd0_para|lcd_pwm_used=1" + + "lcd0_para|lcdd0=port:PD00<2><0>" + "lcd0_para|lcdd1=port:PD01<2><0>" + "lcd0_para|lcdd2=port:PD02<2><0>" + "lcd0_para|lcdd3=port:PD03<2><0>" + "lcd0_para|lcdd4=port:PD04<2><0>" + "lcd0_para|lcdd5=port:PD05<2><0>" + "lcd0_para|lcdd6=port:PD06<2><0>" + "lcd0_para|lcdd7=port:PD07<2><0>" + "lcd0_para|lcdd8=port:PD08<2><0>" + "lcd0_para|lcdd9=port:PD09<2><0>" + "lcd0_para|lcdd10=port:PD10<2><0>" + "lcd0_para|lcdd11=port:PD11<2><0>" + "lcd0_para|lcdd12=port:PD12<2><0>" + "lcd0_para|lcdd13=port:PD13<2><0>" + "lcd0_para|lcdd14=port:PD14<2><0>" + "lcd0_para|lcdd15=port:PD15<2><0>" + "lcd0_para|lcdd16=port:PD16<2><0>" + "lcd0_para|lcdd17=port:PD17<2><0>" + "lcd0_para|lcdd18=port:PD18<2><0>" + "lcd0_para|lcdd19=port:PD19<2><0>" + "lcd0_para|lcdd20=port:PD20<2><0>" + "lcd0_para|lcdd21=port:PD21<2><0>" + "lcd0_para|lcdd22=port:PD22<2><0>" + "lcd0_para|lcdd23=port:PD23<2><0>" + "lcd0_para|lcdclk=port:PD24<2><0>" + "lcd0_para|lcdde=port:PD25<2><0>" + "lcd0_para|lcdhsync=port:PD26<2><0>" + "lcd0_para|lcdvsync=port:PD27<2><0>" + + "pwm0_para|pwm_used=1" + + "olinuxino_lcd_para|olinuxino_lcd_used=0" + ) + ;; + + 6) + + lcd_parameters=( + "clock|pll3=297" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=1" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=1366" + "lcd0_para|lcd_y=768" + "lcd0_para|lcd_dclk_freq=70" + "lcd0_para|lcd_pwm_not_used=1" + "lcd0_para|lcd_if=3" + "lcd0_para|lcd_hbp=54" + "lcd0_para|lcd_ht=1440" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=1616" + "lcd0_para|lcd_hv_vspw=0" + "lcd0_para|lcd_hv_hspw=0" + "lcd0_para|lcd_hv_if=0" + "lcd0_para|lcd_lvds_ch=0" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=1" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=1" + "lcd0_para|lcd_pwm_used=0" + + "lcd0_para|lcdd0=port:PD00<3><0>" + "lcd0_para|lcdd1=port:PD01<3><0>" + "lcd0_para|lcdd2=port:PD02<3><0>" + "lcd0_para|lcdd3=port:PD03<3><0>" + "lcd0_para|lcdd4=port:PD04<3><0>" + "lcd0_para|lcdd5=port:PD05<3><0>" + "lcd0_para|lcdd6=port:PD06<3><0>" + "lcd0_para|lcdd7=port:PD07<3><0>" + "lcd0_para|lcdd8=port:PD08<3><0>" + "lcd0_para|lcdd9=port:PD09<3><0>" + "lcd0_para|lcdd10=port:PD10<3><0>" + "lcd0_para|lcdd11=port:PD11<3><0>" + "lcd0_para|lcdd12=port:PD12<3><0>" + "lcd0_para|lcdd13=port:PD13<3><0>" + "lcd0_para|lcdd14=port:PD14<3><0>" + "lcd0_para|lcdd15=port:PD15<3><0>" + "lcd0_para|lcdd16=port:PD16<3><0>" + "lcd0_para|lcdd17=port:PD17<3><0>" + "lcd0_para|lcdd18=port:PD18<3><0>" + "lcd0_para|lcdd19=port:PD19<3><0>" + "lcd0_para|lcdd20=port:PD20<3><0>" + "lcd0_para|lcdd21=port:PD21<3><0>" + "lcd0_para|lcdd22=" + "lcd0_para|lcdd23=" + "lcd0_para|lcdclk=" + "lcd0_para|lcdde=" + "lcd0_para|lcdhsync=" + "lcd0_para|lcdvsync=" + + "pwm0_para|pwm_used=0" + + "olinuxino_lcd_para|olinuxino_lcd_used=1" + "olinuxino_lcd_para|backlight_pin=port:PD23<0>" + "olinuxino_lcd_para|contrast_pin=port:PD24<0>" + ) + ;; + + 7) + lcd_parameters=( + "clock|pll3=297" + + "disp_init|disp_mode=0" + "disp_init|screen0_output_type=1" + "disp_init|screen1_output_type=0" + "disp_init|fb0_scaler_mode_enable=1" + + "lcd0_para|lcd_used=1" + "lcd0_para|lcd_x=1920" + "lcd0_para|lcd_y=1080" + "lcd0_para|lcd_dclk_freq=152" + "lcd0_para|lcd_pwm_not_used=1" + "lcd0_para|lcd_if=3" + "lcd0_para|lcd_hbp=100" + "lcd0_para|lcd_ht=2226" + "lcd0_para|lcd_vbp=23" + "lcd0_para|lcd_vt=2284" + "lcd0_para|lcd_hv_vspw=0" + "lcd0_para|lcd_hv_hspw=0" + "lcd0_para|lcd_hv_if=1" + "lcd0_para|lcd_lvds_ch=1" + "lcd0_para|lcd_lvds_mode=0" + "lcd0_para|lcd_lvds_bitwidth=1" + "lcd0_para|lcd_frm=1" + "lcd0_para|lcd_io_cfg0=268435456" + "lcd0_para|lcd_bl_en_used=1" + "lcd0_para|lcd_pwm_used=0" + + "lcd0_para|lcdd0=port:PD00<3><0>" + "lcd0_para|lcdd1=port:PD01<3><0>" + "lcd0_para|lcdd2=port:PD02<3><0>" + "lcd0_para|lcdd3=port:PD03<3><0>" + "lcd0_para|lcdd4=port:PD04<3><0>" + "lcd0_para|lcdd5=port:PD05<3><0>" + "lcd0_para|lcdd6=port:PD06<3><0>" + "lcd0_para|lcdd7=port:PD07<3><0>" + "lcd0_para|lcdd8=port:PD08<3><0>" + "lcd0_para|lcdd9=port:PD09<3><0>" + "lcd0_para|lcdd10=port:PD10<3><0>" + "lcd0_para|lcdd11=port:PD11<3><0>" + "lcd0_para|lcdd12=port:PD12<3><0>" + "lcd0_para|lcdd13=port:PD13<3><0>" + "lcd0_para|lcdd14=port:PD14<3><0>" + "lcd0_para|lcdd15=port:PD15<3><0>" + "lcd0_para|lcdd16=port:PD16<3><0>" + "lcd0_para|lcdd17=port:PD17<3><0>" + "lcd0_para|lcdd18=port:PD18<3><0>" + "lcd0_para|lcdd19=port:PD19<3><0>" + "lcd0_para|lcdd20=port:PD20<3><0>" + "lcd0_para|lcdd21=port:PD21<3><0>" + "lcd0_para|lcdd22=" + "lcd0_para|lcdd23=" + "lcd0_para|lcdclk=" + "lcd0_para|lcdde=" + "lcd0_para|lcdhsync=" + "lcd0_para|lcdvsync=" + + "pwm0_para|pwm_used=0" + + "olinuxino_lcd_para|olinuxino_lcd_used=1" + "olinuxino_lcd_para|backlight_pin=port:PD23<0>" + "olinuxino_lcd_para|contrast_pin=port:PD24<0>" + ) + ;; + esac + done + + # Enable touchscreen + if [[ $fex_desc != "LCD-OLinuXino-15.6"* ]]; then + dialog --title "Configure touchscreen" --backtitle "$backtitle" --yesno "\nEnable touchscreen?\nThis will disable core temperature monitor!" 7 74 + if [[ $? -eq 0 ]]; then + + if [[ $fex_desc == "LCD-OLinuXino-5" ]]; then + lcd_parameters+=("ctp_para|ctp_used=1") + lcd_parameters+=("rtp_para|rtp_used=0") + disable_ts + else + lcd_parameters+=("ctp_para|ctp_used=0") + lcd_parameters+=("rtp_para|rtp_used=1") + enable_ts + fi + + else + lcd_parameters+=("ctp_para|ctp_used=0") + lcd_parameters+=("rtp_para|rtp_used=0") + disable_ts + fi + + # Disable olinuxino-lcd module and service + sed -i "/olinuxino-lcd/d" /etc/modules + systemctl disable olinuxino-lcd.service 2>/dev/null + else + # LCD-OLinuXino-15.6 doesn't support TS + lcd_parameters+=("ctp_para|ctp_used=0") + lcd_parameters+=("rtp_para|rtp_used=0") + disable_ts + + # Enable olinuxino-lcd module and service + ! grep -q "olinuxino-lcd" /etc/modules && echo "olinuxino-lcd" >> /etc/modules + if [[ $fex_desc == "LCD-OLinuXino-15.6FHD" ]]; then + systemctl enable olinuxino-lcd.service 2>/dev/null + fi + fi + + # Execute parameter change + change_parameters "${lcd_parameters[@]}" +} + +function main() +{ + # This tool must run under root + if [[ $EUID -ne 0 ]]; then + echo "This tool must run as root. Exiting ..." >&2 + exit 1 + fi + + # This tool is working with default branch only + if [[ $BRANCH != default ]]; then + echo "This tool work with default branch only. Exiting ..." >&2 + exit 1 + fi + + # Set options + options=(1 "Enable HDMI display output" 2 "Enable VGA display output" 3 "Enable LCD display output" 4 "Disable all display outputs") + + cmd=(dialog --title "Configure display output" --backtitle "$backtitle" --menu "\nChoose an option: \n" 14 60 7) + choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) + [[ $? -ne 0 ]] && exit 1 + + for choice in $choices + do + case $choice in + 1) + set_hdmi_resolution + ;; + + 2) + set_vga_resolution + ;; + + 3) + set_lcd_resolution + ;; + + 4) + disable_output + ;; + esac + done + + display_reboot_dialog +} +main "$@" diff --git a/packages/bsp/olinuxino/usr/sbin/devmem b/packages/bsp/olinuxino/usr/sbin/devmem new file mode 100755 index 0000000000000000000000000000000000000000..4bf7c81fee5fe6180dc8f06de01ab24c8ac0830f GIT binary patch literal 7820 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++ ++struct olinuxino_lcd_platform_data { ++ unsigned gpio_handler; ++ ++ script_gpio_set_t info; ++ ++ char pin_name[16]; ++ char device_name[64]; ++ ++ unsigned duty; ++ unsigned last_state; ++ ++ ktime_t period; ++ ktime_t pulse_on; ++ ktime_t pulse_off; ++ struct hrtimer hr_timer; ++ ++ struct device *dev; ++}; ++ ++static DEFINE_MUTEX(sysfs_lock); ++ ++static struct olinuxino_lcd_platform_data *p_backlight; ++static struct olinuxino_lcd_platform_data *p_contrast; ++ ++static int sunxi_gpio_is_valid(struct olinuxino_lcd_platform_data *gpio) ++{ ++ if(gpio->gpio_handler) ++ return 1; ++ ++ return 0; ++} ++ ++static int sunxi_direction_input(struct olinuxino_lcd_platform_data *gpio) ++{ ++ int ret; ++ ++ if(sunxi_gpio_is_valid(gpio)){ ++ ret = gpio_set_one_pin_io_status(gpio->gpio_handler, 0, gpio->pin_name); ++ }else{ ++ printk(KERN_ERR "%s: requested gpio has no valid handler\n", __func__); ++ return 1; ++ } ++ return ret; ++} ++ ++static void sunxi_gpio_set_value(struct olinuxino_lcd_platform_data *gpio, int value) ++{ ++ if(sunxi_gpio_is_valid(gpio)){ ++ gpio_write_one_pin_value(gpio->gpio_handler, value, gpio->pin_name); ++ }else{ ++ printk(KERN_ERR "%s: requested gpio has no valid handler\n", __func__); ++ } ++} ++ ++static int sunxi_direction_output(struct olinuxino_lcd_platform_data *gpio, int value) ++{ ++ int ret; ++ ++ if(!sunxi_gpio_is_valid(gpio)){ ++ printk(KERN_ERR "%s: requested gpio has no valid handler\n", __func__); ++ return 1; ++ } ++ ++ ret = gpio_set_one_pin_io_status(gpio->gpio_handler, 1, gpio->pin_name); ++ ++ if (!ret) ++ ret = gpio_write_one_pin_value(gpio->gpio_handler, ++ value, gpio->pin_name); ++ ++ return ret; ++} ++ ++static ssize_t duty_show(struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ struct olinuxino_lcd_platform_data *device; ++ ssize_t ret; ++ ++ device = dev_get_drvdata(dev); ++ ++ mutex_lock(&sysfs_lock); ++ ++ ret = sprintf(buf, "%d\n", device->duty); ++ ++ mutex_unlock(&sysfs_lock); ++ return ret; ++} ++ ++static ssize_t duty_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) ++{ ++ ssize_t ret; ++ long duty; ++ u64 v; ++ struct olinuxino_lcd_platform_data *device; ++ ++ device = dev_get_drvdata(dev); ++ ++ mutex_lock(&sysfs_lock); ++ ++ ret = strict_strtol(buf, 0, &duty); ++ if(ret) ++ return -EINVAL; ++ ++ if(duty < 0 || duty > 100) ++ return -EINVAL; ++ ++ device->duty = duty; ++ v = device->period.tv64; ++ do_div(v, 100); ++ ++ device->pulse_on.tv64 = v*duty; ++ device->pulse_off.tv64 = v*(100-duty); ++ ++ mutex_unlock(&sysfs_lock); ++ ++ return count; ++} ++ ++static DEVICE_ATTR(duty, 0666, duty_show, duty_store); ++ ++enum hrtimer_restart olinuxino_lcd_hrtimer_callback(struct hrtimer *timer) ++{ ++ unsigned char current_state; ++ struct olinuxino_lcd_platform_data *dev; ++ ktime_t now = ktime_get(); ++ ++ dev = container_of(timer, struct olinuxino_lcd_platform_data, hr_timer); ++ ++ if(!dev->duty){ ++ sunxi_gpio_set_value(dev, 0); ++ hrtimer_forward(timer, now, dev->pulse_off); ++ }else if(dev->duty == 100){ ++ sunxi_gpio_set_value(dev, 1); ++ hrtimer_forward(timer, now, dev->pulse_on); ++ }else{ ++ current_state = dev->last_state; ++ if(current_state){ ++ sunxi_gpio_set_value(dev, 0); ++ dev->last_state = 0; ++ hrtimer_forward(timer, now, dev->pulse_off); ++ }else{ ++ sunxi_gpio_set_value(dev, 1); ++ dev->last_state = 1; ++ hrtimer_forward(timer, now, dev->pulse_on); ++ } ++ } ++ ++ return HRTIMER_RESTART; ++} ++ ++static struct attribute *olinuxino_lcd_sysfs_entries[] = { ++ &dev_attr_duty.attr, ++ NULL, ++}; ++ ++static struct attribute_group olinuxino_lcd_attribute_group = { ++ .attrs = (struct attribute **)olinuxino_lcd_sysfs_entries, ++}; ++ ++static struct class olinuxino_lcd_class = { ++ .name = "olinuxino_lcd", ++ .owner = THIS_MODULE, ++}; ++ ++static ssize_t __init olinuxino_lcd_init(void) ++{ ++ int err; ++ int olinuxino_lcd_used = 0; ++ ++ printk(KERN_INFO "%s()\n", __func__); ++ ++ /* Check if olinuxino_lcd is used */ ++ err = script_parser_fetch("olinuxino_lcd_para", "olinuxino_lcd_used", &olinuxino_lcd_used, sizeof(olinuxino_lcd_used)/sizeof(int)); ++ if (!olinuxino_lcd_used || err) { ++ printk(KERN_INFO "%s: olinuxino_lcd is not used in config\n", __func__); ++ return -EINVAL; ++ } ++ ++ p_backlight = kzalloc(sizeof(struct olinuxino_lcd_platform_data), GFP_KERNEL); ++ p_contrast = kzalloc(sizeof(struct olinuxino_lcd_platform_data), GFP_KERNEL); ++ ++ if (!p_backlight || !p_contrast) { ++ printk(KERN_INFO "%s: failed to kzalloc memory\n", __func__); ++ err = -ENOMEM; ++ goto exit0; ++ } ++ ++ sprintf(p_backlight->pin_name, "backlight_pin"); ++ sprintf(p_contrast->pin_name, "contrast_pin"); ++ ++ sprintf(p_backlight->device_name, "backlight"); ++ sprintf(p_contrast->device_name, "contrast"); ++ ++ /* Read GPIO data */ ++ err = script_parser_fetch("olinuxino_lcd_para", p_backlight->pin_name, ++ (int *)&p_backlight->info, ++ sizeof(script_gpio_set_t)); ++ ++ if (err) { ++ printk(KERN_INFO "%s failed to find %s\n", __func__, ++ p_backlight->pin_name); ++ goto exit0; ++ } ++ err = script_parser_fetch("olinuxino_lcd_para", p_contrast->pin_name, ++ (int *)&p_contrast->info, ++ sizeof(script_gpio_set_t)); ++ if (err) { ++ printk(KERN_INFO "%s failed to find %s\n", __func__, ++ p_contrast->pin_name); ++ goto exit0; ++ } ++ ++ /* Request gpio */ ++ p_backlight->gpio_handler = gpio_request_ex("olinuxino_lcd_para", ++ p_backlight->pin_name); ++ if (!p_backlight->gpio_handler) { ++ printk(KERN_INFO "%s: cannot request %s, already used ?\n", ++ __func__, p_backlight->pin_name); ++ goto exit0; ++ } ++ p_contrast->gpio_handler = gpio_request_ex("olinuxino_lcd_para", ++ p_contrast->pin_name); ++ if (!p_contrast->gpio_handler) { ++ printk(KERN_INFO "%s: cannot request %s, already used ?\n", ++ __func__, p_contrast->pin_name); ++ goto exit0; ++ } ++ ++ printk(KERN_INFO "%s: backlight registered @ port:%d, num:%d\n", ++ __func__, p_backlight->info.port, p_backlight->info.port_num); ++ printk(KERN_INFO "%s: contrast registered @ port:%d, num:%d\n", ++ __func__, p_contrast->info.port, p_contrast->info.port_num); ++ ++ err = class_register(&olinuxino_lcd_class); ++ if(err < 0){ ++ printk(KERN_INFO "%s: unable to register class\n", __func__); ++ goto exit0; ++ } ++ ++ ++ /* Make sysfs devices */ ++ p_backlight->dev = device_create(&olinuxino_lcd_class, NULL, ++ MKDEV(0, 0), p_backlight, ++ p_backlight->device_name); ++ if(IS_ERR(p_backlight->dev)) { ++ printk(KERN_INFO "%s: device_create failed\n", __func__); ++ err = PTR_ERR(p_backlight->dev); ++ goto exit1; ++ } ++ p_contrast->dev = device_create(&olinuxino_lcd_class, NULL, ++ MKDEV(0, 0), p_contrast, ++ p_contrast->device_name); ++ if(IS_ERR(p_backlight->dev)) { ++ printk(KERN_INFO "%s: device_create failed\n", __func__); ++ err = PTR_ERR(p_contrast->dev); ++ goto exit1; ++ } ++ ++ err = sysfs_create_group(&p_backlight->dev->kobj, ++ &olinuxino_lcd_attribute_group); ++ if(err < 0){ ++ printk(KERN_INFO "%s: failed to create sysfs device attributes\n", __func__); ++ goto exit2; ++ } ++ err = sysfs_create_group(&p_contrast->dev->kobj, ++ &olinuxino_lcd_attribute_group); ++ if(err < 0){ ++ printk(KERN_INFO "%s: failed to create sysfs device attributes\n", __func__); ++ goto exit2; ++ } ++ ++ p_backlight->duty = 100; ++ p_contrast->duty = 100; ++ ++ /* Set period to 1kHz, 50% duty */ ++ p_backlight->period = ktime_set(0, 1000000); ++ p_contrast->period = ktime_set(0, 1000000); ++ ++ p_backlight->pulse_on = ktime_set(0, 1000000); ++ p_contrast->pulse_on = ktime_set(0, 1000000); ++ ++ p_backlight->pulse_off = ktime_set(0, 0); ++ p_contrast->pulse_off = ktime_set(0, 0); ++ ++ /* Init gpio as output */ ++ sunxi_direction_output(p_backlight, 0); ++ p_backlight->last_state = 0; ++ ++ sunxi_direction_output(p_contrast, 0); ++ p_contrast->last_state = 0; ++ ++ hrtimer_init(&p_backlight->hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_init(&p_contrast->hr_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ ++ p_backlight->hr_timer.function = &olinuxino_lcd_hrtimer_callback; ++ p_contrast->hr_timer.function = &olinuxino_lcd_hrtimer_callback; ++ ++ hrtimer_start(&p_backlight->hr_timer, p_backlight->pulse_off, HRTIMER_MODE_REL); ++ hrtimer_start(&p_contrast->hr_timer, p_contrast->pulse_off, HRTIMER_MODE_REL); ++ ++ return 0; ++ ++exit2: ++ sysfs_remove_group(&p_backlight->dev->kobj, &olinuxino_lcd_attribute_group); ++ sysfs_remove_group(&p_contrast->dev->kobj, &olinuxino_lcd_attribute_group); ++ ++exit1: ++ /* Unregister devices */ ++ if(p_backlight->dev) ++ device_unregister(p_backlight->dev); ++ if(p_contrast->dev) ++ device_unregister(p_contrast->dev); ++ ++ /* Unregister class */ ++ class_unregister(&olinuxino_lcd_class); ++ ++exit0: ++ if (err != -ENOMEM) { ++ ++ if(p_backlight->gpio_handler){ ++ gpio_release(p_backlight->gpio_handler, 1); ++ } ++ ++ if(p_contrast->gpio_handler){ ++ gpio_release(p_contrast->gpio_handler, 1); ++ } ++ } ++ kfree(p_contrast); ++ kfree(p_backlight); ++ return err; ++} ++ ++static void __exit olinuxino_lcd_exit(void) ++{ ++ ++ printk(KERN_INFO "%s()\n", __func__); ++ ++ hrtimer_cancel(&p_backlight->hr_timer); ++ hrtimer_cancel(&p_contrast->hr_timer); ++ ++ /* Make gpios as inputs */ ++ sunxi_direction_input(p_backlight); ++ sunxi_direction_input(p_contrast); ++ ++ /* Release gpios */ ++ if(p_backlight->gpio_handler){ ++ gpio_release(p_backlight->gpio_handler, 1); ++ printk(KERN_INFO "%s: gpio %s released\n", __func__, p_backlight->info.gpio_name); ++ } ++ if(p_contrast->gpio_handler){ ++ gpio_release(p_contrast->gpio_handler, 1); ++ printk(KERN_INFO "%s: gpio %s released\n", __func__, p_contrast->info.gpio_name); ++ } ++ ++ sysfs_remove_group(&p_backlight->dev->kobj, &olinuxino_lcd_attribute_group); ++ sysfs_remove_group(&p_contrast->dev->kobj, &olinuxino_lcd_attribute_group); ++ ++ if(p_backlight->dev) ++ device_unregister(p_backlight->dev); ++ if(p_contrast->dev) ++ device_unregister(p_contrast->dev); ++ ++ class_unregister(&olinuxino_lcd_class); ++} ++ ++module_init(olinuxino_lcd_init); ++module_exit(olinuxino_lcd_exit); ++ ++MODULE_AUTHOR("Stefan Mavrodiev