9c992d982ab81110c98a519ce72cf8a84bfa5e82
1 #!/bin/bash
2 # Author:- Nikhil Devshatwar
3 # Modified by Venkateswara Rao Mandela for HDMI PLL support
4 # and ADB support
6 #This script is used for debugging issues with DSS and LCD panels.
7 #It dumps all the clocks and muxes.
8 #For any queries, contact http://e2e.ti.com/support/omap/f/885
10 # Modify this string to --force <platname> if platform detection fails
11 FORCE_PLAT=""
13 # Set this variable to 1 when running against an Android Build
14 # The android shell has limited functionality. So this script runs
15 # omapconf via adb and parses the output on the host.
16 USE_ADB=0
18 # Define a function that wraps omapconf calls and removes the usual warning
19 # messages
20 oc_func() {
22 if [ "$USE_ADB" -eq 1 ]; then
23 OMAPCONF1="adb shell omapconf $FORCE_PLAT"
24 else
25 OMAPCONF1="omapconf $FORCE_PLAT"
26 fi
27 out_str=$($OMAPCONF1 "$@" 2>&1 | sed -e '/powerdm_deinit/d' -e '/clockdm_deinit/d' -e 's/[[:space:]]*$//')
28 echo "$out_str"
29 }
30 OMAPCONF=oc_func
32 check_field() {
33 val=$1
34 shift=$2
35 mask=$3
36 fld=`printf "0x%08x" $(( $val >> $shift ))`
37 fld=$(( $fld & 0x$mask ))
38 if [ $fld = "0" ]; then
39 echo $4
40 elif [ $fld = "1" ]; then
41 echo $5
42 elif [ $fld = "2" ]; then
43 echo $6
44 elif [ $fld = "3" ]; then
45 echo $7
46 elif [ $fld = "4" ]; then
47 echo $8
48 elif [ $fld = "5" ]; then
49 echo $9
50 else
51 echo "Unknown"
52 fi
53 }
55 # Dump a register value given the address and the register name
56 # also exports a variable of the given name with the read value
57 dump_reg() {
58 reg=$1
59 regname=$2
60 local __outname=$2
61 val=0x$($OMAPCONF read "$reg")
62 echo "$regname ($reg) = $val"
63 echo
64 eval "$__outname"="'$val'"
65 }
67 get_field() {
68 start=$1
69 offset=$2
70 shift=$3
71 mask=$4
72 addr=`printf "0x%08x" $(( $start + $offset ))`
73 val=0x$($OMAPCONF read "$addr")
74 fld=`printf "0x%08x" $(( $val >> $shift ))`
75 fld=`printf "%d" $(( $fld & $mask ))`
76 echo $fld
77 }
79 dump_dpll() {
80 inst=$1
81 if [ $inst = "video1" ]; then
82 base=0x58004300
83 elif [ $inst = "video2" ]; then
84 base=0x58009300
85 elif [ $inst = "hdmi" ]; then
86 base=0x58040200
87 else
88 echo "ERROR: Unknown DPLL instance $inst"
89 exit
90 fi
92 echo "========================================================"
93 end=`printf "0x%08x" $(( $base + 0x20 ))`
94 echo "Register dump for DPLL $inst"
95 $OMAPCONF dump $base $end
97 #Interprete the regdump
99 addr=`printf "0x%08x" $(( $base + 0x4 ))`
100 val=0x$($OMAPCONF read "$addr")
101 echo "Details for DPLL $inst"
102 pllstat=`check_field $val 1 1 "inactive" "Locked"`
103 m4stat=`check_field $val 7 1 "inactive" "Active"`
104 m5stat=`check_field $val 8 1 "inactive" "Active"`
105 m6stat=`check_field $val 10 1 "inactive" "Active"`
106 m7stat=`check_field $val 11 1 "inactive" "Active"`
107 echo "PLL status : " $pllstat
108 echo "M4 hsdiv(1) : " $m4stat
109 echo "M5 hsdiv(2) : " $m5stat
110 echo "M6 hsdiv(3) : " $m6stat
111 echo "M7 hsdiv(4) : " $m7stat
112 echo
114 #Print the multipliers/dividers
115 regm=`get_field $base 0x0c 9 0xfff`
116 regn=`get_field $base 0x0c 1 0xff`
117 m4div=`get_field $base 0x0c 21 0x1f`
118 m6div=`get_field $base 0x14 0 0x1f`
119 m7div=`get_field $base 0x14 5 0x1f`
120 echo "PLL_REGM = " $regm
121 echo "PLL_REGN = " $regn
122 echo "M4 DIV = " $m4div
123 echo "M6 DIV = " $m6div
124 echo "M7 DIV = " $m7div
126 if [ $inst = "hdmi" ]; then
127 regm2=`get_field $base 0x20 18 0x7f`
128 regm_f=`get_field $base 0x20 0 0x1ffff`
129 echo "PLL_REGM2 = " $regm2
130 echo "PLL_REGM_F = " $regm2
132 pll_sd=`get_field $base 0x14 10 0xff`
133 echo "PLL_SD = " $pll_sd
135 addr=`printf "0x%08x" $(( $base + 0x18 ))`
136 val=0x$($OMAPCONF read "$addr")
137 echo "HDMI_SSC_CONFIGURATION1(should be zero) $val"
139 addr=`printf "0x%08x" $(( $base + 0x1c ))`
140 val=0x$($OMAPCONF read "$addr")
141 echo "HDMI_SSC_CONFIGURATION2(should be zero) $val"
143 fi
144 echo
146 #Calculate clkouts
147 echo "Clock calculations (DPLL $inst)"
148 if [ $inst = "hdmi" ]; then
149 dcoclk=$(( sysclk * $regm / ( ($regn + 1) * ($regm2)) ))
150 if [ $pllstat = "inactive" ]; then dcoclk=0; fi
151 echo "sysclk = $sysclk"
152 echo "CLKOUT = sysclk * REGM / (REGM2 * (REGN + 1)) = $dcoclk"
153 echo
154 eval "$inst"_pll=$dcoclk;
155 else
156 dcoclk=$(( sysclk * 2 * $regm / ($regn + 1) ))
157 if [ $pllstat = "inactive" ]; then dcoclk=0; fi
158 m4clk=$(( $dcoclk / ($m4div + 1)))
159 if [ $m4stat = "inactive" ]; then m4clk=0; fi
160 m6clk=$(( $dcoclk / ($m6div + 1)))
161 if [ $m6stat = "inactive" ]; then m6clk=0; fi
162 m7clk=$(( $dcoclk / ($m7div + 1)))
163 if [ $m7stat = "inactive" ]; then m7clk=0; fi
164 echo "sysclk = $sysclk"
165 echo "DCO clk = sysclk * 2 * REGM / (REGN + 1) = $dcoclk"
166 echo "M4clk (clkcout1) = DCO clk / (M4 DIV + 1) = $m4clk"
167 echo "M6clk (clkcout3) = DCO clk / (M6 DIV + 1) = $m6clk"
168 echo "M7clk (clkcout4) = DCO clk / (M7 DIV + 1) = $m7clk"
169 echo
171 eval "$inst"_pll=$dcoclk;
172 eval "$inst"_m4=$m4clk;
173 eval "$inst"_m6=$m6clk;
174 eval "$inst"_m7=$m7clk;
175 fi
176 }
178 init_dpll_values() {
179 inst=$1
180 eval "$inst"_pll=0
181 eval "$inst"_m4=0
182 eval "$inst"_m6=0
183 eval "$inst"_m7=0
184 }
186 dump_dss_clk_regs() {
188 dump_reg "0x4A009100" "CM_DSS_CLKSTCTRL"
189 dump_reg "0x4A009120" "CM_DSS_DSS_CLKCTRL"
190 }
192 dump_dss_clk_mux() {
193 dss_pll=0x4a002538
194 val=0x$($OMAPCONF read "$dss_pll")
195 echo "CTRL_CORE_DSS_PLL_CONTROL ($dss_pll) = $val"
196 echo "video1 PLL : " `check_field $val 0 1 "Enabled" "Disabled"`
197 echo "video2 PLL : " `check_field $val 1 1 "Enabled" "Disabled"`
198 echo "HDMI PLL : " `check_field $val 2 1 "Enabled" "Disabled"`
199 echo "DSI1_A_CLK mux : "`check_field $val 3 3 "DPLL Video1" "DPLL HDMI"`
200 echo "DSI1_B_CLK mux : "`check_field $val 5 3 "DPLL Video1" "DPLL video2" "DPLL HDMI" "DPLL ABE"`
201 echo "DSI1_C_CLK mux : "`check_field $val 7 3 "DPLL Video2" "DPLL Video1" "DPLL HDMI"`
202 echo
204 dss_ctrl=0x58000040
205 val=0x$($OMAPCONF read "$dss_ctrl")
206 echo "DSS_CTRL ($dss_ctrl) = $val"
207 echo " 2: LCD1 clk switch : " `check_field $val 0 1 "DSS clk" "DSI1_A_CLK"`
208 echo " 3: LCD2 clk switch : " `check_field $val 12 1 "DSS clk" "DSI1_B_CLK"`
209 echo "10: LCD3 clk switch : " `check_field $val 19 1 "DSS clk" "DSI1_C_CLK"`
210 echo " 1: func clk switch : " `check_field $val 7 3 "DSS clk" "DSI1_A_CLK" "DSI1_B_CLK" "HDMI_CLK" "DSI1_C_CLK"`
211 echo "13: DPI1 output : " `check_field $val 16 3 "HDMI" "LCD1" "LCD2" "LCD3"`
212 echo
214 dss_status=0x5800005C
215 val=0x$($OMAPCONF read "$dss_status")
216 echo "DSS_STATUS ($dss_status) = $val"
217 echo
219 dsi_clk_ctrl=0x58004054
220 val=0x$($OMAPCONF read "$dsi_clk_ctrl")
221 echo "DSI_CLK_CTRL ($dsi_clk_ctrl) = $val"
222 echo
223 }
225 dss_clk_print() {
226 echo "========================================================"
227 echo "Clock O/P of MUXes"
228 dss_clk=$($OMAPCONF show dpll | grep -A3 "H12 Output" | grep Speed | head -1 | cut -d '|' -f6)
229 dss_clk=$(( $dss_clk * 1000000 ))
230 echo "DPLL PER H12 Output $dss_clk"
231 dump_reg "0x4A00815C" "CM_DIV_H12_DPLL_PER"
233 dss_pll=0x4a002538
234 val=0x$($OMAPCONF read "$dss_pll")
235 dsia_clk=`check_field $val 3 3 $video1_m4 $hdmi_pll`
236 dsib_clk=`check_field $val 5 3 $video1_m6 $video2_m6 $hdmi_pll "DPLL ABE"`
237 dsic_clk=`check_field $val 7 3 $video2_m4 $video1_m6 $hdmi_pll`
238 echo "DSI1_A_CLK : " $dsia_clk
239 echo "DSI1_B_CLK : " $dsib_clk
240 echo "DSI1_C_CLK : " $dsic_clk
241 echo
243 dss_ctrl=0x58000040
244 val=0x$($OMAPCONF read "$dss_ctrl")
245 lcd1_clk=`check_field $val 0 1 $dss_clk $dsia_clk`
246 lcd2_clk=`check_field $val 12 1 $dss_clk $dsib_clk`
247 lcd3_clk=`check_field $val 19 1 $dss_clk $dsic_clk`
248 hdmi_clk=`check_field $val 7 3 $dss_clk $dsia_clk $dsib_clk $hdmi_clk $dsic_clk`
250 dump_reg "0x58001804" "DISPC_DIVISOR"
252 echo " 2: LCD1 clk : " $lcd1_clk
253 echo " 3: LCD2 clk : " $lcd2_clk
254 echo "10: LCD3 clk : " $lcd3_clk
255 echo " 1: func clk : " $hdmi_clk
256 echo
258 lcd1=`get_field 0x58001070 0x0 16 0xff`
259 lcd2=`get_field 0x5800140c 0x0 16 0xff`
260 lcd3=`get_field 0x58001838 0x0 16 0xff`
261 lcd1_lclk=0; if [ $lcd1_clk != "0" ]; then lcd1_lclk=$(( $lcd1_clk / $lcd1 )); fi
262 lcd2_lclk=0; if [ $lcd2_clk != "0" ]; then lcd2_lclk=$(( $lcd2_clk / $lcd2 )); fi
263 lcd3_lclk=0; if [ $lcd3_clk != "0" ]; then lcd3_lclk=$(( $lcd3_clk / $lcd3 )); fi
264 pcd1=`get_field 0x58001070 0x0 0 0xff`
265 pcd2=`get_field 0x5800140c 0x0 0 0xff`
266 pcd3=`get_field 0x58001838 0x0 0 0xff`
267 lcd1_pclk=0; if [ $lcd1_clk != "0" ]; then lcd1_pclk=$(( $lcd1_lclk / $pcd1 )); fi
268 lcd2_pclk=0; if [ $lcd2_clk != "0" ]; then lcd2_pclk=$(( $lcd2_lclk / $pcd2 )); fi
269 lcd3_pclk=0; if [ $lcd3_clk != "0" ]; then lcd3_pclk=$(( $lcd3_lclk / $pcd3 )); fi
270 echo "LCD1 logic clk(/" $lcd1 ") : " $lcd1_lclk " pix clk(/" $pcd1 ") : " $lcd1_pclk
271 echo "LCD2 logic clk(/" $lcd2 ") : " $lcd2_lclk " pix clk(/" $pcd2 ") : " $lcd2_pclk
272 echo "LCD3 logic clk(/" $lcd3 ") : " $lcd3_lclk " pix clk(/" $pcd3 ") : " $lcd3_pclk
273 echo
274 }
276 echo
277 echo
278 echo "=====================DSS clock script==================="
279 echo "Dumps internal clocks and muxes of DSS"
280 echo
282 #set -x
283 sysclk=20000000
284 dss_pll=0x4a002538
286 dump_dss_clk_mux
288 dump_dss_clk_regs
290 init_dpll_values video1
291 init_dpll_values video2
292 init_dpll_values hdmi
294 status=`get_field $dss_pll 0x0 0 0x1`
295 if [ $status = "0" ]; then
296 dump_dpll video1
297 fi
299 status=`get_field $dss_pll 0x0 1 0x1`
300 if [ $status = "0" ]; then
301 dump_dpll video2
302 fi
304 status=`get_field $dss_pll 0x0 2 0x1`
305 if [ $status = "0" ]; then
306 dump_dpll hdmi
307 fi
309 dss_clk_print