• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/perl
2
3#   Copyright (C) 2008 Mauro Carvalho Chehab
4#
5#   This program is free software; you can redistribute it and/or modify
6#   it under the terms of the GNU General Public License as published by
7#   the Free Software Foundation, version 2 of the License.
8#
9#   This program is distributed in the hope that it will be useful,
10#   but WITHOUT ANY WARRANTY; without even the implied warranty of
11#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12#   GNU General Public License for more details.
13#
14# FIXME: need to properly map 32 bites aligned read/writes also.
15#
16
17use strict;
18
19my $debug = 0;
20
21my %reg_map = (
22	0x101 => "SAA7134_INCR_DELAY",
23	0x102 => "SAA7134_ANALOG_IN_CTRL1",
24	0x103 => "SAA7134_ANALOG_IN_CTRL2",
25	0x104 => "SAA7134_ANALOG_IN_CTRL3",
26	0x105 => "SAA7134_ANALOG_IN_CTRL4",
27	0x106 => "SAA7134_HSYNC_START",
28	0x107 => "SAA7134_HSYNC_STOP",
29	0x108 => "SAA7134_SYNC_CTRL",
30	0x109 => "SAA7134_LUMA_CTRL",
31	0x10a => "SAA7134_DEC_LUMA_BRIGHT",
32	0x10b => "SAA7134_DEC_LUMA_CONTRAST",
33	0x10c => "SAA7134_DEC_CHROMA_SATURATION",
34	0x10d => "SAA7134_DEC_CHROMA_HUE",
35	0x10e => "SAA7134_CHROMA_CTRL1",
36	0x10f => "SAA7134_CHROMA_GAIN",
37	0x110 => "SAA7134_CHROMA_CTRL2",
38	0x111 => "SAA7134_MODE_DELAY_CTRL",
39	0x114 => "SAA7134_ANALOG_ADC",
40	0x115 => "SAA7134_VGATE_START",
41	0x116 => "SAA7134_VGATE_STOP",
42	0x117 => "SAA7134_MISC_VGATE_MSB",
43	0x118 => "SAA7134_RAW_DATA_GAIN",
44	0x119 => "SAA7134_RAW_DATA_OFFSET",
45	0x11e => "SAA7134_STATUS_VIDEO1",
46	0x11f => "SAA7134_STATUS_VIDEO2",
47	0x300 => "SAA7134_OFMT_VIDEO_A",
48	0x301 => "SAA7134_OFMT_DATA_A",
49	0x302 => "SAA7134_OFMT_VIDEO_B",
50	0x303 => "SAA7134_OFMT_DATA_B",
51	0x304 => "SAA7134_ALPHA_NOCLIP",
52	0x305 => "SAA7134_ALPHA_CLIP",
53	0x308 => "SAA7134_UV_PIXEL",
54	0x309 => "SAA7134_CLIP_RED",
55	0x30a => "SAA7134_CLIP_GREEN",
56	0x30b => "SAA7134_CLIP_BLUE",
57	0x180 => "SAA7134_I2C_ATTR_STATUS",
58	0x181 => "SAA7134_I2C_DATA",
59	0x182 => "SAA7134_I2C_CLOCK_SELECT",
60	0x183 => "SAA7134_I2C_TIMER",
61	0x140 => "SAA7134_NICAM_ADD_DATA1",
62	0x141 => "SAA7134_NICAM_ADD_DATA2",
63	0x142 => "SAA7134_NICAM_STATUS",
64	0x143 => "SAA7134_AUDIO_STATUS",
65	0x144 => "SAA7134_NICAM_ERROR_COUNT",
66	0x145 => "SAA7134_IDENT_SIF",
67	0x146 => "SAA7134_LEVEL_READOUT1",
68	0x147 => "SAA7134_LEVEL_READOUT2",
69	0x148 => "SAA7134_NICAM_ERROR_LOW",
70	0x149 => "SAA7134_NICAM_ERROR_HIGH",
71	0x14a => "SAA7134_DCXO_IDENT_CTRL",
72	0x14b => "SAA7134_DEMODULATOR",
73	0x14c => "SAA7134_AGC_GAIN_SELECT",
74	0x150 => "SAA7134_CARRIER1_FREQ0",
75	0x151 => "SAA7134_CARRIER1_FREQ1",
76	0x152 => "SAA7134_CARRIER1_FREQ2",
77	0x154 => "SAA7134_CARRIER2_FREQ0",
78	0x155 => "SAA7134_CARRIER2_FREQ1",
79	0x156 => "SAA7134_CARRIER2_FREQ2",
80	0x158 => "SAA7134_NUM_SAMPLES0",
81	0x159 => "SAA7134_NUM_SAMPLES1",
82	0x15a => "SAA7134_NUM_SAMPLES2",
83	0x15b => "SAA7134_AUDIO_FORMAT_CTRL",
84	0x160 => "SAA7134_MONITOR_SELECT",
85	0x161 => "SAA7134_FM_DEEMPHASIS",
86	0x162 => "SAA7134_FM_DEMATRIX",
87	0x163 => "SAA7134_CHANNEL1_LEVEL",
88	0x164 => "SAA7134_CHANNEL2_LEVEL",
89	0x165 => "SAA7134_NICAM_CONFIG",
90	0x166 => "SAA7134_NICAM_LEVEL_ADJUST",
91	0x167 => "SAA7134_STEREO_DAC_OUTPUT_SELECT",
92	0x168 => "SAA7134_I2S_OUTPUT_FORMAT",
93	0x169 => "SAA7134_I2S_OUTPUT_SELECT",
94	0x16a => "SAA7134_I2S_OUTPUT_LEVEL",
95	0x16b => "SAA7134_DSP_OUTPUT_SELECT",
96	0x16c => "SAA7134_AUDIO_MUTE_CTRL",
97	0x16d => "SAA7134_SIF_SAMPLE_FREQ",
98	0x16e => "SAA7134_ANALOG_IO_SELECT",
99	0x170 => "SAA7134_AUDIO_CLOCK0",
100	0x171 => "SAA7134_AUDIO_CLOCK1",
101	0x172 => "SAA7134_AUDIO_CLOCK2",
102	0x173 => "SAA7134_AUDIO_PLL_CTRL",
103	0x174 => "SAA7134_AUDIO_CLOCKS_PER_FIELD0",
104	0x175 => "SAA7134_AUDIO_CLOCKS_PER_FIELD1",
105	0x176 => "SAA7134_AUDIO_CLOCKS_PER_FIELD2",
106	0x190 => "SAA7134_VIDEO_PORT_CTRL0",
107	0x191 => "SAA7134_VIDEO_PORT_CTRL1",
108	0x192 => "SAA7134_VIDEO_PORT_CTRL2",
109	0x193 => "SAA7134_VIDEO_PORT_CTRL3",
110	0x194 => "SAA7134_VIDEO_PORT_CTRL4",
111	0x195 => "SAA7134_VIDEO_PORT_CTRL5",
112	0x196 => "SAA7134_VIDEO_PORT_CTRL6",
113	0x197 => "SAA7134_VIDEO_PORT_CTRL7",
114	0x198 => "SAA7134_VIDEO_PORT_CTRL8",
115	0x1a0 => "SAA7134_TS_PARALLEL",
116	0x1a1 => "SAA7134_TS_PARALLEL_SERIAL",
117	0x1a2 => "SAA7134_TS_SERIAL0",
118	0x1a3 => "SAA7134_TS_SERIAL1",
119	0x1a4 => "SAA7134_TS_DMA0",
120	0x1a5 => "SAA7134_TS_DMA1",
121	0x1a6 => "SAA7134_TS_DMA2",
122	0x1B0 => "SAA7134_GPIO_GPMODE0",
123	0x1B1 => "SAA7134_GPIO_GPMODE1",
124	0x1B2 => "SAA7134_GPIO_GPMODE2",
125	0x1B3 => "SAA7134_GPIO_GPMODE3",
126	0x1B4 => "SAA7134_GPIO_GPSTATUS0",
127	0x1B5 => "SAA7134_GPIO_GPSTATUS1",
128	0x1B6 => "SAA7134_GPIO_GPSTATUS2",
129	0x1B7 => "SAA7134_GPIO_GPSTATUS3",
130	0x1c0 => "SAA7134_I2S_AUDIO_OUTPUT",
131	0x1d0 => "SAA7134_SPECIAL_MODE",
132	0x1d1 => "SAA7134_PRODUCTION_TEST_MODE",
133	0x580 => "SAA7135_DSP_RWSTATE",
134	0x586 => "SAA7135_DSP_RWCLEAR",
135	0x591 => "SAA7133_I2S_AUDIO_CONTROL",
136);
137
138my %i2c_status = (
139	0  => "IDLE",
140	1  => "DONE_STOP",
141	2  => "BUSY",
142	3  => "TO_SCL",
143	4  => "TO_ARB",
144	5  => "DONE_WRITE",
145	6  => "DONE_READ",
146	7  => "DONE_WRITE_TO",
147	8  => "DONE_READ_TO",
148	9  => "NO_DEVICE",
149	10 => "NO_ACKN",
150	11 => "BUS_ERR",
151	12 => "ARB_LOST",
152	13 => "SEQ_ERR",
153	14 => "ST_ERR",
154	15 => "SW_ERR",
155);
156
157my %i2c_attr = (
158	0 => "NOP",
159	1 => "STOP",
160	2 => "CONTINUE",
161	3 => "START",
162);
163
164my $addr = -1;
165my $write = 0;
166my $direction;
167my @buf;
168
169sub flush_i2c_transaction($$)
170{
171	my $direction = shift;
172	my $is_complete = shift;
173
174	my $size = scalar(@buf);
175
176	if ($direction == 0) {
177		my $v = shift @buf;
178		printf("write_i2c_addr(0x%02x, %d, { 0x%02x",
179			$addr, $size, $v);
180		while (scalar(@buf)) {
181			my $v = shift @buf;
182			printf(", 0x%02x", $v);
183		}
184		printf("});");
185	} else {
186		my $size = scalar(@buf);
187		my $v = shift @buf;
188		printf("read_i2c_addr(0x%02x, %d) /* 0x%02x",
189			$addr, $size, $v);
190		while (scalar(@buf)) {
191			my $v = shift @buf;
192			printf(", 0x%02x", $v);
193		}
194		printf(" */;");
195	}
196	@buf = ();
197	$addr = -1;
198
199	printf (" /* INCOMPLETE */") if (!$is_complete);
200	printf "\n";
201}
202sub parse_i2c($$$$$)
203{
204	my $time = shift;
205	my $optype = shift;
206	my $align = shift;
207	my $reg = shift;
208	my $val = shift;
209	my $discard = 0;
210
211	if ($align ne 'l') {
212		print("FIXME: currently, parser work only with 32 bits i2c reg $optype\n");
213		return;
214	}
215
216	my $status = $i2c_status{$val & 0x0f};
217	my $attr = $i2c_attr{($val >> 6) & 0x03};
218
219	# Avoid poluting the logs with busy msgs
220	$discard = 1 if ($status eq "BUSY" | $status eq "TO_SCL" | $status eq "TO_ARB");
221
222	# Avoid poluting the logs with read msgs during write
223	$discard = 1 if ($optype eq "read" && $status eq "DONE_WRITE");
224
225	# Avoid poluting the logs with NOP operations
226	$discard = 1 if ($attr eq "NOP");
227
228	# Prints I2C raw transaction
229	if ($debug >= 1) {
230		return if ($debug == 1 && $discard);
231		if ($optype eq "write") {
232			printf("write_i2c(%s, %s, 0x%02x)\t/* %s */\n", $status, $attr, $val >> 8, $time);
233		} else {
234			printf("val = read_i2c()\t/* %s: read %s, %s, val=0x%02x */\n", $time, $status, $attr, $val >> 8);
235		}
236	}
237	return if ($discard);
238	$val >>= 8;
239
240	if (($attr eq "START") && ($optype eq "write")) {
241		flush_i2c_transaction(0, 0) if (scalar(@buf) && $addr >= 0);
242
243		$direction = $val & 1;
244		$addr = $val >> 1;
245	}
246	# Prints I2C transaction. This state machine is not 100%
247	# it is known to fail with eeprom access
248	if (($direction == 0) && ($optype eq "write")) {
249		if ($attr eq "CONTINUE") {
250			# Discard transactions on the wrong direction
251			push @buf, $val;
252		} elsif ($attr eq "STOP" && $addr >= 0) {
253			flush_i2c_transaction(0, 1);
254		}
255	} elsif ($direction == 1) {
256		if ($optype eq "write") {
257			$write = 1;
258			return;
259		}
260		return if (!$write);
261		$write = 0;
262
263		if ($attr eq "CONTINUE") {
264			push @buf, $val;
265		} elsif ($attr eq "STOP" && $addr >= 0) {
266			flush_i2c_transaction(1, 1);
267		}
268	}
269}
270
271while (<>) {
272	# 1286074716 slow_bar_read.: slow_bar_readl addr=0x0000000000000180 val=0x00008182
273	if (m/^(\d+)\s+slow_bar_(read|write)(.).*addr=([^\s]+)\s+val=([^\s]+)/) {
274		my $time = $1;
275		my $optype = $2;
276		my $align = $3;
277		my $op = "$2$3";
278		my $reg = hex($4);
279		my $val = hex($5);
280		if (defined($reg_map{$reg})) {
281			$reg = $reg_map{$reg};
282		} else {
283			$reg = sprintf("0x%04x", $reg);
284		}
285		if ($reg =~ m/SAA7134_I2C_ATTR_STATUS/) {
286			parse_i2c($time, $optype, $align, $reg, $val);
287		} elsif ($optype eq "read") {
288			printf ("reg = saa_%s(%s);	/* %s: read 0x%04x */\n", $op, $reg, $time, $val);
289		} else {
290			printf ("saa_%s(%s, 0x%04x);	/* %s */\n", $op, $reg, $val, $time);
291		}
292	}
293}
294