[Tutorial] Analizar y Resolver problemas RGH/Jtag

Muchos en vuestras instalaciones os habeis encontrado alguna vez que la consola no arranca presentando alguno de los numerosos posible fallos.Si entendemos el proceso técnico del RGH nos ayudará a encontrar mas facilmente la causa de los errores mas habituales que se presentan en nuestras consolas.

Un poco de Teoria ;) . Proceso de arranque.
Al arrancar la consola ejecuta una pequeña porcion de codigo en la CPU de solo lectura el 1bl.bin (bootloader 1)

Este se encarga de ciertos procesos que ahora no es necesario entender (inicializar Hards ...) , lo importante es que se comienza la bootsequence cargando el siguente bootloader 2bl (CB) , desencriptandolo , comprobando que es original y ejecutandolo en caso de que lo sea.

Este mismo proceso se va repitiendo con los consecutivos bootloaders CD,CE,CF,CG,DASH.

Inicialmente este proceso por motivos debug utilizaba un puerto (postout) de 8 bits que nos iba diciendo en que punto exacto del bootsequence (secuencia de arranque ) se encontraba la consola.

En una de las ultimas actualizaciones de Dash se anulo el postout capando el RGH hasta la aparicion de los CBa Rip que permitio volver a usarlo.

Si nosotros modificamos (parcheamos) uno de esos bootloaders para que , por ejemplo, se salte ciertos checks, el bootloader (anterior en la secuencia ) al cargarlo comprobaria que el hash no coincide y al detectar que esta modificado provocaria un "panic" y no arrancaria la consola.

Gligli se puso manos a la obra y decidio un punto de esta secuencia para romper la comprobacion (hash) de un bootloader y asi poder parchear todo lo que queramos a partir de ese punto (bootloader, Kernel, Dash ...).

No voy a extenderme mucho en este proceso ya que hay mucha info al respecto. Solo decir que decidio desestabilizar la Cpu glitcheandolo ( nano reset de la CPU) en el momento exacto en el que realiza el check hash al cargar el bootloader parcheado.

¿ Como actúa el chip en este proceso y para que sirve cada uno de sus cables?
CPURST:

Este es el punto usado para desestablizar la Cpu. Soldamos un cable del chip al Cpu para enviar un 0 logico provocando un reset en el momento exacto durante escasos nanosegundos.

La Cpu comprueba la integridad del bootloader calculando su Hash y enviandolo a un registro del CPU y comparandolo con el Hash correcto guardado en otro registro del CPU.

Si justo en el momento de realizar esta comparacion le pegamos un viaje (cpurst) y tenemos suerte respondera que "SI" aunque no lo sean y la secuencia de arranque continua.

Si no hacemos el cpurst en el momento justo de esta comparacion respondera que "No" son iguales y entrara en "panic" , si el cpurst es muy corto no sera suficiente para desestabilizar la Cpu, y si es demasiado largo dejaremos la CPU colgada , perdera algun registro vital y tendremos algun tipo de cuelgue en la secuencia de arranque, reiniciandose todo el proceso para reintentarlo.

El SMC original al quinto intento nos mostraria luces rojas. Al estar el SMC parcheado para reinicios infinitos el chip lo reintentará hasta que lo consiga.

POSTOUT:

El chip lo que hace es usar el puerto post out a traves de un cable soldado a uno de sus bits ya que Gligli observo que solo necesitaba debuguear uno de sus 8 bits para saber el momento deseado exacto en el cual pretendia desestabilizar la CPU.
Gracias a este punto el chip sabe exactamente cuando frenar (se enciende el Debug Led) el CPU , hacer el cpurst y volver al CPU a su velocidad normal (Apagado del Debug Led) .

Conozco sceners que estan desarrollando chips usando todos los bits del postout obteniendo muy buenos resultados al ser mas preciso el debug del proceso.

PLL/SDA&SDL:

La velocidad del chip utilizado en su momento era muy baja con respecto a la del Cpu con lo cual no era capaz de golpear en el momento exacto.

Pongamos un ejemplo para entender mejor el problema de las velocidades (MHZ)

Imaginemos dos vehiculos en una carretera avanzando en la misma direccion , si sale el coche A mas lento (chip) va a 30 Km/h y despues sale el coche B (CPU) mucho mas rapido 1000 km/h adelantara en un momento concreto al coche A.

Pues bien un valiente quiere saltar del techo del coche A al coche B justo al adelantarlo, al ser tantisima la diferencia de velocidad es casi imposible acertar el momento exacto de saltar, o saltara antes de tiempo o saltara despues y ostia al canto!.

Si justo antes de adelantar el coche B al A frenamos el coche B (CPU) a 100 Km/h seguira siendo dificil el momento exacto pero habra muchas mas probabilidades de exito y una vez el valiente haya saltado con exito dejar de frenarlo para que continue a su ritmo.

Esta fue la idea y gligli busco una forma para frenar la CPU en las Fat y descubrio el punto PLL en la placa, con un cable de este punto al chip enviando un 0 logico consiguió su objetivo. En las slim con dual CB no era valido este metodo y tuvo que optar por enviar un comando a traves del puerto SPI que tambien conseguia frenar la CPU aunque no tanto como el PLL de las Fat Rgh1 y por eso era algo mas dificil glitchearlas. Mas tarde en las Fat RGH1 a traves de una actualizacion pasaron a ser dual CB (Rgh2) anulando la posibilidad de usar el PLL y tuvieron que pasar al sistema de frenado del CPU de las Slim siendo aun mas inestables.


CLK:

Este punto es el que marca la velocidad de nuestro chip. Hay chips que usan uno de los CLK de la placa soldando un cable al chip y otros chips como el Squirt al llevar su propio CLK no necesitan este punto. Las placas coronas eliminaron el CLK usado por los chips clasicos con lo cual obligaban a usar chips con CLK interno. Squirt fue una vez mas el pionero.

Cuanto mas rapido sea el CLK usado por el chip mejor sera la relacion de velocidad que explicaba antes entre chip y CPU aumentando la probabilidad de exito y la estabilidad del mismo.

Se rumorea que Squirt esta desarrollando una version de su magnifico Bga 1.2 con cristal de 100MHZ que promete aportar estabilidad en consolas problematicas.

VCC/GND:

Estos ultimos puntos no necesitan de mucha explicacion, simplemente alimentan el chip, cada modelo trabaja a un determinado voltaje , la mayoria usan 3,3v pero otros como el DGX usa 5V.


Si entendemos todo este rollo nos sera mas facil entender cierto problemas.

Posibles problemas causados por los diferentes puntos del chip:
CPURST:

* Este cable es el mas delicado ya que el pulso que envia debe ser increiblemente preciso y puede verse afectado por interferencias provocadas por los propios componentes de la placa (bobinas ...) , el ventilador , la chapa, etc. Incluso el numero de dispositivos USB (mandos, hdd...) enchufados en la consola , el tipo de alimentador de la consola, el grosor o largo de los cables etc son suficientes para que el pulso no llegue en su momento o duracion adecuada.

El famoso largo del Cpurst es importante por el simple hecho de que una señal logica no es mas que una corriente electrica. Si un punto tiene 0V se considera un 0 logico y un 1 logico sera si ese punto tiene un voltaje suficiente segun cada caso.

Esta corriente va a traves de un cable y segun su largo a nivel de nanosegundos puede verse afectado tanto en el momento que tarda en llegar a la CPU como a la intensidad y largo del pulso enviado.

De modo que si este cable esta mal instalado provocara:
- Si no esta conectado no enviara el pulso, la consola entrara en bucle o glitcheo infinito.
- Si el largo , posicion ... no es el exacto el glitcheo sera inestable o incluso infinito.


POSTOUT:

* Si este punto falla el chip no conseguira saber con exactitud el momento de frenar y hacer el cpurst.
- No se enciende el DebugLed ( cable desconectado o mal soldado)
- Se enciende de forma inestable
- O simplemente no acierta y glitcheo infinito.


PLL/SDA&SDL:

* Si estos puntos no estan correctamente instalados no frenara adecuadamente la CPU y no acertara en el momento exacto:
- El Debugled se enciende mas rapido de lo normal
- El Debugled se mantiene encendido inestablemente, glitchs cortos y largos aleatorios.
- Si no puenteamos correctamente las resistencias ausentes en el SPI de las coronas sin postout provocara inestabilidad al no frenar correctamente la CPU. A veces es conveniente usar resistencias o cables largos para hacer estos puentes.


CLK:

* Si este punto falla o el reloj interno falla al estar el chip programado para actuar en ciertos instantes si su reloj esta mal no acertara en el momento de actuar.
- Si no se conecta bien el chip no arrancará.
- Si falla la velocidad de proceso del chip sera inestable.
- Si el clk es lento con respecto al Cpu aleatoriamente al chip puede no darle tiempo a hacer el proceso glitch y el CPU se le pasara de largo. Posible causa por la que algunos chips clasicos con clk 48mhz no consiguen glitchear establemente algunos nuevos modelos (corona con nand Toshiba Ntsc)


VCC/GND:

* Si estos cables fallan ni siquiera se encendera el chip. Si usamos cables inadecuados puede provocar inestabilidad en el resto de lso puntos del chip y al propio funcionamiento del chip.Se suelene usar cables mas gordos en estos puntos para ayudar en la estabilidad.

- Si falla el VCC/GND No se enciende el led de encendido.
- Cables inadecuados provocará inestabilidad general del chip.


OTROS:

Algunas veces el chip inestabiliza los voltajes de la consola y se producen cuelgues aleatorios. Editando ciertos parametros relacionados con los voltajes en el SMC_config solventa estos problemas. (Power Mode, Ana Fuse ...)

Muchos se preguntan que diferencia hay en los timmings como los del RGH2_A,RGH2_B... o incluso entre Modelos Falcon, Jasper ...

Pues bien , los timming o .svf de un mismo chip solo varian entre un modelo y otro de consola en los pulsos de reloj que sirven de contador para calcular el momento y longitud del nanopulso.

Los bootloaders son diferentes en cada modelo y por tanto tienen una cantidad de instrucciones diferente, esto hace que el momento en el tiempo en el que debemos hacer el cpurst logicamente no coincide.

Ejemplo Rgh1
constant WIDTH_RESET_START : integer := 1603; -- zephyr: 1723, falcon: 1603, jasper: 1628
constant WIDTH_RESET_END : integer := 5;
constant WIDTH_BYPASS_END : integer := 48000;

Logicamente tambien varia si hay o no dual CB.

Rgh1
constant POST_37 : integer := 13;
constant POST_39 : integer := 14;
constant POST_3B : integer := 15;

Rgh2
constant POST_B8 : integer := 12;
constant POST_BA : integer := 13;
constant POST_BB : integer := 14;

El tema de los codigos vhd de Xilinx daría para mucho pero no me voy a extender ahora para no complicaros.

Quizas cree un nuevo Tutorial explicando paso a paso el codigo vhd de los chips.

Conclusion final:
Como vemos es un proceso que requiere una maxima precision y estabilidad a la maxima velocidad posible. Cuanto mas rapido (mhz) sea el chip y fiable sea el fabricante (Team) mejores resultados tendremos a corto,medio y largo plazo.

Por supuesto una mala instalacion , un corto ... pueden dañar la consola.Pero es importante recordar que dias o meses despues de una instalacion por deterioro del chip si se unen ciertas circunstancias en el proceso de glitcheo podemos dañar irreversiblemente la CPU (0022...).

Si por ejemplo el chip falla al frenar la CPU y realiza el cpurst cuando el la CPU esta a una alta velocidad puede dañarlo.

Si por ejemplo el chip es inestable y una vez arrancada la consola a pleno rendimiento se despierta erroneamente y realiza un cpurst tambien podria dañar la CPU.

Por eso si quieres asegurarte un glitcheo estable y por mucho tiempo personalmente recomiendo chips fabricados por Teams que se juegan su reputacion y por lo tanto usaran componentes de calidad , estabilidad y durabilidad.


Esto no es la biblia del Rgh, solo mi aporte despues de mucho tiempo y experiencia en este hobby que comparto con la intencion de ayudar a los que deciden entrar o progresar en este mundillo.

He pretendido resumir el proceso sin entrar en demasiados conceptos técnicos para que cualquiera pueda entender y no aburrir demasiado. :)

Los aportes son bienvenidos.

Saludos.
Gracias zehenork por este fantástico hilo, es cierto que no descubres nada nuevo que ya no sepamos algunos, pero desde luego a muchos usuarios que llegan nuevos y otros no tan nuevos les vendrá muy bien, este hilo se merece una chincheta aunque eso ya no es cosa mía, pero desde luego si lo fuera no me lo pensaría, saludos.
Hacia mucho tiempo no veia un aporte asi a este subforo scene de Xbox.

Muchas cosas ya las conocia pero tu analisis resumido en un lenguaje para todos los publicos me saco de muchas dudas.

Si esto no se merece un chinchetazo no se que lo merece.

[plas] [plas] [plas]

Gracias zehenork.
Muy bueno, si señor, gracias ;)
(mensaje borrado)
vecino terminar está baneado por "Troll - EOL no es tu foro"
al detalle, espero mas de uno entienda mejor
Hola, he actualizado algo el post.

La intencion de este hilo es hacer un pequeño resumen teorico de algo muy extenso sin entrar a conceptos demasiado tecnicos para que algunos de vosotros podais resolver dudas o problemas que os puedan surgir en vuestras instalaciones.

Tambien pretende acercarse a quienes les gusta la scene , a mi en su dia me hubiera gustado algun Hilo de este tipo para en poco mas de 10 minutos de lectura poder entender a "groso modo" en que consiste el RGH.

El codigo vhd que se compila para generar los svf que programamos en los chips es un tema interesante que tampoco entiende mucha gente y quizas merezca un Tutorial aparte que explique brevemente como funciona. Si saco tiempo me pongo a ello.

Saludos
Muy interesante, la verdad es que es flipante como los teams llegan a descubrir estas cosas, para mi son genios en toda regla. Deberia ser lectura obligatoria para todo aquel que tiene una Xbox modificada y que no solo le interese "tené un chí pa jugá ar fifa gráti".

Un 10 por la info.
(mensaje borrado)
vecino terminar está baneado por "Troll - EOL no es tu foro"
vecino terminar escribió:interesante toca leerlo detalladamente ,hablas sobre la posible causa de las nand toshina y los chips de 48mhz, aun no es claro ya que las pal van como anillo al dedo

segun leí a blakcat quitas el problema se encuentra en el .ecc

saludos


Exacto, lo que decia blakcat que no cuadra es que el Xell arranque siempre y el Dash NO.

En la secuencia de arranque el CD comprueba a traves del smc si la consola se encendio con Eject . En este caso desvia la secuencia hacia el arranque del Xell , si fue con otro boton arranca el Dash.

Parte del Codigo del Bootloader CD donde comprueba si encendimos con Eject para ejecutar Xell:

ROM:00005864 loc_5864: # CODE XREF: start+560Cj
ROM:00005864 # start+5630j
ROM:00005864 lwz r12, 0x1094(r8) # pregunta al SMC como encendimos
ROM:00005868 and. r12, r12, r9 # check for 04 (swapped)
ROM:0000586C beq loc_5864 # Branch if equal
ROM:00005870 stw r9, 0x1094(r8) # Store Word
ROM:00005874 lwz r12, 0x1090(r8) # Load Word and Zero
ROM:00005878 lwz r3, 0x1090(r8) # Load Word and Zero
ROM:0000587C lwz r3, 0x1090(r8) # Load Word and Zero
ROM:00005880 lwz r3, 0x1090(r8) # Load Word and Zero
ROM:00005884 stw r11, 0x1094(r8) # Store Word
ROM:00005888 srwi r3, r12, 24 # Shift Right Immediate
ROM:0000588C cmpwi r3, 1 # Compare Word Immediate
ROM:00005890 bne loc_5864 # Branch if not equal
ROM:00005894 extrwi r3, r12, 8,8 # Extract and Right Justify Immediate
ROM:00005898 cmpwi r3, 0x12 # Segun si encendimos con Power o Eject
ROM:0000589C beq STARTXELL # Arranca Xell
ROM:000058A0 lis r3, 0x300 # Load Immediate Shifted
ROM:000058A4 b STARTDASH # o Arranca Dash


Lo curioso que si llegamos a este punto el chip ya ha cumplido su funcion de glitchear la comprobacion del hash CB parcheado y tanto Xell como Dash deberian de arrancar de igual forma.

No he podido probar una toshiba Ntsc , si la tuviera debuguearia el Postout y localizaria el fallo rapidamente. Pero si segun dicen se producen glitchs cortos el problema parece claro.

Mi opinion es que el problema viene por la falta de velocidad del chip y por eso el Dgx y el Xrun funcionan mejor. Saldremos de dudas con la posible llegada del Squirt 100MHz.

Confirmo que las Toshiba Pal funcionan, pero en las Ntsc debe haber algun factor que altere de alguna manera la estabilidad del proceso.

Segun mi teoria si se produce glitch corto y la instalacion de cables es correcta solo puede tratarse de un fallo al manejar las fases del propio chip.

Si por ejemplo por falta de la suficiente velocidad del chip se salta algun salto en el postout bit puede empezar el proceso de frenado del Cpu demasiado tarde acortandose el tiempo en el que el debug led esta encendido perdiendo el punto de referencia provocando un cpurst en el momento fallido.

Tambien podria ser que el comando Spi no acaba ejecutarse correctamente y la Cpu no frena y por eso los glitchs rapidos.

¿Por que el fallo es aleatorio y a veces aparece al tiempo? ¿Por que algunos lo consiguen y yo no?
Porque como ya explique el proceso debe tener una precision altisima y esta precision puede verse afectada por muchas circunstancias como el desgaste o la instalacion.

En mi opinion con un chip de 100mhz no se saltara ningun postbit y el comando spi llegara estable y todo funcione correctamente sin necesitar tantisima precision en la instalacion.

Ya veremos!
(mensaje borrado)
vecino terminar está baneado por "Troll - EOL no es tu foro"
zehenork escribió:Mi opinion es que el problema viene por la falta de velocidad del chip y por eso el Dgx y el Xrun funcionan mejor. Saldremos de dudas con la posible llegada del Squirt 100MHz.


Todo la calidad y optimizacion de un Squirt pero ahora a 100MHZ, esperemos salga pronto, saludos.
Muy buen hilo y aporte que nos hace entender con un poco más de detalle el funcionamiento del rgh que a veces provoca tantos quebraderos de cabeza, jajaja. Sobre todo cuando tienes que variar los parámetros de la nand como el power mode para que no se congele la consola al cierto tiempo de jugar.

Gracias por el aporte y un saludo.
muy interesante, gracias x ayudar.
muchas gracias por el hilo y esta información es de obligatoria para que todos la lean
un saludo
(mensaje borrado)
vecino terminar está baneado por "Troll - EOL no es tu foro"
vecino terminar escribió:
casca escribió:
zehenork escribió:Mi opinion es que el problema viene por la falta de velocidad del chip y por eso el Dgx y el Xrun funcionan mejor. Saldremos de dudas con la posible llegada del Squirt 100MHz.


Todo la calidad y optimizacion de un Squirt pero ahora a 100MHZ, esperemos salga pronto, saludos.

no sabes si uno puede cambiar el oscialdor del chip por uno de 100 mhz o se requiere una modificacion del chip????


seria cuestión de leer la programación con la que esta el x360run y programar el chip y poner el cristal de el x360 run
Los timmings (bitstream o .svf) que programamos en los chips con diferentes segun el modelo.

Incluso en la misma familia de una marca de chip cada uno tendra una diferente configuracion , input&outputs ...

Ejemplo de main.ucf con la configuracion de un chip:

#PACE: Start of Constraints generated by PACE

#PACE: Start of PACE I/O Pin Assignments
NET "CLK"  LOC = "PD10" | IOSTANDARD = LVCMOS33 ;
NET "CPU_RESET"  LOC = "PE10" | IOSTANDARD = LVCMOS15  | SCHMITT_TRIGGER ;
NET "DBG"  LOC = "PC1" | IOSTANDARD = LVCMOS33 ;
NET "POSTBIT"  LOC = "PH3" | IOSTANDARD = LVCMOS15  | SCHMITT_TRIGGER ;
NET "SCL"  LOC = "PA4" | IOSTANDARD = LVCMOS33 ;
NET "SDA"  LOC = "PA5" | IOSTANDARD = LVCMOS33 ;

#PACE: Start of PACE Area Constraints

#PACE: Start of PACE Prohibit Constraints

Pero es mas, segun como programemos un mismo chip este utilizara una diferente configuracion de inputs/output (patillas) de modo que no podremos cambiar un matrix por un CR aunque usaran el mismo chip porque puede variar la configuracion programada en ellos.

Ademas de esto cuando compilamos un bitstream (.svf) lo hacemos con los parametros basados en el reloj que usemos. Si a un chip le cambiamos el reloj los tiempos de frenado de cpu, cpurst ... no coincidiran y no funcionaria.
Ejemplo de tiempos basado en clk 48mhz
constant WIDTH_RESET_START  : integer := 17357;
constant WIDTH_RESET_END    : integer := 2;
constant TIME_BYPASS_END   : integer := 44800;


Conclusion: Dejaros de experimentos cambiando cristales o chips porque no funcionará.
Excelente hilo compañero, mis felicitaciones.
Resulta que yo ya lo dije en su dia y no me haciais caso, este sera el chip gordo definitivo que yo ya vi en el yotuve montado en la plei.

/mode ironia off

Buen aporte, subo el hilo.
yo estoy con una nand Toshiba NTSC y tal como dice mas arriba , para la ejecucion del Cell es mucho mas facil , en cambio al encendido normal los glitch son mas cortos
zehenork: gracias por la info es interesante saber como funcionan las cosas para que puedas tener mas opciones para eliminar errores.

Me gustaria saber si tienes mas informacion sobre el Botloader firmado que fue filtrado hace unos meses y permitio prescindir del DGX, ya que esa info no me queda muy clara, me da a entender que firmando eso se podrian firmar mas cosas del proceso de arranque y asi hackear una consola sin necesidad de chip.

Gracias
21 respuestas