Propuesta de solucion al acceso por DMA para las tarjetas SD

Aviso
Sobre el cierre del foro

Durante más de dos décadas, la pasión por exprimir al máximo el potencial de las videoconsolas ha sido una parte fundamental de EOL. Sin embargo, la masificación del juego en línea (que impide la modificación de la consola para otros usos) y la proliferación de multitud de dispositivos como portátiles de uso general y media centers han ido relegando la scene a un papel más secundario.

En este contexto y, tras ser advertidos de que el contenido de numerosos hilos del foro podría infringir los derechos de propiedad intelectual o industrial de terceros y analizar con nuestro servicio jurídico la situación, hemos decidido cerrar el foro. En consecuencia, tampoco se podrán volver a tratar los contenidos de este foro en otros foros de temática general.
Bueno, ya lo he comentado en otros foros y creo que no estara de menos comentarlo aqui. a ver si hay algun manitas o mejor dicho entendido en electronica.

Problema planteado:

Las tarjetas SD en Gamecube (mediante adaptador SD a puerto de memoria, el que sea) no pueden ser accedidas mediante DMA por culpa de una cualidad del bus de la GC. Esta cualidad es la misma que permitio dumpear la IPL original de la GC desencriptada, los datos leidos o enviados en el bus se reescriben en un registro del bus.

Esta circunstancia hace que al acceder a las tarjetas SD los datos leidos se sobreescriban en dicho registro y esten disponibles en el bus de modo que el controlador de la tarjeta SD puede leerlos y si encuentra un 0 en su linea de entrada interpretar que se trata de un comando (cuando en realidad es el dato que se ha leido de ella anteriormente).

Para evitar esta circusntancia se utiliza la SD en modo de acceso directo y cada vez que se lee un dato de ella se sobreescribe dicho registro con un dato que son todos 1 -> 0xFFFFFFFF (y por lo tanto no puede ser interpretado por el controlador de la SD como un comando).

Pero si intentamos acceder a la tarjeta SD en modo DMA (para obtener un rendimiento decente y optimo que nos permita ver peliculas, cargar roms de emuladores o guardar savestates sin problemas de parones) encontramos el problema que nos aguarda. El modo DMA se caracteriza por la lectura o escritura de varios datos sin el control directo de la CPU, quedando esta libre para realizar otras tareas, y al no tener control sobre la transferencia no es posible escribir ese dato 0xFFFFFFFF que hace que la SD lea comandos erroneos y por lo tanto se producen errores y cuelgues.


Solucion que propongo:

Primero, dire que puede que no sea posible, ya que no soy ningun experto en electronica, algo se, pero no soy ningun maquina.

Lo que propongo es una modificacion en el adaptador de tarjetas SD a puerto de memoria, SD-Gecko por poner un ejemplo.

¿Seria posible modificar el SD-Gecko añadiendole la circuiteria necesaria para filtrar la interfaz del controlador de la SD? ¿Que circuiteria seria necesaria?

Lo que deberia hacer esa circuiteria es evitar la lectura de 0s en la linea de comando despues de cada ciclo de lectura en la SD. Por lo tanto, poner un 1 en la linea correspondiente cada vez que fuera necesario. Pero deberia asegurarse de no escribir nada mas alla de los ciclos de lectura de la SD, para permitir la entrada de comandos al controlador de la SD.

Habria que estudiar mas a fondo el funcionamiento de cada pin y la señal en cada momento, pero puede que esta circuiteria no sea muy compleja.

Venga, a ver si algun manitas puede colaborar y entre eso y un apaño en el driver de linux obtenemos un sistema de almacenamiento como dios manda ;)
Lo que deberia hacer esa circuiteria es evitar la lectura de 0s en la linea de comando despues de cada ciclo de lectura en la SD.????

Creo que no te he entendido bien, ¿se puede leer fuera de un cliclo de lectura?. Que yo sepa a la memoria le importa bien poco que haya en la entrada de direccion si no se produce un ciclo de lectura (es decir fuera). Si lo que pretendes es detectar una secuencia de 32 ceros 0xFFFFFFFF, es tan sencillo como detectar dicha secuencia (se me ocurre una simple, como un detector de 32 ceros). La deteccion podria llevarse a unas puertas triestado que deshabilitan la conexion (siempre y cuando la dirreccion sea 0xFFFFFFFF). Explicate mejor, ya me diras.
no se yo antes de matarme en eso intentaria averiguar cual es la velocidad que se podria alcanzar con ello no se que velocidad da el bus.
no se yo antes de matarme en eso intentaria averiguar cual es la velocidad que se podria alcanzar con ello no se que velocidad da el bus.


Actualmente la velocidad puedo decirte que no es suficiente para ver peliculas desde la SD con una calidad aceptable. El reloj al que funciona el bus es de 16Mhz y podria funcionar a 32Mhz sin problemas pero las SD no lo soportarian ya que funcionan a ~23 mhz la mayoria. En el caso de utilizar tarjetas de alta velocidad 52Mhz podria subirse el reloj a 32Mhz pero el numero de interrupciones necesarias con el sistema de lectura actual colapsaria la CPU. Por lo tanto es necesario utilizar DMA para obtener un rendimiento optimo -> Ver peliculas de bitrates superiores a 1000kbps (actualmente no pasa de 450 o 500).

Explicare la situacion mejor, si puedo.

Veamos. Cada dato que sale de la SD es colocado en el bus y de este pasa al registro mencionado y se refleja en el bus al siguiente ciclo. Los datos van en serie y si hay un 0 se considera que la palabra entrante siguiente es un comando. El problema viene de que al reflejarse el dato recien leido si este tiene algun 0 .... la cagamos, por eso por cada vez que leemos un dato de la SD escribimos una palabra llena de 1 antes, que sera devuelta en a la SD en el bus.


Ejemplo del error:

...
Lee de la SD 0x783F1AC2
Se pone 0x783F1AC2 en el registro
Manda a la SD 0x783F1AC2
Controlador de SD recibe comando y queda a la espera.
ERROR



Ejemplo de como funciona actualmente:

...
Escribimos en el registro 0xFFFFFFFF
Lee de la SD 0x783F1AC2
Se pone 0x783F1AC2 en el registro
Manda a la SD 0xFFFFFFFF
...


Si hay DMA:

...
### Escribimos en el registro 0xFFFFFFFF ### esto no puede hacerse
Lee de la SD 0x783F1AC2
Se pone 0x783F1AC2 en el registro
### Manda a la SD 0xFFFFFFFF ### no sucede ya que no se escribio
Manda a la SD 0x783F1AC2
Controlador de SD recibe comando y queda a la espera.
ERROR


Lo que se supone deberia hacer la circuiteria adicional:

...
-->> Controlador de SD recibe comando y queda a la espera.
ERROR


Basicamente evitariamos que pasara nada a la SD despues de haber salido un dato de la misma.
3 respuestas