Divagaciones sobre EHCI y su vector de interrupción

Buenas.

La verdad es que esto es un S.O.S y no se si alguien con el suficiente nivel o conocimiento lo leerá, pero no logro hacer funcionar la interrupción EHCI que supuestamente es la 4 y no entiendo a que se debe.

Antes de nada, decir que he modificado la syscalls os_software_IRQ(4) y que la mascara de interrupciones se puede ver claramente la interrupción 4 como activa, y tengo registrado el evento para dicha interrupción y tambien activo el correspondiente registro de interrupción EHCI para que actúe por ejemplo, a los cambios en el puerto (enchufar/desenchufar), pero nada, sigue muerto.

Sin embargo, si conecto la interrupción 5 (OH0) responde al cambiar el dispositivo perfectamente (evidentemente, el driver deja de responder porque le desconecto el evento de interrupción.

Viéndome tan desesperado, he modificado la syscalls os_software_IRQ(9) (hay una tabla de saltos para cada interrupcion) que es una interrupción que está fuera de uso y por tanto, podía emplearla para el perverso plan de entrar en modo Dios (modo sistema) y poder tocar ciertas áreas de memoria y registros prohibidos

Así por ejemplo, podía llamar a esa función pasándole un dato en una variable y que hiciera lucir el LED de la bandeja, incluso alternando (cosa que desde modo usuario, no es posible porque peta al tocarlo)

Gracias a esto he podido comprobar que por ejemplo, no es el evento ligado a la interrupción 4 el que está capado, puesto que con una sencilla operación (un simple "poke" XD ) podía desviar el curso de la interrupción 5 para que activase el evento de la 4
y así he comprobado que al contrario de lo que ocurre con os_software_IRQ, aquí no se comprueba el proceso o lo que sea que se compruebe ahí que pueda dar problemas.

Puestos a sospechar he estado probando interrupciones que en la información de Wiibrew se marcan como desconocidas (¿podría ser que EHCI responda a otra interrupción?) y fruto de mi desesperación, he llegado incluso a suplantar el vector de interrupción (¿ a que mola el modo Dios?) para poder personalizarlo y tratar las interrupciones de forma diferente.

Así por ejemplo, la interrupción 16, una de las marcadas como desconocidas, que está fuera de uso hasta el punto de que o no tiene rutina de tratamiento o lleva a muerte segura, la he podido tratar desde una función que se encargaba de actualizar un contador (para medir la velocidad de refresco, cosa que puedo ver en pantalla gracias a las facilidades de mload) y de encender/apagar el led de la bandeja (trabaja a unos 50 Hz o así y no me extrañaría que fuera VSYNC desde el lado del Starlet, quien sabe)

El caso es que no se que carajos es lo que falla, pero no consigo activar ni un solo pulso de interrupción EHCI (¿alguien conoce algún otro registro que controle interrupciones desde el Starlet? Porque me vendría de perlas) y es una pena, pero tanto trabajo para tratar de utilizar la IRQ 4 y no se que coño me está parando [+risas]

En fin, dejo esto dicho por si alguien conoce algo y me lo quiere contar XD (y por que estoy frustrado [+furioso])

Saludos
Yo creo que poca gente del foro tiene un nivel de programación que se aproxime al tuyo....

Yo probaria en foros de ordenadores o programación, segurmanete allí habrá más entendidos.

Siento no saber la respuesta
En algunas interrupciones HW, suele ser un problema de prioridades en las interrupciones, o un registro global que las habilite a todas o a solo esas.
Algunas veces las interrupciones son de desactivacion manual o automatica.
No se si estará reservada para el debugger (algunas veces en el 8051 ) la interrupcion serie se utiliza para el debugger.

Si estas utilizando algun tipo de mutex o semaforo revisa que no hayas dejada alguna tarea de mayor prioridad bloqueada.

Desde mi nulo conocimiento sobre la arquitectura ARM y su modelo de programacion, solo se me ocurre que pueda ser eso, lo mismo hasta son tonterias lo que escribo pero a lo mejor te sirve de ayuda.

O si no toca revisar el manual...a ver si se ve algo
Suerte
xoye escribió:En algunas interrupciones HW, suele ser un problema de prioridades en las interrupciones, o un registro global que las habilite a todas o a solo esas.
Algunas veces las interrupciones son de desactivacion manual o automatica.
No se si estará reservada para el debugger (algunas veces en el 8051 ) la interrupcion serie se utiliza para el debugger.

Si estas utilizando algun tipo de mutex o semaforo revisa que no hayas dejada alguna tarea de mayor prioridad bloqueada.

Desde mi nulo conocimiento sobre la arquitectura ARM y su modelo de programacion, solo se me ocurre que pueda ser eso, lo mismo hasta son tonterias lo que escribo pero a lo mejor te sirve de ayuda.

O si no toca revisar el manual...a ver si se ve algo
Suerte


No es nada de eso. Y por favor, dejad el hilo para los expertos en Wii que quieran participar, porque estamos hablando de un posible registro que pueda habilitar esa interrupción diferente de los conocidos: aquí no hay semáforo que me pueda interferir cuando he comentado que he capturado el vector de interrupción en el kernel y que puedo capturar cualquier interrupción (incluso las no soportadas por el IOS y el vectgor original) y mandar una señal visible encendiendo el led frontal.

El tema es que la IRQ 4 aparentemente, está muerta y quizá alguien sepa algo sobre la Wii que me pueda ayudar (algo que a mi me ha pasado desapercibido)
Hola Hermes,

Para que la interrupción de EHCI funcione tienes que poner a 1 el bit 15 del registro 0x0d0400cc.
(Del mismo modo para habilitar la interrupción de OHCI0 has de poner a 1 el bit 11 y para la de OHCI1 el bit 12).

Suerte,
isobel
isobel escribió:Hola Hermes,

Para que la interrupción de EHCI funcione tienes que poner a 1 el bit 15 del registro 0x0d0400cc.
(Del mismo modo para habilitar la interrupción de OHCI0 has de poner a 1 el bit 11 y para la de OHCI1 el bit 12).

Suerte,
isobel



Gracias tio :) : Ya la tengo rulando ;)

Ahora a ver si logro evitar las interferencias de otros hilos que es lo que me provoca errores con ciertos dispositivos ;) (estoy trabajando en modo asíncrono y aunque intento meterle paquetes dummy para que no me pille "el guarro" como dice un colega mío, no me era suficiente)

Por cierto, me gustaría saber donde coño hay colgada información de ese tipo... XD

Saludos
5 respuestas