CIOS usb2/fr
From WiiBrew
| cIOS usb2 | |
| | |
| Général | |
|---|---|
| Auteur(s) | Kwiirk |
| Type | Utilitaire système |
| Version | beta3 |
| Liens | |
| Téléchargement | |
| Périphériques | |
| Avertissement! |
| Cet homebrew fait des changements permanents à la mémoire flash de votre Wii (NAND) et devrait être utilisé avec soin. |
cIOS usb2 beta3
par kwiirk
Contents |
Description
Ce programme est une modification du module IOS par neimod, rajoutant un pilote usb2 (ehci) du coté du module d'héritage OH0 et OH1.
En gros, il permet aux périphériques USB 2.0 de transférer à pleine vitesse. Avant, la vitesse correspondait à celle de l'USB 1.1
Les sources contiennent également divers outils pour aider les ioshacker. À utiliser avec précaution ..
Une copie modifiée de libfat montre aux développeurs un moyen simple d'utiliser la pleine vitesse USB pour leurs applications, tout en conservant le pilote de l'USB1 si le cios_usb2 n'est pas installé.
Dégagement de responsabilité
Ce logiciel est en phase bêta, il n'est pas beaucoup testé, mais fonctionne sur le système de l'auteur. Des dommages matériels à votre disque dur est possible en raison de l'état de très peu évolué du code. Le dommage des données du disque dur est tout à fait possible. Voir la partie NON GARANTIE de la licence GPL.
S'il vous plaît ne pas utiliser ce logiciel pour but illégal.
Journal des modifications
beta3
- Amélioration de la fiabilité du pilote de usb. Elle rétablit l'unité si elle commence par une erreur.
beta2
- Ajout moule ehc modifié qui implémente l'API standard ios usb au travers de /dev/usb/ehc, ainsi qu'une API directe du stockage usb modifié (usbstorage).
- Restauration du module oh0 officiel de nintendo. Le périphérique USB1.1 externe pourra être pris en charge par ce module.
- Changement de l'ordre de chargement des modules, afin de s'assurer que le code d'initialisation du EHCI soit éxécuté avant celui de l'oh1. Le fonctionnement du bluetooth devrait être plus fiable.
- Ajout des fonctions read_ahead et USBspeedTest dans la libfat /w, demandé courtoisement par la team mplayer-ce.
beta1
- Ajout de la libcios, pour éviter la duplication de code (source) entre les modules et les iostester.
- Correction de quelques bugs dans le code original (adresse de pile pointant sur le début de la mémoire allouée actuellement, mais ayant besoin d'être à la fin).
- Ajout du tinyehci, un driver ehci générique minimaliste basé sur un driver ehci-hcd linux.
- Ajout du module oh0, qui implémente les messages oh0 ios avec tinyehci, et des nouveaux messages usbstorage pour plus de rapidité.
- Ajout de l'installer patchmii.
Explication
usb-hcd knowledge Le CPU principal de la Wii utilise une interface de haut niveau pour accéder aux périphériques USB. Cette API ignore tout de l'USB2.0 ou de l'USB1.1, c'est juste un problème d'envoi de message de contrôle, et de message de données.
L'IOS original de la Wii implémente cette interface grâce à un driver OHCI dans le module OH0. C'est pourquoi les Wii non modifiées sont limitées à l'USB1.1.
La chose étrange par rapport à l'IOS est qu'il y a actuellement 2 drivers OHCI, qui fonctionnent avec chacun des modules OHCI matériels. OH0 fonctionne avec celui qui est raccordé au port externe, et OH1 avec le port interne (qui est connecté au contrôleur bluetooth).
Il semblerai que ces deux modules OH aient une grande partie de leur code dupliqués. Les différences sont peut être au niveau de leurs degrés d'optimisations. OH1 ne supporte pas la détection à chaud, ni les hubs.
L'idée est que nous pouvons ajouter un autre module dans une espace libre de l'ios, et implémenter notre propre driver ehci. Ce module peut être initialisé avant l'OH0, et l'OH1, il peut donc libérer les ports USB qui ne sont pas USB2, ou ceux que l'on souhaite qu'ils soient contrôlé par le code original (dongle bluetooth).
La beta1 du hack original, implémentant le module ehci à la place du module oh0, désactivait l'USB1 externe. Mais l'ancien code de la libogc perdra les pédales, le code de l'homebrew croyant fonctionner avec le driver USB1 de BigN, alors qu'il fonctionne avec le code fait-maison de l'USB2.
Désormais, avec la beta2 et les suivantes, j'ai compris comment ajouter les modules dans le tmd, et comment je pourrai trouver de la place libre dans la ram pour le mettre (voir les sources). L'oh0 original a été remisé, donc les codes personnels doivent savoir qu'une nouvelle interface (/etc/usb/ehc) existe, et qu'elle peut être appelée avec l'API habituelle.
Limitation du pilote
- Le réel manque par rapport au protocole USB est que le driver USB2 ne supporte pas le hub (les 'noeuds'). Le mécanisme de hub USB2 "TT" est un peu compliqué, et nécessiterai beaucoup plus de travail.
- Le driver n'implémente pas les tranferts programmés, les transferts d'interruption et les tranferts isochrones, qui pourrai être requis pour les webcams (Je n'ai pas en tête d'autres périphériques usb2 qui utilisent ces protocoles).
- Le driver n'implémente pas la détection à chaud (hotplug detection). Branchez votre périphérique usb2 avant de lancer une application utilisant l'ios 202, et il sera reconnu comme usb2, sinon, il sera reconnu par le driver usb1.
Utilisation
- Installez le cios_usb2 en lançant le fichier cios_usb2_install.dol;
note: Débranchez toutes les cartes branchées sur les ports mémoires GC avant de lancer l'installeur.
- Branchez votre clé USB sur un des ports externes de la wii (pour les HW modders, il est également possible d'utiliser le port interne inutilisé si les connexions sont présentes sur le PCB...);
- Testez le avec raw_speed_test.elf ou fat_speed_test.dol;
- ou lancez une application utilisant l'usb2;
- Si le périphérique usb2 est raccordé avant le lancement de l'application, il sera reconnu en tant qu'usb2. Sinon, il sera reconnu en tant qu'usb1;
- Si vous raccordez un périphérique usb1 à n'importe quel moment, il sera reconnu comme usb1 par le module OH0.
Utilisation pour programmeurs
la cios_usb2 est compatible avec libogc, il vous suffit de faire:
IOS_ReloadIOS(202);
à tout début d'un programme pour pouvoir utiliser cette ios.
usbstorage_starlet.c
est présent dans une version modifiée libfat, qui permet d'utiliser l'API de stockage de masse cios_usb2 pour de meilleurs performances (3 times less ios ioctls). Cette modification de libfat ajoute dans disc.c un dispositifs usb2:/ qui permet d'accéder à un disques Usb2, et conserve usb:/ pour l'héritage de l'accès Usb1, au cas où cios_usb2 n'est pas installé.
License
Ce programme est un logiciel libre. Vous êtes autorisés et encouragés à utiliser / changer pour vos homebrew personnel, a condition que vous distribuer votre travail une fois terminer, dans le repect de la norme GPL. ;-)
Linux
to use it on linux, you must recompile the kernel after modifying the file
starlet_es.c: #define STARLET_ES_IOS_MAX 202
The linux driver is a nice hack that uses the IOS OH0 API to implement a hcd driver. This breaks the software layers rules but this works. As cios_usb2 implements the exact same API (except for possible implementation bugs) linux driver should work just by telling him there is a new usb device tree available:
diff --git a/rvl-sthcd.c b/rvl-sthcd.c
index 4c117e8..cc4e821 100644
--- a/rvl-sthcd.c
+++ b/rvl-sthcd.c
@@ -160,7 +160,7 @@ struct sthcd_oh {
struct sthcd_hcd {
spinlock_t lock;
- struct sthcd_oh oh[2];
+ struct sthcd_oh oh[3];
struct sthcd_port *ports; /* array of ports */
unsigned int nr_ports;
@@ -1257,8 +1257,11 @@ static int sthcd_udev_open(struct sthcd_udev *udev)
sthcd_udev_close(udev);
}
- snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u/%04x/%04x",
- oh->index, udev->idVendor, udev->idProduct);
+ if(oh->index==2)
+ snprintf(pathname, sizeof(pathname), "/dev/usb/ehc/%04x/%04x", , udev->idVendor, udev->idProduct);
+ else
+ snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u/%04x/%04x",
+ oh->index, udev->idVendor, udev->idProduct);
error = starlet_open(pathname, 0);
if (error < 0) {
drv_printk(KERN_ERR, "open %s failed\n", pathname);
@@ -1980,10 +1983,12 @@ static int sthcd_oh_init(struct sthcd_oh *oh, unsigned int index,
char pathname[16];
int error;
- if (index != 0 && index != 1)
+ if (index != 0 && index != 1 && index != 2)
return -EINVAL;
-
- snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u", index);
+ if(index==2)
+ snprintf(pathname, sizeof(pathname), "/dev/usb/ehc");
+ else
+ snprintf(pathname, sizeof(pathname), "/dev/usb/oh%u", index);
error = starlet_open(pathname, 0);
if (error < 0)
return error;
@@ -2025,8 +2030,9 @@ static int sthcd_rescan_thread(void *arg)
* We may need to rescan oh1 if bluetooth dongle disconnects.
*/
- /* oh1 has non-removable devices only, so just scan it once */
+ /* oh1 and ehc has non-removable devices only, so just scan it once */
sthcd_oh_rescan(&sthcd->oh[1]);
+ sthcd_oh_rescan(&sthcd->oh[2]);
oh = &sthcd->oh[0];
@@ -2064,6 +2070,12 @@ static int sthcd_start(struct usb_hcd *hcd)
hcd->uses_new_polling = 1;
+ /* ehc is the external usb2 bus */
+ error = sthcd_oh_init(&sthcd->oh[2], 2, sthcd, STHCD_MAX_DEVIDS);
+ if (error < 0) {
+ DBG("%s: error=%d (%x)\n", __func__, error, error);
+ return error;
+ }
/* oh0 is the external bus */
error = sthcd_oh_init(&sthcd->oh[0], 0, sthcd, STHCD_MAX_DEVIDS);
if (error < 0) {
@@ -2101,6 +2113,7 @@ static void sthcd_stop(struct usb_hcd *hcd)
sthcd_oh_exit(&sthcd->oh[0]);
sthcd_oh_exit(&sthcd->oh[1]);
+ sthcd_oh_exit(&sthcd->oh[2]);
hcd->state &= ~HC_STATE_RUNNING;
}
This is not tested for now, please report bugs..
A faire
- Améliorer les transferts qui sont toujours limité à 4 Mo/s sur un disque dur (pouvant monter jusqu'à 30 Mo/s sur Linux/x86).
- compatibilité: J'ai reçu une clé USB qui ne fonctionne pas (en panne au premier message)
- d'autres tests sont nécessaires, mais pour l'instant, il semble plus stable que le pilote nintendo oh0 (qui s'est cracher lors d'un essai de performance ...)
Remerciement
Merci à l'aide des homebrews wii et la communauté open-source, en particulier ceux qui écrivent le code sur lequel cios_usb2 est basée. (voir le code source)

