Add function to read and dump address
[glsdk/util-scripts.git] / debug / dss_clockdumps.sh
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
98         
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
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
186 dump_dss_clk_mux() {
187         dss_pll=0x4a002538
188         val=0x$($OMAPCONF read "$dss_pll")
189         echo "CTRL_CORE_DSS_PLL_CONTROL ($dss_pll) = $val"
190         echo "video1 PLL : "    `check_field $val 0 1 "Enabled" "Disabled"`
191         echo "video2 PLL : "    `check_field $val 1 1 "Enabled" "Disabled"`
192         echo "HDMI   PLL : "    `check_field $val 2 1 "Enabled" "Disabled"`
193         echo "DSI1_A_CLK mux : "`check_field $val 3 3 "DPLL Video1" "DPLL HDMI"`
194         echo "DSI1_B_CLK mux : "`check_field $val 5 3 "DPLL Video1" "DPLL video2" "DPLL HDMI" "DPLL ABE"`
195         echo "DSI1_C_CLK mux : "`check_field $val 7 3 "DPLL Video2" "DPLL Video1" "DPLL HDMI"`
196         echo
198         dss_ctrl=0x58000040
199         val=0x$($OMAPCONF read "$dss_ctrl")
200         echo "DSS_CTRL ($dss_ctrl) = $val"
201         echo " 2: LCD1 clk switch : "   `check_field $val  0 1 "DSS clk" "DSI1_A_CLK"`
202         echo " 3: LCD2 clk switch : "   `check_field $val 12 1 "DSS clk" "DSI1_B_CLK"`
203         echo "10: LCD3 clk switch : "   `check_field $val 19 1 "DSS clk" "DSI1_C_CLK"`
204         echo " 1: func clk switch : "   `check_field $val  7 3 "DSS clk" "DSI1_A_CLK" "DSI1_B_CLK" "HDMI_CLK" "DSI1_C_CLK"`
205         echo "13: DPI1 output     : "   `check_field $val 16 3 "HDMI" "LCD1" "LCD3" "LCD2"`
206         echo
208         dss_status=0x5800005C
209         val=0x$($OMAPCONF read "$dss_status")
210         echo "DSS_STATUS ($dss_status) = $val"
211         echo
213         dsi_clk_ctrl=0x58004054
214         val=0x$($OMAPCONF read "$dsi_clk_ctrl")
215         echo "DSI_CLK_CTRL ($dsi_clk_ctrl) = $val"
216         echo
219 dss_clk_print() {
220         echo "========================================================"
221         echo "Clock O/P of MUXes"
222         dss_clk=$($OMAPCONF show dpll | grep -A3 "H12 Output" | grep Speed | head -1 | cut -d '|' -f6)
223         dss_clk=$(( $dss_clk * 1000000 ))
225         dss_pll=0x4a002538
226         val=0x$($OMAPCONF read "$dss_pll")
227                 dsia_clk=`check_field $val 3 3 $video1_m4 $hdmi_pll`
228                 dsib_clk=`check_field $val 5 3 $video1_m6 $video2_m6 $hdmi_pll "DPLL ABE"`
229                 dsic_clk=`check_field $val 7 3 $video2_m4 $video1_m6 $hdmi_pll`
230         echo "DSI1_A_CLK : " $dsia_clk
231         echo "DSI1_B_CLK : " $dsib_clk
232         echo "DSI1_C_CLK : " $dsic_clk
233         echo 
235         dss_ctrl=0x58000040
236         val=0x$($OMAPCONF read "$dss_ctrl")
237                 lcd1_clk=`check_field $val  0 1 $dss_clk $dsia_clk`
238                 lcd2_clk=`check_field $val 12 1 $dss_clk $dsib_clk`
239                 lcd3_clk=`check_field $val 19 1 $dss_clk $dsic_clk`
240                 hdmi_clk=`check_field $val  7 3 $dss_clk $dsia_clk $dsib_clk $hdmi_clk $dsic_clk`
241         echo " 2: LCD1 clk : "  $lcd1_clk
242         echo " 3: LCD2 clk : "  $lcd2_clk
243         echo "10: LCD3 clk : "  $lcd3_clk
244         echo " 1: func clk : "  $hdmi_clk
245         echo 
247                 lcd1=`get_field 0x58001070 0x0 16 0xff`
248                 lcd2=`get_field 0x5800140c 0x0 16 0xff`
249                 lcd3=`get_field 0x58001838 0x0 16 0xff`
250         lcd1_lclk=0; if [ $lcd1_clk != "0" ]; then lcd1_lclk=$(( $lcd1_clk / $lcd1 )); fi
251         lcd2_lclk=0; if [ $lcd2_clk != "0" ]; then lcd2_lclk=$(( $lcd2_clk / $lcd2 )); fi
252         lcd3_lclk=0; if [ $lcd3_clk != "0" ]; then lcd3_lclk=$(( $lcd3_clk / $lcd3 )); fi
253                 pcd1=`get_field 0x58001070 0x0  0 0xff`
254                 pcd2=`get_field 0x5800140c 0x0  0 0xff`
255                 pcd3=`get_field 0x58001838 0x0  0 0xff`
256         lcd1_pclk=0; if [ $lcd1_clk != "0" ]; then lcd1_pclk=$(( $lcd1_lclk / $pcd1 )); fi
257         lcd2_pclk=0; if [ $lcd2_clk != "0" ]; then lcd2_pclk=$(( $lcd2_lclk / $pcd2 )); fi
258         lcd3_pclk=0; if [ $lcd3_clk != "0" ]; then lcd3_pclk=$(( $lcd3_lclk / $pcd3 )); fi
259         echo "LCD1 logic clk(/" $lcd1 ") : " $lcd1_lclk " pix clk(/" $pcd1 ") : " $lcd1_pclk
260         echo "LCD2 logic clk(/" $lcd2 ") : " $lcd2_lclk " pix clk(/" $pcd2 ") : " $lcd2_pclk
261         echo "LCD3 logic clk(/" $lcd3 ") : " $lcd3_lclk " pix clk(/" $pcd3 ") : " $lcd3_pclk
262         echo 
265 echo
266 echo
267 echo "=====================DSS clock script==================="
268 echo  "Dumps internal clocks and muxes of DSS"
269 echo
271 #set -x
272 sysclk=20000000
273 dss_pll=0x4a002538
275 dump_dss_clk_mux
277 init_dpll_values video1
278 init_dpll_values video2
279 init_dpll_values hdmi
281 status=`get_field $dss_pll 0x0  0 0x1`
282 if [ $status = "0" ]; then
283         dump_dpll video1
284 fi
286 status=`get_field $dss_pll 0x0  1 0x1`
287 if [ $status = "0" ]; then
288         dump_dpll video2
289 fi
291 status=`get_field $dss_pll 0x0  2 0x1`
292 if [ $status = "0" ]; then
293         dump_dpll hdmi
294 fi
296 dss_clk_print