Skip to content

Latest commit

 

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

lcd_firmware

mipi lcd epprom固件及其烧录工具

编译

确认需要烧录的板卡以及接口,修改firmware_burn.c

// rk3562、rk3576、rk3588
#define NVMEM_PATH      "/sys/bus/nvmem/devices/eeprom1/nvmem"
// #define NVMEM_PATH      "/sys/bus/nvmem/devices/eeprom2/nvmem"

// rk356x dsi0
// #define NVMEM_PATH      "/sys/bus/nvmem/devices/1-00510/nvmem"
// rk356x dsi1
// #define NVMEM_PATH      "/sys/bus/nvmem/devices/5-00510/nvmem"
  • 当rk3576、rk3588板卡只接一个屏幕时eeprom无论是哪个接口都注册为eeprom1,当接两个屏幕时,dsi0注册为eeprom1、dsi1注册为eeprom2。
  • rk356x板卡根据i2c总线进行注册,dsi0为1-00510表示i2c1上的0x51地址的设备、dsi1为5-00510表示i2c5上的0x51地址的设备。

修改定义后,直接make编译即可

# 交叉编译arm64版本
make CROSS_COMPILE=aarch64-linux-gnu-

# 交叉编译armhf版本
make CROSS_COMPILE=arm-linux-gnueabihf-

# 在板子上编译
make

编译得到的 firmware_burn 就是可烧录屏幕eeprom固件的可执行程序。而Makefile里面定义了板卡ip地址,修改为实际板卡ip,可直接将firmware_burn传到板卡。

烧录固件

开启xxx-generic-overlay.dtbo通用屏幕插件,重启板卡

然后运行firmware_burn,输入需要屏幕编号,如EBF410173_STL7060132K_7inch_1024x600

root@lubancat:/home/cat# ./firmware_burn

select board...
[1] EBF410125_BS055FHEN30_5.5inch_1080x1920
[2] EBF410125_STL5530258K_5.5inch_1080x1920
[3] EBF410125_STL5565818A_5.5inch_1080x1920
[4] EBF410173_STL7060132K_7inch_1024x600
[5] EBF410173_STL70193861K_7inch_1024x600
[6] EBF410574_BSD1229A7HL27_7inch_800x1280
[7] EBF410177_STL10132331A_10.1inch_800x1280
[8] EBF410575_BSD1218A101KL68_10.1inch_800x1280
[9] EBF410630_HXR35027C20_3.5inch_320x480
[10] LXCK_S8001280B1060B_10.1inch_800x1280
4
LCD vendor: Embedfire
LCD model: STL7.0-60-132-K
Firmware version: v1.0
Firmware Burning ...
v1 firmware burned OK
TLV burned OK
ALL firmware burned successfully

烧录完重启板卡即可。

自动烧录固件

如鲁班猫2的板卡同时烧录2个屏幕的eeprom,分别选择rk356x dsi0、dsi1定义进行编译,将firmware_burn分别重命名为firmware_burn_dsi0、firmware_burn_dsi1

然后编写firmware_burn.sh,内容如下,注意根据实际屏幕修改参数:

#!/bin/bash

FLAG_FILE="/home/cat/eeprom_burn.flag"
NVMEM_PATH_0="/sys/bus/nvmem/devices/1-00510/nvmem"
NVMEM_PATH_1="/sys/bus/nvmem/devices/5-00510/nvmem"

if [ ! -f "$FLAG_FILE" ]; then
    echo 'not_burned' > "$FLAG_FILE"
fi

FLAG_STATUS=$(cat "$FLAG_FILE" 2>/dev/null)

if [ "$FLAG_STATUS" = "not_burned" ]; then

    if [ -f "$NVMEM_PATH_0" ]; then
        # 根据实际屏幕修改参数,此处5.5 v1
        echo "1" | /home/cat/firmware_burn_dsi0
    fi

    if [ -f "$NVMEM_PATH_1" ]; then
        # 根据实际屏幕修改参数,此处5.5 v1
        echo "1" | /home/cat/firmware_burn_dsi1
    fi

    echo "burned" > "$FLAG_FILE"
    sync
    reboot
elif [ "$FLAG_STATUS" = "burned" ]; then
    echo 'not_burned' > "$FLAG_FILE"
    sync
else
    echo 'not_burned' > "$FLAG_FILE"
    sync
    reboot
fi

添加执行权限:

sudo chmod 777 firmware_burn.sh

创建/etc/systemd/system/firmware_burn.service,内容如下:

[Unit]
Description = firmware_burn

[Service]
ExecStart = /home/cat/firmware_burn.sh
Restart = never
Type = oneshot

[Install]
WantedBy = multi-user.target

使能服务:

sudo systemctl enable firmware_burn.service
sudo systemctl start firmware_burn.service

以上,第一次启动时自动烧录固件,重置标志状态为burned,表示下次启动时无需烧录固件,烧录固件完成后自动重启;第二次启动时,重置标志状态为not_burned,表示下次启动时需烧录固件,此次启动不会自动重启,可观察屏幕有没有成功点亮;以此循环。

自动绑定触摸

当同时开启多个屏幕时需要绑定触摸到对应的屏幕,可使用桌面系统方式,当进入桌面时自动运行绑定脚本从而绑定触摸。

在桌面登录用户的家目录下创建启动文件:

#以cat用户为例
mkdir /home/cat/.config/autostart

#创建配置文件
vim /home/cat/.config/autostart/bind_touch.desktop

在bind_touch.desktop文件中添加以下内容:

[Desktop Entry]
Type=Application
Exec=/home/cat/bind_touch.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=My App
Comment=Start My App on login

根据上面的自启动配置,创建自启动脚本,cd进入/home/cat/目录下,编写一个bind_touch.sh脚本,脚本内容如下:

#!/bin/bash

export DISPLAY=:0.0

TOUCH_IDS=($(xinput list | \
    awk '/Virtual core pointer/,/Virtual core keyboard/ { 
        if ($0 ~ /Goodix Capacitive TouchScreen/ && $0 ~ /id=/) {     
        split($0, arr, "id=");     
        split(arr[2], num, " ");   
        print num[1];             
        }
    }' | grep -E '^[0-9]+$'))             

DSI_LIST=($(xrandr -q | grep "DSI-[0-9] connected" | awk '{print $1}'))

if [ ${#TOUCH_IDS[@]} -ge 2 ] && [ ${#DSI_LIST[@]} -ge 2 ]; then
    # echo "绑定触摸屏ID ${TOUCH_IDS[0]} 到 ${DSI_LIST[0]}"
    xinput map-to-output ${TOUCH_IDS[0]} ${DSI_LIST[0]}
    # echo "绑定触摸屏ID ${TOUCH_IDS[1]} 到 ${DSI_LIST[1]}"
    xinput map-to-output ${TOUCH_IDS[1]} ${DSI_LIST[1]}
else
    TARGET_DSI=""
    for dsi in "${DSI_LIST[@]}"; do
        RES_COUNT=0
        IN_TARGET_DSI=0

        while IFS= read -r line; do
        if echo "$line" | grep -q "^$dsi connected"; then
            IN_TARGET_DSI=1
            continue
        fi
        if echo "$line" | grep -q "^DSI-[0-9] connected" && ! echo "$line" | grep -q "^$dsi connected"; then
            IN_TARGET_DSI=0
            continue
        fi
        if [ $IN_TARGET_DSI -eq 1 ] && echo "$line" | grep -q '[0-9]\+x[0-9]\+'; then
            RES_COUNT=$((RES_COUNT + 1))
        fi
        done <<< "$(xrandr -q)"
      
        if [ $RES_COUNT -eq 1 ]; then
        TARGET_DSI=$dsi
        break
        fi
    done
  
    if [ -z "$TARGET_DSI" ]; then
        TARGET_DSI="DSI-1"
        if ! echo "${DSI_LIST[*]}" | grep -q "DSI-2"; then
        TARGET_DSI=${DSI_LIST[0]}
        fi
    fi
  
    if [ ${#TOUCH_IDS[@]} -ge 1 ]; then
        MAIN_TOUCH_ID=${TOUCH_IDS[0]}
        # echo "绑定触摸屏ID $MAIN_TOUCH_ID 到 $TARGET_DSI"
        xinput map-to-output $MAIN_TOUCH_ID $TARGET_DSI
    else
        # echo "错误:未找到任何Goodix触摸屏ID"
        exit 1
    fi
fi

以上脚本实现的功能是如果存在两个屏幕则顺序绑定触摸,如果存在单个屏幕则绑定到对应的屏幕。

添加脚本执行权限:

sudo chmod 777 /home/cat/bind_touch.sh

需注意,要进入桌面才会自动运行bind_touch.sh脚本,需自行添加桌面自动登录。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages