[Studie] EPG direkt vom Transponder pflücken

Zusatz-Programme für Receiver der 5000er und 6000er Serie.

Hier geht's um alles, was mit den TAP Anwendungen für den PVR5x00/6000 zu tun hat.
Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

[Studie] EPG direkt vom Transponder pflücken

#1

Beitrag von Harvey » Mo 5. Feb 2007, 23:17

Hai,

da ich mal wieder nicht dazu komme, etwas selbst zu programmieren, und ich der Überzeugung bin, dass mehrere Köpfe besser denken und ggf. schneller umsetzten können, hier meine rein theoretischen Erkenntnisse, wie man möglicherweise ohne Aufnahme an das EPG ran kommt.

Die folgenden Aussagen betreffen sie September05-FW für den 5x00PVR, alles andere habe ich nicht analysiert (ich sach ja - keine Zeit).

Voraussetung ist noch, dass der Topf die passende PID empfangen will.


1a.) Man suche in der FW den IRQ.Handler, der ist immer bei 80000180
1b.) Man suche darin nach

Code: Alles auswählen

    e0r	80000260:    40086800	mfc0	$t0,R13			# Cause
    e4r	80000264:    31080400	andi	$t0,0x400		
    e8r	80000268:    11000015	beq	$t0,0,140r	 // hier 140r wegmasken!!!	
    ecr	8000026c:    00000000	nop				
    f0r	80000270:    0c00057b	jal	0x800015ec		# HwIrqHandle
1c.) Man analysiere die durch jal gekennzeichnete Adresse

Code: Alles auswählen

     0r	800015ec:    27bdffc8	addiu	$sp,-56			
     4r	800015f0:    afb30024	sw	$s3,36($sp)		
     8r	800015f4:    afb40028	sw	$s4,40($sp)		
     cr	800015f8:    afb5002c	sw	$s5,44($sp)		
    10r	800015fc:    afb60030	sw	$s6,48($sp)		
    14r	80001600:    afbe0034	sw	$fp,52($sp)		
    18r	80001604:    afbf0020	sw	$ra,32($sp)		
    1cr	80001608:    3c19b000	lui	$t9,0xb000		
    20r	8000160c:    8f3e0030	lw	$fp,48($t9)		# b0000030 @EMMA_BHIF_INT_ST_1
    24r	80001610:    3c18b000	lui	$t8,0xb000		
    28r	80001614:    8f160034	lw	$s6,52($t8)		# b0000034 @EMMA_BHIF_INT_ST_2
    2cr	80001618:    24150001	move	$s5,1			
    30r	8000161c:    0000a025	move	$s4,0			
    34r	80001620:    3294ffff	andi	$s4,0xffff		
    38r	80001624:    2a810020	slti	$at,$s4,32=0x0020	
    3cr	80001628:    1020001d	beq	$at,0,b4r		
    40r	8000162c:    00000000	nop				
    44r	80001630:    03d5c824	and	$t9,$fp,$s5		
    48r	80001634:    13200016	beq	$t9,0,a4r		
    4cr	80001638:    00000000	nop				
    50r	8000163c:    3c19b000	lui	$t9,0xb000		
    54r	80001640:    8f390040	lw	$t9,64($t9)		# b0000040 @EMMA_BHIF_INT_EN_1
    58r	80001644:    02b9c824	and	$t9,$s5			
    5cr	80001648:    13200011	beq	$t9,0,a4r		
    60r	8000164c:    00000000	nop				
    64r	80001650:    3c1981b4	lui	$t9,0x81b4		
    68r	80001654:    2739b1a8	addiu	$t9,-20056=0xb1a8	# 81b3b1a8 @HwIrqFuncTable1 -> 0
1d.) Jetzt haben wir ein Array von lauter Interruptfunktionen; der 18. Eintrag davon (81b3b1a8 + 18*4=81B3B1F0) zeigt auf die Behandlungsroutine von TS_SECTION_DETECT (*81b3b1a8). Da steht in der oben genannten FW 80031520 drin, das ist der passende IQR-Handler.
1e.) Man suche nach dem ersten jal (hier beginnt die Unsicherheit zwischen den verschiedenen FWs???)

Code: Alles auswählen

    20r	80031540:    3c19b001	lui	$t9,0xb001		
    24r	80031544:    8f39a150	lw	$t9,-24240($t9)		# b000a150 @EMMA_TTSD_SECTION_DETECT_INTERRUPT1
    28r	80031548:    3c18b001	lui	$t8,0xb001		
    2cr	8003154c:    8f18a190	lw	$t8,-24176($t8)		# b000a190 @EMMA_TTSD_SECTION_DETECT_INTERRUPT_MASK1
    30r	80031550:    0338f024	and	$fp,$t9,$t8		
    34r	80031554:    3c0fb001	lui	$t7,0xb001		
    38r	80031558:    03de7027	nor	$t6,$fp,$fp		
    3cr	8003155c:    adeea150	sw	$t6,-24240($t7)		# b000a150 @EMMA_TTSD_SECTION_DETECT_INTERRUPT1
// ganz viel Code, um zu bestimmen, welche Sections neu entdeckt wurden.
// *$a0 & 0x00000001 = Filter 0, *$a0 & 0x00000001  = Filter 1 usw.
// *($a0+4) & 0x00000001 = Filter 32, *$(a0+4) & 0x00000001  = Filter 33 usw.
// *($a0+8) & 0x00000001 = Filter 64, *$(a0+8) & 0x00000001  = Filter 65 usw.
   148r	80031668:    27240020	addiu	$a0,$t9,32=0x0020	
   14cr	8003166c:    0c01ee44	jal	0x8007b910		# HandleSectionDetectIRQ
   150r	80031670:    00000000	nop				
20r - 3cr könnte eine Alternative sein, nach dem Code zu suchen. Jedenfalls führt das erste jal zur eigentlichen Behandlung.
1f.) 8007b910 vergleicht viele Bits und Bytes mit anderen, wertet hier aus und da aus mit mit verdammt großen Structs, und ich weiss nicht was. Aber es ruft nur ein mal jal auf.

Code: Alles auswählen

    8cr	8007b99c:    02602025	move	$a0,$s3	// s3 entspricht einem Index auf die Filternummer		
    90r	8007b9a0:    0c01edb0	jal	0x8007b6c0		# HandleSectionDetectCopySection
1g.) Genau hier will ich hin.

Code: Alles auswählen

// Weiss nicht wadder da kontrolliert, landet im Fehlerfall alles mit Return 0 (hoffe ich)
    174r	8007b834:    26640001	addiu	$a0,$s3,1		
   178r	8007b838:    0c000e87	jal	0x80003a1c		# get16bitLE
   17cr	8007b83c:    00000000	nop				
   180r	8007b840:    30500fff	andi	$s0,$v0,0xfff // Länge		
   184r	8007b844:    26100003	addiu	$s0,3			
   188r	8007b848:    2e012000	sltiu	$at,$s0,8192=0x2000	
   18cr	8007b84c:    14200004	bne	$at,0,1a0r		
   190r	8007b850:    00000000	nop				
   194r	8007b854:    00001025	move	$v0,0			
   198r	8007b858:    10000021	beq	0,0,220r		
   19cr	8007b85c:    00000000	nop				
   1a0r	8007b860:    0230082a	slt	$at,$s1,$s0		
   1a4r	8007b864:    10200004	beq	$at,0,1b8r		
   1a8r	8007b868:    00000000	nop				
   1acr	8007b86c:    00001025	move	$v0,0			
   1b0r	8007b870:    1000001b	beq	0,0,220r		
   1b4r	8007b874:    00000000	nop				
   1b8r	8007b878:    3c168101	lui	$s6,0x8101		
   1bcr	8007b87c:    26d6e93c	addiu	$s6,-5828=0xe93c	# 8100e93c -> 51f1636d
   1c0r	8007b880:    1a00000c	blez	$s0,1f4r		
   1c4r	8007b884:    00000000	nop				
   1c8r	8007b888:    92790000	lbu	$t9,0($s3)		
   1ccr	8007b88c:    a2d90000	sb	$t9,0($s6)		
   1d0r	8007b890:    26d60001	addiu	$s6,1			
   1d4r	8007b894:    26730001	addiu	$s3,1			
   1d8r	8007b898:    0274082b	sltu	$at,$s3,$s4		
   1dcr	8007b89c:    14200002	bne	$at,0,1e8r		
   1e0r	8007b8a0:    00000000	nop				
   1e4r	8007b8a4:    02a09825	move	$s3,$s5			
   1e8r	8007b8a8:    2610ffff	addiu	$s0,-1=0xffff		
   1ecr	8007b8ac:    1000fff4	beq	0,0,1c0r		
   1f0r	8007b8b0:    00000000	nop				
   1f4r	8007b8b4:    3c1980f5	lui	$t9,0x80f5		
   1f8r	8007b8b8:    2739e4b4	addiu	$t9,-6988=0xe4b4	# 80f4e4b4 -> 0
   1fcr	8007b8bc:    27390004	addiu	$t9,4			
   200r	8007b8c0:    001ec0c0	sll	$t8,$fp,3		
   204r	8007b8c4:    0338c821	addu	$t9,$t8			
   208r	8007b8c8:    02757823	subu	$t7,$s3,$s5		
   20cr	8007b8cc:    25ef0007	addiu	$t7,7			
   210r	8007b8d0:    31ef3fff	andi	$t7,0x3fff		
   214r	8007b8d4:    af2f0000	sw	$t7,0($t9)		
   218r	8007b8d8:    3c028101	lui	$v0,0x8101		
   21cr	8007b8dc:    2442e93c	addiu	$v0,-5828=0xe93c	# 8100e93c -> 51f1636d
   220r	8007b8e0:    8fbf0014	lw	$ra,20($sp)		
   224r	8007b8e4:    8fb00018	lw	$s0,24($sp)		
   228r	8007b8e8:    8fb1001c	lw	$s1,28($sp)		
   22cr	8007b8ec:    8fb20020	lw	$s2,32($sp)		
   230r	8007b8f0:    8fb30024	lw	$s3,36($sp)		
   234r	8007b8f4:    8fb40028	lw	$s4,40($sp)		
   238r	8007b8f8:    8fb5002c	lw	$s5,44($sp)		
   23cr	8007b8fc:    8fb60030	lw	$s6,48($sp)		
   240r	8007b900:    8fbe0034	lw	$fp,52($sp)		
   244r	8007b904:    27bd0038	addiu	$sp,56			
   248r	8007b908:    03e00008	jr	$ra			
   24cr	8007b90c:    00000000	nop				
Da wird die Section nach 8100e93 kopiert, und die Adresse 8100e93 übergeben.

2.) Hook einbauen, wo man das Return (8007b8e0) gefunden hat.
In dem Hook würde ich nicht mehr machen, als die Table-ID zu prüfen (1. Byte), die Länge zu bestimmen (Diskrepanz!!!: 3.Byte&15<<8 || 2.Byte laut dem Code, ich kenne es in einer anreren Doku als 2.Byte&15<<8 || 3.Byte ), und den Krempel in einen fix reservierten Bereich zu kopieren. Immerhin befindet man sich in der Interruptroutine.

2,5 :) Ich mach morgen weiter und schicke das erst mal ab.
Wenn jemand damit was anfangen kann möge er es verweden.
Wenn nicht, habe ich grade eine Sicherungskopie auf einem externen Server angelegt. Vor März wird das bei mir nichts.
Zuletzt geändert von Harvey am Di 6. Feb 2007, 09:40, insgesamt 1-mal geändert.
Gruss
Harvey

Benutzeravatar
FireBird
Suspekter verdächtiger Zauberküchenchef, TAP & Firmware-Guru
Suspekter verdächtiger Zauberküchenchef, TAP & Firmware-Guru
Beiträge: 29048
Registriert: Fr 9. Dez 2005, 09:59
Receivertyp: SRP-2401CI+ TFIR
vu+ Duo 4k
Wohnort: Wien

AW: [Studie] EPG direkt vom Transponder pflücken

#2

Beitrag von FireBird » Di 6. Feb 2007, 00:22

Kleine Diskrepanz mit meinen Unterlagen, was aber am Ganzen nichts ändert. In meinen Unterlagen ist der IRQ16 = TS_PACKET_DETECT, der SECTION_DETECT läuft auf 18. Wobei ich nicht mehr genau weis, aus welchen Siemens-Sourcen ich das geklaut habe.

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

AW: [Studie] EPG direkt vom Transponder pflücken

#3

Beitrag von Harvey » Di 6. Feb 2007, 09:19

Ja, ist die 18. Danke.
Gruss
Harvey

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

AW: [Studie] EPG direkt vom Transponder pflücken

#4

Beitrag von Harvey » So 18. Feb 2007, 13:44

So, für den TF5x00 habe ich ein (für den praktischen Gebrauch sinnloses) Demo-TAP geschrieben.

Ich habe keine Ahnung, ob es auf anderen Geräten läuft, weil ich es mir vorläufig einfacher als oben angegeben gemacht habe und nach was anderem suche:

Code: Alles auswählen

    b8r	8007b9c8:    27a40011	addiu	$a0,$sp,17=0x0011	
    bcr	8007b9cc:    26250003	addiu	$a1,$s1,3		
    c0r	8007b9d0:    24060007	move	$a2,7			
    c4r	8007b9d4:    0c000dad	jal	0x800036b4		# memcpy
    c8r	8007b9d8:    00000000	nop				
Es enthält einen Hook zum Kopieren von PID-Sections in einen 256k großen Ringpuffer, welche später im IDLE-Event verarbeitet werden können. Vor der Initialisierung des Hooks wird festgelegt, welche TableIDs kopiert werden sollen.

Noch muss man sich darauf verlassen, dass der Topf die Sections selber gebrauchen kann, die entsprechenden Filter also gesetzt hat. Wie man selbst welche einrichten kann weiß ich noch nicht (so kommen vom Hintergrundtuner auch auf diese Weise nur Current und Next Event rein :( ).

Auch ist noch keine Überprüfung drin, ob die Tabellen zu einer bestimmten PID gehören (das wird komplexer, weil ein FW-Patch von nöten wäre).


In dieser Demo macht das IDLE-Event 3 Minuten lang via SectionProcess() nichts anderes, als den Inhalt aller EPG-Tabellen (0x4E - 0x6F) so wie sie sind auf Festplatte zu schreiben. Danach beendet sich das TAP.

Ziel ist natürlich die Auswertung ohne den Umweg über die Festplatte, aber ich will kein weiteres EPG-Programm schreiben, sondern einen Weg zum Gebrauch in anderen Programmen aufzeichnen. Deshalb habe ich übrigens nur den Sourcecode hochgeladen (FirebirdLib ist von Nöten).

Das TAP hat Pre- Pre- Pre- Apha- Charakter.

@tapworld: This TAP is useless. Its only a study.


Sourcecode only:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Harvey am So 18. Feb 2007, 13:57, insgesamt 1-mal geändert.
Gruss
Harvey

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

AW: [Studie] EPG direkt vom Transponder pflücken

#5

Beitrag von Harvey » So 18. Feb 2007, 14:00

Ich hoffe, es hatte vor 13:57 keiner runtergeladen, sonst bitte noch mal.
Gruss
Harvey

t3xi
TAP-Guru
TAP-Guru
Beiträge: 1499
Registriert: Mo 16. Jan 2006, 13:35
Receivertyp: 5^4*2^3

AW: [Studie] EPG direkt vom Transponder pflücken

#6

Beitrag von t3xi » So 18. Feb 2007, 15:05

Ich hab's gerade mal beim ZDF Transponder getestet. Die Datenmenge, die pro Minute geschrieben wird, ist leider nicht besonders hoch. Mit dem EPG-Recorder gekommt man ca. 10mal mehr EPG-Daten. Scheinbar werden die anderen 90% vorher irgendwo herausgefiltert.

Benutzeravatar
FireBird
Suspekter verdächtiger Zauberküchenchef, TAP & Firmware-Guru
Suspekter verdächtiger Zauberküchenchef, TAP & Firmware-Guru
Beiträge: 29048
Registriert: Fr 9. Dez 2005, 09:59
Receivertyp: SRP-2401CI+ TFIR
vu+ Duo 4k
Wohnort: Wien

AW: [Studie] EPG direkt vom Transponder pflücken

#7

Beitrag von FireBird » So 18. Feb 2007, 15:06

Zur Info:

void SectionDetectHook (dword unknown, tCPURegs* CPURegs)

unknown ist der Index des Hooks. Falls Du mehrere Hooks auf diesen Hook-Handler hinleitest, kannst Du diese über den Parameter unterscheiden. Weiters kann man den 2. Parameter mit tCPURegs* deklarieren, dann hat man direkten Zugriff auf die CPU-Registernamen:

sectionCopy = (byte*) CPURegs->a1;


MfG. Alex
Zuletzt geändert von FireBird am So 18. Feb 2007, 15:15, insgesamt 1-mal geändert.

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

AW: [Studie] EPG direkt vom Transponder pflücken

#8

Beitrag von Harvey » So 18. Feb 2007, 16:13

mhmm - das was t3xi berichtet klingt ja nicht sehr ermutigend. Bei Dir nehme ich an, dass Du nicht vergessen hast, den Audioteil herauszurechnen (den Du mit aufnimmst um die Cluster schneller voll zu bekommen, oder?)?

Danke für die Rückmeldung.
Zuletzt geändert von Harvey am So 18. Feb 2007, 16:16, insgesamt 1-mal geändert.
Gruss
Harvey

t3xi
TAP-Guru
TAP-Guru
Beiträge: 1499
Registriert: Mo 16. Jan 2006, 13:35
Receivertyp: 5^4*2^3

AW: [Studie] EPG direkt vom Transponder pflücken

#9

Beitrag von t3xi » So 18. Feb 2007, 16:30

Audiodaten habe ich vorher abgezogen, bzw. den EPG-PID 18 demuxt. Allerdings ist mir inzwischen aufgefallen das die Daten vom EPGWatcher entweder weniger oder gar nicht redundant sind, im Gegensatz zum EPG-Recorder. Dadurch ist es nicht so einfach die Datenmenge zu vergleichen.

tapworld
Seltsamer Zeitgenosse :-(
Seltsamer Zeitgenosse  <font color=#E9E9E9>:-(</font>
Beiträge: 270
Registriert: Di 13. Dez 2005, 20:40

AW: [Studie] EPG direkt vom Transponder pflücken

#10

Beitrag von tapworld » So 18. Feb 2007, 16:36

[quote=""Harvey""]@tapworld: This TAP is useless. Its only a study.
[/quote]

It is nice that some of you remember me also :)
Thanks for informing.

Benutzeravatar
Harvey
iTina-Promoter und Kuhinteressent
iTina-Promoter und Kuhinteressent
Beiträge: 3894
Registriert: So 11. Dez 2005, 22:34
Receivertyp: 0x1388 PVR
Receiverfirmware: 13.09.2005
Wohnort: Planet Erde, Milchstraße

AW: [Studie] EPG direkt vom Transponder pflücken

#11

Beitrag von Harvey » So 18. Feb 2007, 16:49

Redundant sind sie im verlinkten Watcher auch. Ich habs grade mal 5 Minuten auf dem ZDF-Transponder probiert, aber ohne die Tabellen 0x4e und 0x4f (current und next). Inga Lindström kommt in den 1733kB 4 mal vor (kA ob da ne Widerholung bei ist).

Allerdings war das jetzt nur eine Stichprobe. Es ist innerhalb einer Binärdatei etwas schwer zu sehen, was da ist und was fehlt. Ich dekodiere ja nichts.
Gruss
Harvey

Antworten

Zurück zu „TF 5x00/6000 PVR TAP“