[DS] Wifi Loader: Cargador de aplicaciones via WIFI

1, 2, 3
Hola.

Despues de bastante trabajo con la libreria WIFI y de algo de investigacion, he conseguido hacer un cargador que se antojaba MUY necesario y que evita el estar constantemente grabando en la memoria flash ejecutables cuando estamos desarrollando.

Como Funciona el Programa

El programa se divide en dos partes, un ejecutable que he compilado bajo MinGW (el entorno que utilizamos para compilar en la DS) que hace las veces de server.

Cuando ejecutamos Wifiloader.exe, de inmediato nos aparece una ventana de seleccion de ficheros en la que tendremos que seleccionar el ejecutable en formato .nds o .ds.gba que queramos subir.

El servidor utiliza el puerto 9999 y está a la escucha de cualquier IP que acceda a ese puerto, asi que en principio, no deberia haber problemas de conexion (salvo que tengais ese puerto capado o esteis utilizandolo en otra aplicacion)

El protocolo utilizado, es TCP/IP, con lo cual se asegura de que los datos suban de forma fiable.

Es conveniente ejecutar primero el server del PC antes de ejecutar la aplicacion de la DS.

En la DS, tendreis que ejecutar el fichero 0wifiloader.nds o el *.ds.gba (los que usais SuperCard, podeis renombrar este fichero a *.sc.nds y teoricamente, deberia de ir)

El programa recupera de la flash la primera configuracion guardada (ya sabeis que necesitais un juego que acceda a internet grabe dicha configuracion) asi que no tendreis que meter la IP de forma manual.

Cuando lo ejecutais, aparece un mensaje en pantalla como este: "Connecting via WFC data"

Si veis que tarda rato en salir el el mensaje ""Connected successfully!", seguramente se haya quedado flipada la aplicacion, por lo que recomiendo pulsar el boton A para que se recargue desde la ROM

Una vez que se conecta al server, se procede a cargar a aplicacion, mostrandose en la parte inferior el numero de KB subidos.


La aplicacion es capaz de cargar ficheros .nds, .sc.nds y .ds.gba, aunque en realidad, se salta el cargador de las ultimas versiones y utiliza la cabecera de fichero .nds de dichos ejecutables (hace un scaneo para detectar una cadena de texto que sirve de referencia)

Tiene una capacidad para cargar ficheros en RAM de 2MB, aunque no debeis de olvidar que este fichero no se puede leer como ROM,por lo que si quereis utilizar un filesystem, deberiais buscar vuestros datos en la RAM.

Cuando los datos son cargados, la aplicacion de la DS envia un comando al server para que cierre la aplicacion, asi que no os extrañeis por ello.

El cargador esta pensado para que reinicie registros claves, como WIFI, contadores, dma's , caches, etc, con el fin de evitar al maximo lincompatibilidades. El codigo de ARM7 debe ser cargado en su memoria exclusiva, sin utilizar la memoria de 4MB compartida (tal y como se compila de forma estandar, vamos) ya que esa memoria está en uso por el cargador en el momento de proceder a la carga el ejecutable de ARM7 y el resultado podria ser impredecible.

De momento, no se dispone de la posibilidad de poder resetear la aplicacion mediante una combinacion de botones o algo asi (para no tener que apagar la consola y proceder a cargar la aplicacion desde el browser de nuestro aparatejo) , cosa que se podria hacer mediante una librería de carga en el futuro.

El codigo fuente, lo publicaré cuando complete el trabajo, pues aqui hay muchas cosas implicadas (modificaciones en la libreria de RPC. Multithread, eSound, WIFI,... documentacion..., vamos que hay tela de trabajo)


En fin, aqui os dejo el enlace para que podais probar la beta :) :





EDITADO BETA 1.5:

Añadido soporte WEP de 128 bits y algun cambio menor

Explicacion de lo nuevo aqui:



http://www.elotrolado.net/showthread.php?s=&postid=1705912181#post1705912181

o leete el readme :p

BETA 1.5



OLD 0.1 Beta

OLD 1.0 Beta

OLD 1.1 Beta

OLD 1.2
Para aclararnos, es lo mismo que el wifime pero no necesitas tener una tarjeta dedicada a servir a la DS, no?
EXACTAMENTE.

Y ESTO IMPLICA!!!!

Que los que tengan MAC OS X (en los que espero incluirme en las proximas semanas), ya pueden programar enviando sus aplicaciones directamente!!!
Yo no me entero.

Yo tengo un router, tengo una tarjeta de red inalambrica, tengo una DS sin modificar...

¿A mi no me sirve para enviar demos y aplicaciones?
Si tienes un cartucho para cargar homebrew -> SI (solo demos y homebrew, no juegos comerciales)

Imagina que tienes una supercard.

Ejecutas en la supercard el fichero nds que adjunta hermes, en el pc el ejecutable y le dices que quieres cargar la demo del polarium.
El programa envia la demo a la DS por TCP/IP -> mediante wifi a tu router. Y lo ejecuta.
programa realmente util para desarrolladores! yo hasta ahora subia las cosas a la ds con el dsftp pero esto parece que sera mas comodo :)
Muchas gracias.
Una pregunta de torpe... este programa puede sustituir al wifime para flashear la ds?

Es decir, es exactamente igual en todo al wifime excepto por no necesitar una ralink con drivers especificos?

PD Sea asi o no, felicidades al programador por este soft, yo tego un mac y eso de los drivers me mataba...
¡Wow! Felicidades tío.
Sería verdaderamente útil integrarlo en los firmware's de los flash carts...
(y no miro a nadie xD)
y sirve tb para cargar roms sin necesidad de meterlas a la flash?? seria un pountazo jugar por wifi tipo conexion usb de la psp xDD
para cargar roms, lógicamente, no. dónde metéis 128 mb en la ds sin
ningún tipo de memoria que le ayude?

ahora voy a pajearme y soltar una parida: no podría utilizarse algo
parecido para navegar de una manera más rápida con la portátil?
cargar páginas que ahora no hace desde el pc, manejar internet como
si fuese del pc pero en la ds,...algo así, vamos (no tiene mucho que ver
con lo que ha hecho hermes, pero un poco de aquí, otro poco de ahí,...)

p.d.: cómo me alegra que te nos hayas unido a la ds hermes, no tienes
ni idea. tú sí que eres el "jefe maestro", y no el cascos. xD
Hombre... veo que la cosa se anima en el hilo :)

Estoy terminando de preparar la version 1.0... y si lo que habeis visto hasta ahora os ha gustado, lo nuevo es mucho mejor.


Para empezar, ahora el server no se cierra cuando carga un ejecutable, si no que se mantiene a la espera para cuando necesiteis cargar alguna aplicacion.

La ventana de seleccion de aplicaciones, ahora solo sale cuando el cliente de DS lo solicita.

El server ahora es bastante mas rapido en las transferencias, y he incorporado un nuevo comando para repetir paquete en caso de error (TCP/IP tiene una comprobacion de error, pero no es suficiente)

Por supuesto, con unas pocas modificaciones, se podria hacer que una aplicacion pudiese utilizar ese mismo server, para leer ficheros del ordenador (de hecho, ya se puede, pero no esta preparado para acceso aleatorio, cosa que no es imprescindible, de momento)

Ahora se ha aumentado la capacidad para poder cargar un ejecutable de 3MBytes, limite que no deberia sobrepasarse

Y ahora viene lo mejor: he conseguido parchear al vuelo los ejecutables, tanto en ARM7, como en ARM9 , para interceptar los vectores de interrupcion :)

¿y para que sirve eso? Pues vereis, existe una memoria llamada Shared IWRAM que nuestras aplicaciones no utilizan (al menos las que yo he probado) y yo la utilizo para subir un pequeño cargador y el vector puente de interrupciones de ARM9.

Asi que ahora, cuando terminemos de probar una aplicacion, si pulsamos L+R+START+SELECT , se reseteará cargando el WifiLoader de nuevo :):)

Evidentemente, necesita que las interrupciones esten habilitadas en los dos procesadores, por lo que si hay un cuelgue , lo mismo no responde... pero mas no puedo hacer.

Como alguno ya habeis comentado, esto es parecido al Wifi Me, solo que como veis, va a resultar mas sencillo de utilizar y estará al alcance de todo el mundo (si, fuentes incluidos cuando lo tenga todo preparado ;) )

Para los que preguntan, esto no simula una ROM, si no que lo que hace, es cargar el ejecutable en RAM.

Por tanto aquellas aplicaciones que accedan a la ROM para buscar datos, lo unico que encontraran es lo que contenga el ejecutable del WifiLoader, que es lo que está cargado en ROM.

Si para algun desarrollo se necesita acceder a datos en ROM, lo mejor sería 'pegarselos' al Wifiloader, fichero que por otro lado, puede ser renombrado y dedicarse a un uso especial, para cargar un ejecutable en desarrollo.

A la pregunta de si esto sirve para juegos (comerciales), la respuesta es que no: esto es una aplicacion para desarrollo de homebrew.


Cuando termine de hacer las modificaciones y pruebas oprtunas, subo el ejecutable 1.0. un poco de paciencia ;)
INCREIBLE


Mi más sincera enhorabuena, eres el mejor, Hermes [oki]
no sabes lo util que me va a ser este pedazo de loader.
BRUTAL!!! va perfecto!! ya estava harto con el lector de tarjetas arriba y abajo!

entonces...cuando liberes el código, lo podremos compilar bajo linux y/o MAC OSX???
rom_kurt escribió:BRUTAL!!! va perfecto!! ya estava harto con el lector de tarjetas arriba y abajo!

entonces...cuando liberes el código, lo podremos compilar bajo linux y/o MAC OSX???


El server es muy sencillo: lo mas complicado, es mostrar la ventana para seleccionar un fichero, asi que supongo que cualquiera lo puede mejorar :)

Parece que ya he solucionado un pequeño problema que tenía de doble Reset al dejar apretado el boton A (ahora el reset, se puede provocar en cualquier momento, el WIFILoader)

Veamos, cuando termine los test, si no añado nada mas, subo la aplicacion rapidamente.

El fuente voy a tardar bastante mas en subirlo :( ... porque no es solo el fuente de la aplicacion, es mi adaptacion del Wifi a mis librerias multithread y de sonido, junto con las aplicaciones adaptadas... y la verdad es que se me multiplica el trabajo [jaja]


Asi que lo que vo a hacer mañana, es mirar el codigo del servidor, para limpiar lo que no me guste y subiroslo por si lo quereis adaptar a otros sistemas o ampliar.

Sigo con mis pruebas, ahora os cuento (estoy probando la demo de Without Escape de Pacochan y dentro de ella, pulsando L+R+START+SELECT, puedo retornar al WifiLoader :) )
Genial, ahor amismo lo pruevo. Eres el mejor programador para DS que conozco, o al menos el que mas cosas utiles hace ;) y encima nos obsequias con las fuentes ;)

Bueno, todos los demas programadores de eol tb son buenos, en especial algunos que me han aydad mucho, pero creo que ninguno ha hecho unas librerias tan buenas.

Gracias
INCREIBLE!!!
Una sugerencia??
No se si lo soporta ya, perooooo:
Podrias hacer una version del server que permitiese lanzar el ejecutable desde linea de comandos, de forma que al compilar un ejemplo, se pudiese ejecutar "wifiloader.exe + nomreapp.nds", eso lanzaria el server directamente, en la DS solo tendrias que ejecutar el programa y ya esta.
Y puestos a soñar...como ves el tema de cargar directamente desde la DS el programa, sin ejecutar nada en la DS.
Hace tiempo investigue un poco y no se sabe mucho de cual es el protocolo que usa la DS, algo esencial para poder enviar el ejecutable que despues permita descargar desde el pc la aplicacion a testear, ves posible sacar el protocolo con ayuda?
Saludos y muchas muchas gracias.
Jo... no me funciona....

Explico:

Mi conexion: tengo un modem cable ono, conectado a un pc, este pc conectado a un HAB ( ni swich ni nada, HAB ) y de este hab sale un cable a otro pc y otro cable al "router" de la fonera ( http://www.fon.com ) en este aparato, tengo na red publica con clave fon y una privada que para jugar a DS pongo con clave wep...

Bueno, hecha esta expliacion, he de decir que el programa del ordenador se queda escuchando, el de la DS, se conecta en un momento y todo bien, pero no hay ninguna transferencia de archivos, no se que pasara... alguien sabe si es posible que sea cosa de los puertos? y de ser asi como solucionarlo...?

PD: no tengo firewall ni nada.
eres un crack tío [oki] cada vez veo más cosas wapas echas por tí ;)
Muchas gracias, voy a probarlo. [beer]

¡Saludos!
¿Que velocidad tiene de transferencia?
se necesita tener flasheada la ds?¿
webez escribió:¿Que velocidad tiene de transferencia?



Aproximadamente unos 100KB por segundo (es posible ir mas rapido, pero como obtuve errores cuando subi el ancho del 'sector' , sincronize los paquetes con VBLANK )

El paquete de datos necesario para leer un sector, es algo mayor de 4KB (vamos, 4KB de datos, mas el comando de sincronizacion, longitud de los datos utilies y el checksum correspondiente)

cenjuro escribió:se necesita tener flasheada la ds?¿


Yo utilizo una Passcard y un M3 SD. Obviamente, esto carga como cualquier homebrew
Yo es que utilizo un buffer muy grande para recibir los paquetes o no soy capaz de sostener la velocidad de transferencia

¿El código de carga está sacado del loader de Mighty Max?
webez escribió:Yo es que utilizo un buffer muy grande para recibir los paquetes o no soy capaz de sostener la velocidad de transferencia

¿El código de carga está sacado del loader de Mighty Max?


En absoluto: es un codigo completamente nuevo, ni siquiera uso el reset por software.

En parte el truco, esta en que yo puedo conectar una funcion desde la seccion de codigo de ARM9 con el ARM7 y de esa forma, puedo reiniciar este procesador sin problemas.

En el ARM9, el truco esta en situar el codigo en un sitio que no resulte incomodo durante la inicializacion del nuevo programa (todo lo que depende de CP15, es peligroso)

Solo hay dos areas seguras para eso: la Shared IWRAM y la VRAM. Yo ahora uso la VRAM para el codigo que se encarga de deshabilitar la proteccion y las caches, asi como el copiado al lugar correspondiente del programa (se supone que el programa empieza en 0x02000000 y el malloc de 3MB esta algo mas arriba, asi que se puede copiar sin peligro)


Eso es, a grandes rasgos, lo que hace el cargador base, aunque evidentemente, se inicializan registros clave por el camino (los que he considerado oportuno, vamos)

El codigo mas complejo, viene del cargador que actua cuando se pulsa los botones de reinicio, que ese no se ve apoyado por las RPC y recurro a un curioso truco para poder comunicarme con la rutina residente en la memoria exclusiva del ARM7 :-P
Solo me queda decir felicidades [babas]
Probado en un G6 y funcionando a las mil maravillas, he enviado el noflashme v7 que pesa 1.51MB y lo ha cargado sin problemas.

Enhorabuena y gracias por la aplicacion.

Por cierto, (no me he leido todo el hilo, y no se si se habra comentado) estaria bien (si se puede hacer) que en futuras versiones se pudiera escoger desde la ds la aplicacion que queramos lanzar, usease, que el servidor leyera el contenido de una carpeta predeterminada, y subiese a la consola la lista de aplicaciones, para que desde esta podamos escoger, en vez de hacerlo desde el explorador de windows.

Solo es una sugerencia, supongo que eso requerira mucho curro, pero vaya que aunque se quede tal y como esta, la aplicacion y tu os mereceis un 10. Que gusto da cargar las cosas sin tener que estar quitando la p**a flashcard.
por lo que he leido al principio. Tu programa envia el fichero en raw al puerto 9999 del cliente?

Podría hacer un cliente en Java, para que sea compatible con cualquier ordenador.

Pero necesito mas info del server.
Se podria hacer algo para cambiar el puerto? o una selccion entre vario so algo... es que continua sin funcionarme y creo que deve ser cosa del router fon.
Neopiro escribió:Se podria hacer algo para cambiar el puerto? o una selccion entre vario so algo... es que continua sin funcionarme y creo que deve ser cosa del router fon.


Puedes jugar online con la DS? utilizando el router?


Por cierto Hermes:
Por lo que he visto, es la DS la que se conecta al PC DS=Cliente PC=Server.
No podría ser al reves?
Es decir, que la DS espere escuchando un puerto, el 9999 por ejemplo y el cliente (el pc) envie?
Gran programa, la verdad es que hacia falta algo de esto porque para cada modificacion tener que quitar la sd y meterla en el lector de tarjetas es un coñazo.

A ver si encuentro un hueco hoy para probarlo
Neopiro escribió:Se podria hacer algo para cambiar el puerto? o una selccion entre vario so algo... es que continua sin funcionarme y creo que deve ser cosa del router fon.


Estoy en ello, un poco de paciencia

jandujar escribió:
Por cierto Hermes:
Por lo que he visto, es la DS la que se conecta al PC DS=Cliente PC=Server.
No podría ser al reves?
Es decir, que la DS espere escuchando un puerto, el 9999 por ejemplo y el cliente (el pc) envie?


El fuente del server, lo estoy preparando (y de paso, solucionando algunos errores :$) con la maxima rapidez. Le he añadido algunos comandos nuevos, para que tengais una base para trabajar en el futuro (aunque no lle voy a meter soportede escritura de ficheros aun)

Con respecto a lo que dices de que la DS actue de server, poder hacerse, se puede, pero no es nada interesante para el objetivo de este programa.

La idea de este server, es que la DS lo pueda controlar sin perjuicio de su rendimiento o uso que le quiera dar: ahora mismo solo se esta usando para abrir un fichero y ejecutarlo, pero la idea es que tu puedas leer desde la DS cualquier fichero en tu ordenador, no que el ordenador te diga que fichero tienes que leer (por eso hay dos comandos de apertura de ficheros, uno que se usa para ejecutar y otro en el que la DS le pasa la ruta

De momento, no le quiero poner soporte para leer directorios, entre otras razones porque cada SO usa su propio metodo y no quiero que el server sea demasiado complejo de portar...


Por supuesto, no hay ninguna regla escrita que diga que no puedes coger este fuente y modificarlo para otros usos, como por ejemplo, que sea el PC el cliente y la DS el servidor (aunque yo no lo veo mucho sentido).

De hecho, la DS una vez conecta, se queda a la espera de que el server le envie una respuesta, en forma de fichero a subir, asi que no veo la utilidad a lo que dices (si es por la ventana que se abre, se podria hacer que la ventana no se desplegara hasta que pulses un boton o algo así)

Si no se quiere bloquear ninguna de las dos maquinas, hasta que sea necesario, lo mejor seria recurrir al protocolo UDP, de forma que se esperase el envio de una señal antes de proceder a conectar mediante protocolo TCP (es algo que lo he pensado tambien), pero todo esto redunda en complejidad para un programa que, no lo olvidemos, va a ser necesario portar a otras maquinas y/o lenguajes
y que tal como está, cumple con su funcion.
Te lo has currado bien, Hermes [ok]

Parafraseando a Neil Armstrong: "That's one small step for a man; one giant leap for DS scene".
Acabo de probarlo con Wine y el servidor parece que carga, pero a la hora de conectarse la ds parece que no encuentra el servidor, se conecta bien a la wireless pero no al server. No tengo ningun firewall ni nada parecido estorbando.
Un gran trabajo por tu parte, muchas gracias.
cuando tengamos el source del servidor, podriamos portarlo a java para que funcione en todos los sistemas.

Por cierto Hermes.
En la DS (cuando aprietas Select + STart + bla,bla para volver a recargar el loader) tendrías que poner que se pueda poner en stand-by la consola, cuando cierras la tapa (gastar menos bateria). Porque entre compilar/enviar otra version puede pasar un rato (hasta que encuentras los bugs, etc... xD )
jandujar escribió:cuando tengamos el source del servidor, podriamos portarlo a java para que funcione en todos los sistemas.

Por cierto Hermes.
En la DS (cuando aprietas Select + STart + bla,bla para volver a recargar el loader) tendrías que poner que se pueda poner en stand-by la consola, cuando cierras la tapa (gastar menos bateria). Porque entre compilar/enviar otra version puede pasar un rato (hasta que encuentras los bugs, etc... xD )



Si quieres le pongo una musica de espera [carcajad] [carcajad] [carcajad] [carcajad] (es broma, claro ¿o no?)

No te preocupes, que lo tendre en cuenta ;)
bueno, dejo de pedir. Que soy un poco pesao. ;)
Molaria algo asi pero DS > DS a modo de Peer2Peer XDD. Para compartir Musica, Imagenes,Videos e incluso homebrew XD
Primero que nada, Felicidades a Hermes por tan excelente trabajo, espero que sigas asi manito :-p
Raziel_DSM escribió:Molaria algo asi pero DS > DS a modo de Peer2Peer XDD. Para compartir Musica, Imagenes,Videos e incluso homebrew XD

Esto sría la leche, ;)
Bueno, ya tengo la version 1.1 lista para subir, pero primero toca poner aquí el 'tocho' para luego actualizar el primer mensaje del hilo :p

¿Que tiene de nuevo?

Pues he corregido algunos pequeños bugs del server del PC, le he añadido la posibilidad de especificar un parametro con el numero de puerto al que escuchará (mas de uno me lo agradecereis, jeje), lo he comentado un poco y... ya teneis el codigo fuente para lo que gusteis :)


En la parte de la NDS,las modificaciones principales vienen de que le he añadido una funcion de power off, que se activa al cabo de de unos minutos (o cerrando la consola) y de la posibilidad de modificar el numero de puerto y el modo en que opera el programa

Para ello incluyo en el directorio UTILITY un fichero .bat que al ejecutarlo, añade a los ficheros .nds y .ds.gba la informacion que contiene (ademas de crear el fichero .sc.nds para los que teneis Super Card). No hace falta que os diga que debeis tener los ejecutables en el mismo directorio que el .bat para ello (lo he dejado separados para que no 'contamineis' el ejecutable original)

Los datos estan en el fichero wificfg.txt y el significado es el siguiente:


PORT= 9999 :-> numero de puerto (obvio)

AUTO= 0 :-> puede ser 0 o 1. Si es 0, espera a que pulses la tecla B antes de conectar al servidor, si es 1, se autoconecta como hasta ahora

Vamos, que es muy sencillito y asi evitamos los problemas con el acceso a FAT (y que la utilidad crezca en tamaño y tenga que limitar el tamaño del ejecutable a cargar)
I como abro el puerto 9999?
El puerto 9999 es un socket que abre el programa, no hace falta que abras nada.
pues algo pasa porque yo puedo jugar online a los juegos y el programa pone que se conecta, pero los puertos no se encuentran el uno al otro...
Neopiro escribió:pues algo pasa porque yo puedo jugar online a los juegos y el programa pone que se conecta, pero los puertos no se encuentran el uno al otro...


Estaras usando una IP que apunta hacia afuera....

Debes usar una IP local
Buenas. Os comento la historia...tengo un "maravilloso" mk3 con el que "milagrosamente" he conseguido cargar el wifi loader 11, pero me ocurre lo siguiente despues de ejecutar wifiloader.exe:

1º en el PC "Waiting to the Wifiloader Client on port 9999...
2º en la DS:
Conecting via WFC data
Connected succesfully!
Connecting using the port: 9999

Ahí se queda la pantalla hasta que se queda la pantalla en negro en la ds.

Estoy haciendo algo mal o qué?

Creo que he seguido todos los pasos ok.

Ayudadme please porque puede ser la solución para cargar algunos homebrews con este incompatible mk3 de neoflash (ni se os ocurra comprarlo por muy barato que este)
ahi es donde se me queda a mi, y lo de las ip's no creo que pueda solucionarlo, o al menos no se como...

El tinglao que tengo aqui supongo que tiene la culpa...

Modem cable ------> pc ----> hub ------> Fonera ("router" http://www.fon.com) ----> ds

pues eso, creo que en el hab ya se ralla todo....

si alguien tiene alguna sugerencia o idea...
102 respuestas
1, 2, 3