1*90d8781dSJon Lin#!/bin/bash 2*90d8781dSJon Lin 3*90d8781dSJon Linsoc=$1 4*90d8781dSJon Lingen=$2 5*90d8781dSJon Linlanes=$3 6*90d8781dSJon Linbaundary=$4 7*90d8781dSJon Lininput=$9 8*90d8781dSJon Lin 9*90d8781dSJon Linmagic0=70 10*90d8781dSJon Linmagic1=63 11*90d8781dSJon Linmagic2=69 12*90d8781dSJon Linmagic3=65 13*90d8781dSJon Lincode0=00 14*90d8781dSJon Lincode1=43 15*90d8781dSJon Lincode2=00 16*90d8781dSJon Lincode3=00 17*90d8781dSJon Lin# case: vid=0x1d87 did=0x356a 18*90d8781dSJon Linvid_l=$5 19*90d8781dSJon Linvid_h=$6 20*90d8781dSJon Lindid_l=$7 21*90d8781dSJon Lindid_h=$8 22*90d8781dSJon Lin 23*90d8781dSJon Linfunction usage() 24*90d8781dSJon Lin{ 25*90d8781dSJon Lin echo "./pcie_idb_config.sh <soc> <gen> <lanes> <uart_baundary> <vid_l> <vid_h> <did_l> <did_h> <input>" 26*90d8781dSJon Lin echo "like following:" 27*90d8781dSJon Lin echo "./pcie_idb_config.sh RK3588 3 4 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin" 28*90d8781dSJon Lin echo "./pcie_idb_config.sh RK3588 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin" 29*90d8781dSJon Lin echo "./pcie_idb_config.sh RK3588 3 4 115200 87 1d 6a 35 bin/rk35/rk3568_pcie_v*.bin" 30*90d8781dSJon Lin echo "./pcie_idb_config.sh RK3568 3 2 1500000 87 1d 6a 35 bin/rk35/rk3588_pcie_v*.bin" 31*90d8781dSJon Lin} 32*90d8781dSJon Lin 33*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_SHIFT 0 34*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_MASK 3 35*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_AGGREGATION PHY_MODE_PCIE_AGGREGATION /**< 4 PCIE3x4 */ 36*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBNB PHY_MODE_PCIE_NANBNB /**< 0 P1:PCIE3x2 + P0:PCIE3x2 */ 37*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NANBBI PHY_MODE_PCIE_NANBBI /**< 1 P1:PCIE3x2 + P0:PCIE3x1*2 */ 38*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABINB PHY_MODE_PCIE_NABINB /**< 2 P1:PCIE3x1*2 + P0:PCIE3x2 */ 39*90d8781dSJon Lin#define PCIE_IDB_CFG_PHY_MODE_NABIBI PHY_MODE_PCIE_NABIBI /**< 3 P1:PCIE3x1*2 + P0:PCIE3x1*2 */ 40*90d8781dSJon Lin#define PCIE_IDB_CFG_GEN_SHIFT 8 41*90d8781dSJon Lin#define PCIE_IDB_CFG_GEN_MASK 3 42*90d8781dSJon Lin#define PCIE_IDB_CFG_LANE_SHIFT 12 43*90d8781dSJon Lin#define PCIE_IDB_CFG_LANE_MASK 3 44*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_SHIFT 16 45*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_ID_MASK 3 46*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_SHIFT 20 47*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_MUX_MASK 3 48*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_SHIFT 24 49*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_MASK 2 50*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_DEFAULT 0 51*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_15000000 1 52*90d8781dSJon Lin#define PCIE_IDB_CFG_UART_RATE_1152000 2 53*90d8781dSJon Lin 54*90d8781dSJon Linif [[ $soc != RK3588 && $soc != RK3568 ]]; then 55*90d8781dSJon Lin echo "input param soc=$soc invalid, support RK3588/RK3568" 56*90d8781dSJon Lin usage 57*90d8781dSJon Lin exit 58*90d8781dSJon Linfi 59*90d8781dSJon Lin 60*90d8781dSJon Linif [[ $soc == RK3588 ]]; then 61*90d8781dSJon Lin if [[ $gen != 3 ]]; then 62*90d8781dSJon Lin echo "input param gen=$gen invalid, support 3" 63*90d8781dSJon Lin usage 64*90d8781dSJon Lin exit 65*90d8781dSJon Lin fi 66*90d8781dSJon Lin 67*90d8781dSJon Lin if [[ $lanes != 4 && $lanes != 2 ]]; then 68*90d8781dSJon Lin echo "input param lanes=$lanes invalid, support 4/2" 69*90d8781dSJon Lin usage 70*90d8781dSJon Lin exit 71*90d8781dSJon Lin fi 72*90d8781dSJon Lin 73*90d8781dSJon Lin if [[ $baundary != 1500000 && $baundary != 115200 ]]; then 74*90d8781dSJon Lin echo "input param baundary=$baundary invalid, support 1500000/115200" 75*90d8781dSJon Lin usage 76*90d8781dSJon Lin exit 77*90d8781dSJon Lin fi 78*90d8781dSJon Linfi 79*90d8781dSJon Lin 80*90d8781dSJon Linif [[ $soc == RK3568 ]]; then 81*90d8781dSJon Lin if [[ $gen != 3 ]]; then 82*90d8781dSJon Lin echo "input param gen=$gen invalid, support 3" 83*90d8781dSJon Lin usage 84*90d8781dSJon Lin exit 85*90d8781dSJon Lin fi 86*90d8781dSJon Lin 87*90d8781dSJon Lin if [[ $lanes != 2 ]]; then 88*90d8781dSJon Lin echo "input param lanes=$lanes invalid, support 2" 89*90d8781dSJon Lin usage 90*90d8781dSJon Lin exit 91*90d8781dSJon Lin fi 92*90d8781dSJon Lin 93*90d8781dSJon Lin if [[ $baundary != 1500000 ]]; then 94*90d8781dSJon Lin echo "input param baundary=$baundary invalid, support 1500000" 95*90d8781dSJon Lin usage 96*90d8781dSJon Lin exit 97*90d8781dSJon Lin fi 98*90d8781dSJon Linfi 99*90d8781dSJon Lin 100*90d8781dSJon Linif [ -f "$input" ]; then 101*90d8781dSJon Lin echo "input param file=$input" 102*90d8781dSJon Linelse 103*90d8781dSJon Lin echo "input param file=$input invalid" 104*90d8781dSJon Lin exit 105*90d8781dSJon Linfi 106*90d8781dSJon Lin 107*90d8781dSJon Linif [[ $lanes == 4 ]]; then 108*90d8781dSJon Lin if [[ $soc == RK3588 ]]; then 109*90d8781dSJon Lin code0=04 110*90d8781dSJon Lin fi 111*90d8781dSJon Linelif [[ $lanes == 2 ]]; then 112*90d8781dSJon Lin code1=23 113*90d8781dSJon Linfi 114*90d8781dSJon Lin 115*90d8781dSJon Linif [[ $baundary == 1500000 ]]; then 116*90d8781dSJon Lin code3=01 117*90d8781dSJon Linfi 118*90d8781dSJon Lin 119*90d8781dSJon Linif [[ $baundary == 115200 ]]; then 120*90d8781dSJon Lin code3=02 121*90d8781dSJon Lin 122*90d8781dSJon Linfi 123*90d8781dSJon Lin 124*90d8781dSJon Linif [[ $baundary == 115200 ]]; then 125*90d8781dSJon Lin code3=02 126*90d8781dSJon Lin 127*90d8781dSJon Linfi 128*90d8781dSJon Lin 129*90d8781dSJon Linecho "code0=$code0" 130*90d8781dSJon Linecho "code1=$code1" 131*90d8781dSJon Linecho "code2=$code2" 132*90d8781dSJon Linecho "code3=$code3" 133*90d8781dSJon Linecho "vid=0x${vid_h}${vid_l} did=0x${did_h}${did_l}" 134*90d8781dSJon Lin 135*90d8781dSJon Linecho -e -n "\x${magic0}\x${magic1}\x${magic2}\x${magic3}" > .pcie_idb_cfg.bak 136*90d8781dSJon Linecho -e -n "\x${code0}\x${code1}\x${code2}\x${code3}\x${vid_l}\x${vid_h}\x${did_l}\x${did_h}" >> .pcie_idb_cfg.bak 137*90d8781dSJon Lindd if=$input of=.temp bs=1 count=4 > /dev/null 138*90d8781dSJon Lindd if=.pcie_idb_cfg.bak of=$input bs=1 seek=4 conv=notrunc > /dev/null 139*90d8781dSJon Lin 140