Sourcecode Fortschritt


  • Mod

    Rev. 450:

    Erster Durchbruch bei USB2/SCSI: alle Sticks gehen, auch Tobikings Laptop, und bei +gjm+ geht es hoffentlich auch noch mit dieser Version. Ihm gebührt unser größter Dank für das Finden des fehlenden Puzzleteils.

    Bitte breit testen!

    Der nun ausgelassene handshake ist übrigens nicht die Komplettlösung. Tauscht man usbTransferSetConfiguration(devAddr,config) gegen den Reset des Interface (ohne geht es dann nicht!) aus, so fallen wieder einzelne qTD aus (status 0x80).

    Ein ganz vermintes Gelände! 😃

    usbTransferSetConfiguration(devAddr,config) hat also eine wesentliche "Nebenwirkung", die wir bisher nicht gefunden haben. Die gilt es zu verstehen. Also schauen wir in die usb 2.0 spec:

    9.1.1.5 Configured
    Before a USB device’s function may be used, the device must be configured. From the device’s perspective, configuration involves correctly processing a SetConfiguration() request with a non-zero configuration value. Configuring a device or changing an alternate setting causes all of the status and configuration values associated with endpoints in the affected interfaces to be set to their default values. This includes setting the data toggle of any endpoint using data toggles to the value DATA0.



  • Revision 451:

    - console.c/video.c: Videomemory wird auf 0 statt komischer, unverständlicher Werte gesetzt
    - Scheduler: Erste Umformungen Richtung neuer Scheduler (Umbenennungen)
    - list.c: Fehlerkorrekturen in Ring-Funktionen
    - Korrekturen, um _DIAGNOSIS_ wieder funktionsfähig zu machen
    - Funktion memmove eingebaut (Dank an den Autor)
    - Bootscreen leicht verändert (vertikal zentriert und Code vereinfacht). Ist auch wieder aktiviert
    - Diverse Kleinigkeiten, Entfernung überflüssigen Codes und Stilkorrekturen


  • Mod

    Rev. 452:

    - Der Handshake-qTD zerstörte bei manchen Mass Storage Devices die Konfiguration
    - Dennoch lief es nach Entfernen des schädlichen Handshake am IN endpoint nicht richtig
    - set_config setzt nämlich das toggle an den endpoints auf 0, so dass die Vorgehensweise mit 0 zu beginnen klappte
    - nun wird das toggle endpoint-spezifisch in der Device Struktur gespeichert und ständig pro endpoint geswitcht

    Fazit: kein handshake-qTD, abwechselndes togglen pro endpoint OUT und IN

    usb spec:

    The host always initializes the first transaction of a bus transfer to the DATA0 PID with a configuration event. The second transaction uses a DATA1 PID, and successive data transfers alternate for the remainder of the bulk transfer. The data packet transmitter toggles upon receipt of ACK, and the receiver toggles upon receipt and acceptance of a valid data packet.
    Fig. 8-30 zeigt ein ACK, ob das vom EHCI kommt?


  • Mod

    Rev. 453:

    Die USB-Diagnose-Ausgaben (vor allem OK und QH/qTD) wurden weitgehend aus dem Standard genommen (kann per define in os.h aktiviert werden), damit man die SCSI CBW und CSW Abfolge klarer erkennt. 🙂

    Hier ein typischer Ablauf auf real PC mit 16 GB USB stick mit drei endpoints (die für MSD notwendigen bulk IN und bulk OUT, zusätzlich einer für interrupt):

    > function: startHostController (reset HC)
    DeactivateLegacySupport: eecp = 0070h
    eecp = 0070h, eecp_id = 0001h

    BIOS did not own the EHCI. No action needed.

    > function: enablePorts
    > function: resetPort 1
    > function: resetPort 2
    > function: resetPort 3
    > function: resetPort 4
    > function: resetPort 5
    > function: resetPort 6
    > Press key to close this console. <<<

    PrettyOS [Version 0.0.0.453] Console 1: EHCI Ports
    --------------------------------------------------------------------------------

    > function: resetPort 2
    port 2: 00001005h, line: 00h SE0,power on, enabled, EHCI owned
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    USB specification: 2.0 USB class: 0000h
    USB subclass: 0000h USB protocol 0000h
    max packet size: 64
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    total length: 39 number of interfaces: 1

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    interface number: 0 number of endpoints: 3
    interface class: 8
    interface subclass: 6
    interface protocol: 80

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    endpoint in/out: out endpoint number: 1
    attributes: 02h
    attributes: bulk - no sync - data endpoint
    max packet size: 512

    > Press key to go on with data analysis from config descriptor. <<<

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    endpoint in/out: in endpoint number: 2
    attributes: 02h
    attributes: bulk - no sync - data endpoint
    max packet size: 512

    > Press key to go on with data analysis from config descriptor. <<<

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    endpoint in/out: in endpoint number: 3
    attributes: 03h max packet size: 64

    > Press key to go on with data analysis from config descriptor. <<<

    language: German
    USBest Technology
    USB Mass Storage Device
    0000000000040F

    dev: 2 interface: 0 endpOUT: 1 endpIN: 2
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    > SCSI: inquiry
    00h 80h 02h 02h 1Fh 00h 00h 00h 55h 44h 49h 53h 4Bh 20h 20h 20h 50h 44h 55h 30h
    31h 2Dh 31h 36h 47h 20h 38h 38h 48h 32h 2Eh 30h 30h 2Eh 30h 30h
    UDISK PDU01-16G 88H2.00.00

    55h 53h 42h 53h 12h 42h 42h 42h 00h 00h 00h 00h 00h
    Do Ping<-- command
    - - - - - - - - - - - press key - - - - - - - - - - -

    > SCSI: test unit ready
    55h 53h 42h 53h 00h 42h 42h 42h 00h 00h 00h 00h 00h
    Do Ping<-- command
    - - - - - - - - - - - press key - - - - - - - - - - -

    > SCSI: request sense
    70h 00h 00h 00h 00h 00h 00h 0Ah 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h

    55h 53h 42h 53h 03h 42h 42h 42h 00h 00h 00h 00h 00h
    Do Ping<-- command

    Results of "request sense":
    Valid: Sense data are not SCSI compliant
    Response Code: Current errors, fixed format
    Sense Key: No Sense
    - - - - - - - - - - - press key - - - - - - - - - - -

    > SCSI: read capacity
    01h E1h FFh FFh 00h 00h 02h 00h

    55h 53h 42h 53h 25h 42h 42h 42h 00h 00h 00h 00h 00h
    Do Ping<-- command
    Capacity: 15872 MB, Last LBA: 31588351, block size 512

    - - - - - - - - - - - press key - - - - - - - - - - -

    > SCSI: read sector: 0
    EBh 58h 90h 4Dh 53h 44h 4Fh 53h 35h 2Eh 30h 00h 02h 10h 26h 00h 02h 00h 00h 00h
    00h F8h 00h 00h 3Fh 00h FFh 00h 00h 00h 00h 00h 00h 00h E2h 01h 31h 3Ch 00h 00h
    00h 00h 00h 00h 02h 00h 00h 00h 01h 00h 06h 00h 00h 00h 00h 00h 00h 00h 00h 00h
    00h 00h 00h 00h 00h 00h 29h FEh F5h 5Eh 84h 4Eh 4Fh 20h 4Eh 41h 4Dh 45h 20h 20h
    20h 20h 46h 41h 54h 33h 32h 20h 20h 20h 33h C9h 8Eh D1h BCh F4h 7Bh 8Eh C1h 8Eh
    D9h BDh 00h 7Ch 88h 4Eh 02h 8Ah 56h 40h B4h 08h CDh 13h 73h 05h B9h FFh FFh 8Ah
    F1h 66h 0Fh B6h C6h 40h 66h 0Fh B6h D1h 80h E2h 3Fh F7h E2h 86h CDh C0h EDh 06h
    41h 66h 0Fh B7h C9h 66h F7h E1h 66h 89h 46h F8h 83h 7Eh 16h 00h 75h 38h 83h 7Eh
    2Ah 00h 77h 32h 66h 8Bh 46h 1Ch 66h 83h C0h 0Ch BBh 00h 80h B9h 01h 00h E8h 2Bh
    00h E9h 48h 03h A0h FAh 7Dh B4h 7Dh 8Bh F0h ACh 84h C0h 74h 17h 3Ch FFh 74h 09h
    B4h 0Eh BBh 07h 00h CDh 10h EBh EEh A0h FBh 7Dh EBh E5h A0h F9h 7Dh EBh E0h 98h
    CDh 16h CDh 19h 66h 60h 66h 3Bh 46h F8h 0Fh 82h 4Ah 00h 66h 6Ah 00h 66h 50h 06h
    53h 66h 68h 10h 00h 01h 00h 80h 7Eh 02h 00h 0Fh 85h 20h 00h B4h 41h BBh AAh 55h
    8Ah 56h 40h CDh 13h 0Fh 82h 1Ch 00h 81h FBh 55h AAh 0Fh 85h 14h 00h F6h C1h 01h
    0Fh 84h 0Dh 00h FEh 46h 02h B4h 42h 8Ah 56h 40h 8Bh F4h CDh 13h B0h F9h 66h 58h
    66h 58h 66h 58h 66h 58h EBh 2Ah 66h 33h D2h 66h 0Fh B7h 4Eh 18h 66h F7h F1h FEh
    C2h 8Ah CAh 66h 8Bh D0h 66h C1h EAh 10h F7h 76h 1Ah 86h D6h 8Ah 56h 40h 8Ah E8h
    C0h E4h 06h 0Ah CCh B8h 01h 02h CDh 13h 66h 61h 0Fh 82h 54h FFh 81h C3h 00h 02h
    66h 40h 49h 0Fh 85h 71h FFh C3h 4Eh 54h 4Ch 44h 52h 20h 20h 20h 20h 20h 20h 00h
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
    00h 00h 00h 00h 00h 00h 00h 00h 0Dh 0Ah 52h 65h 6Dh 6Fh 76h 65h 20h 64h 69h 73h
    6Bh 73h 20h 6Fh 72h 20h 6Fh 74h 68h 65h 72h 20h 6Dh 65h 64h 69h 61h 2Eh FFh 0Dh
    0Ah 44h 69h 73h 6Bh 20h 65h 72h 72h 6Fh 72h FFh 0Dh 0Ah 50h 72h 65h 73h 73h 20h
    61h 6Eh 79h 20h 6Bh 65h 79h 20h 74h 6Fh 20h 72h 65h 73h 74h 61h 72h 74h 0Dh 0Ah
    00h 00h 00h 00h 00h ACh CBh D8h 00h 00h 55h AAh
    XMSDOS5.0&?1<)^NO NAME FAT32 3{|NV@sf@f?AfffFu8w2fFf+H}}t<t}}f`f;FJfjfPS
    fh~ AUV@UFBV@fXfXfXfX
    f3fNfffvV@faTf@IqNTLDR Remove disks or other media.Di
    sk errorPress any key to restart
    U

    55h 53h 42h 53h 28h 42h 42h 42h 00h 00h 00h 00h 00h
    Do Ping<-- command
    - - - - - - - - - - - press key - - - - - - - - - - -
    --------------------------------------------------------------------------------
    Port: 2, device attached


  • Mod

    Rev. 454:

    Non-MSD werden nun nicht mehr dem MSD-Test unterzogen. Dieses lästige Procedere wird nun abgekürzt, sobald die Interface Class nicht gleich 0x08 ist.

    PrettyOS [Version 0.0.0.454] Console 1: EHCI Ports
    --------------------------------------------------------------------------------

    > function: resetPort 1
    port 1: 00001005h, line: 00h SE0,power on, enabled, EHCI owned
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    USB specification: 2.0 USB class: 00EFh
    USB subclass: 0002h USB protocol 0001h
    max packet size: 64
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    total length: 783 number of interfaces: 4

    length: 8 type: 11 unknown

    > Press key to go on with data analysis from config descriptor. <<<

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    interface number: 0 number of endpoints: 1
    interface class: 14
    interface subclass: 1
    interface protocol: 0

    ...
    ...

    language: German
    Chicony Corp.
    QEye 2.0M pixel

    dev: 1 interface: 1 endpOUT: 0 endpIN: 0
    This is no Mass Storage Device! MSD test cannot be carried out.

    void testMSD(uint8_t devAddr, uint8_t config)
    {
        if (usbDevices[devAddr].InterfaceClass != 0x08)
        {
            textColor(0x0C);
            printf("\nThis is no Mass Storage Device! MSD test cannot be carried out.");
            textColor(0x0F);
            waitForKeyStroke();
        }
        else
        {
            // maxLUN (0 for USB-sticks)
            usbDevices[devAddr].maxLUN = 0;
    
            // start with correct endpoint toggles 
            usbDevices[devAddr].ToggleEndpointInMSD  = 0;
            usbDevices[devAddr].ToggleEndpointOutMSD = 0;
    //...
    

  • Mod

    Rev. 455:

    Sector 0 (bootsector) wird ausgelesen und analysiert.

    1GB Stick mit FAT16:

    OEM name:           MSDOS5.0    byte per sector:        512                     
    sectors per cluster:    32      number of FAT copies:   2                       
    max root dir entries:   512     total sectors (<65536): 0                       
    media Descriptor:       F8h     sectors per FAT:        251                     
    sectors per track:      1       heads/pages:            1                       
    hidden sectors:         0       total sectors (>65535): 2050560                 
    FAT 12/16:              FAT16
    

    512 MB Stick mit FAT16:

    OEM name:           MSDOS5.0    byte per sector:        512                     
    sectors per cluster:    16      number of FAT copies:   2                       
    max root dir entries:   512     total sectors (<65536): 0                       
    media Descriptor:       F8h     sectors per FAT:        246                     
    sectors per track:      63      heads/pages:            255                     
    hidden sectors:         0       total sectors (>65535): 1007614                 
    FAT 12/16:              FAT16
    

    http://de.wikipedia.org/wiki/File_Allocation_Table

    Der Mediadeskriptor 0xF8 bedeutet "Festplatte".


  • Mod

    Rev. 456:

    die beiden QH im bulk transfer zeigen wieder aufeinander, spart ein Ein-/Ausschalten und Durchlaufen des Async. Schedulers.


  • Mod

    Rev. 457:

    _DIAGNOSIS_ funktioniert nun wieder vollständig, sollte vielleicht noch in Speicher und Tasking Management getrennt werden.

    Hier auch noch ein "Foto" und die Analyse des Bootsectors meines 512 MB Sticks, der auf FAT32 umformatiert wurde:

    PrettyOS [Version 0.0.0.457]                                                    
    --------------------------------------------------------------------------------
    >>> SCSI: read   sector: 0                                                      
    EBh 58h 90h 4Dh 53h 44h 4Fh 53h 35h 2Eh 30h 00h 02h 08h 22h 00h 02h 00h 00h 00h 
    00h F8h 00h 00h 3Fh 00h FFh 00h 00h 00h 00h 00h FEh 5Fh 0Fh 00h D7h 03h 00h 00h 
    00h 00h 00h 00h 02h 00h 00h 00h 01h 00h 06h 00h 00h 00h 00h 00h 00h 00h 00h 00h 
    00h 00h 00h 00h 00h 00h 29h D5h F9h 76h 0Ch 4Eh 4Fh 20h 4Eh 41h 4Dh 45h 20h 20h 
    20h 20h 46h 41h 54h 33h 32h 20h 20h 20h 33h C9h 8Eh D1h BCh F4h 7Bh 8Eh C1h 8Eh 
    D9h BDh 00h 7Ch 88h 4Eh 02h 8Ah 56h 40h B4h 08h CDh 13h 73h 05h B9h FFh FFh 8Ah 
    F1h 66h 0Fh B6h C6h 40h 66h 0Fh B6h D1h 80h E2h 3Fh F7h E2h 86h CDh C0h EDh 06h 
    41h 66h 0Fh B7h C9h 66h F7h E1h 66h 89h 46h F8h 83h 7Eh 16h 00h 75h 38h 83h 7Eh 
    2Ah 00h 77h 32h 66h 8Bh 46h 1Ch 66h 83h C0h 0Ch BBh 00h 80h B9h 01h 00h E8h 2Bh 
    00h E9h 48h 03h A0h FAh 7Dh B4h 7Dh 8Bh F0h ACh 84h C0h 74h 17h 3Ch FFh 74h 09h 
    B4h 0Eh BBh 07h 00h CDh 10h EBh EEh A0h FBh 7Dh EBh E5h A0h F9h 7Dh EBh E0h 98h 
    CDh 16h CDh 19h 66h 60h 66h 3Bh 46h F8h 0Fh 82h 4Ah 00h 66h 6Ah 00h 66h 50h 06h 
    53h 66h 68h 10h 00h 01h 00h 80h 7Eh 02h 00h 0Fh 85h 20h 00h B4h 41h BBh AAh 55h 
    8Ah 56h 40h CDh 13h 0Fh 82h 1Ch 00h 81h FBh 55h AAh 0Fh 85h 14h 00h F6h C1h 01h 
    0Fh 84h 0Dh 00h FEh 46h 02h B4h 42h 8Ah 56h 40h 8Bh F4h CDh 13h B0h F9h 66h 58h 
    66h 58h 66h 58h 66h 58h EBh 2Ah 66h 33h D2h 66h 0Fh B7h 4Eh 18h 66h F7h F1h FEh 
    C2h 8Ah CAh 66h 8Bh D0h 66h C1h EAh 10h F7h 76h 1Ah 86h D6h 8Ah 56h 40h 8Ah E8h 
    C0h E4h 06h 0Ah CCh B8h 01h 02h CDh 13h 66h 61h 0Fh 82h 54h FFh 81h C3h 00h 02h 
    66h 40h 49h 0Fh 85h 71h FFh C3h 4Eh 54h 4Ch 44h 52h 20h 20h 20h 20h 20h 20h 00h 
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 
    00h 00h 00h 00h 00h 00h 00h 00h 0Dh 0Ah 44h 61h 74h 65h 6Eh 74h 72h 84h 67h 65h 
    72h 20h 65h 6Eh 74h 66h 65h 72h 6Eh 65h 6Eh FFh 0Dh 0Ah 4Dh 65h 64h 69h 65h 6Eh 
    66h 65h 68h 6Ch 65h 72h FFh 0Dh 0Ah 4Eh 65h 75h 73h 74h 61h 72h 74h 3Ah 20h 54h 
    61h 73h 74h 65h 20h 64h 72h 81h 63h 6Bh 65h 6Eh 0Dh 0Ah 00h 00h 00h 00h 00h 00h 
    00h 00h 00h 00h 00h ACh C4h D3h 00h 00h 55h AAh                                 
    XMSDOS5.0"?_)vNO NAME    [b]FAT32[/b]   3{|NV@sf@f?AfffF~u8~*w2fFf+H}}t<t}}f`f;FJfjfPSf
    h~ AUV@UFBV@fXfXfXfX*f3fNfffvV@faTf@IqNTLDR      Datentrger entfernenMedienfehle
    rNeustart: Taste drckenU                                                        
    
    55h 53h 42h 53h 28h 42h 42h 42h 00h 00h 00h 00h 00h                             
    
                 - - - - - - - - - - - press key - - - - - - - - - - -              
    OEM name:           MSDOS5.0    byte per sector:        512                     
    sectors per cluster:    8       number of FAT copies:   2                       
    max root dir entries:   0       total sectors (<65536): 0                       
    media Descriptor:       F8h     sectors per FAT:        0                       
    sectors per track:      63      heads/pages:            255                     
    hidden sectors:         0       total sectors (>65535): 1007614                 
    FAT 12/16:                                                                      
                 - - - - - - - - - - - press key - - - - - - - - - - -              
    --------------------------------------------------------------------------------
    Port: 3, device attached
    

  • Mod

    Rev. 458:

    usb und usb-MSD:
    Ausgaben gestrafft, Auswertedetails hinzugefügt und besser geordnet


  • Mod

    Rev. 459:

    Das Command Status Word (CSW) wird nun komplett (vorher nur letztes Byte) auf Korrektheit analysiert, um entsprechend reagieren zu können.

    F0h 00h 00h 00h 00h 00h 00h 0Ah 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h

    55h 53h 42h 53h 03h 42h 42h 42h 00h 00h 00h 00h 00h

    CSW signature OK
    CSW tag 03h OK
    CSW data residue OK
    CSW status OK

    Results of "request sense":
    Valid: Sense data are SCSI compliant
    Response Code: Current errors, fixed format
    Sense Key: No Sense

    > SCSI: read capacity
    00h 00h 00h 00h 00h 00h 00h 00h

    01h 01h 01h 01h AAh AAh AAh AAh AAh AAh AAh AAh AAh

    CSW signature wrong (not processed)
    Error: CSW tag wrong
    CSW data residue: -1431655766
    CSW status byte: undefined value (error)

    01h 01h 01h 01h AAh AAh AAh AAh AAh AAh AAh AAh AAh ist der Wert, den ich im CSW beim Erstellen vorgebe. Bei einem erfolgreichen Transfer wird die CSW Signature "USBS" (55h 53h 42h 53h) in den data-Bereich geschrieben, das CBW tag als CSW tag wiederholt (damit können wir den SCSI opcode checken), die Differenz zwischen zu übertragender und wirklich übertragener Länge dargestellt sowie das Status Byte 0x00 gesetzt.

    TODO: wenn ein Transfer nicht ausgeführt wurde, stehen am Device nach dem ResetRecovery noch Informationen (Daten, CSW) zur Verfügung, die dann bei Leseoperationen nachkommen. Die nicht erhaltenen Daten, CSW sollten dann noch abgeholt und interpretiert werden, damit Host und Device im Takt bleiben.

    Zum Glück habe ich einen 4 GB usb-Stick, der auf real PC nach dem "test unit ready" netter Weise richtig auf stur schaltet. An diesem bockigen MSD Device kann man das noch zu errichtende Procedere gut testen. 😉


  • Mod

    Rev. 460:

    Zwischenschritt: Transfer-Struktur eingefügt, um den Ablauf des bulk-Transfers analysieren zu können
    ehciQHqTD.h:

    struct usbBulkTransfer
    {
        uint8_t  SCSIopcode;
        bool     successfulCommand;
        bool     successfulDataOUT;
        bool     successfulDataIN;
        bool     successfulCSW;
        uint32_t DataBytesToTransferOUT;
        uint32_t DataBytesToTransferIN;
    }__attribute__((packed));
    typedef struct usbBulkTransfer usbBulkTransfer_t;
    

    ehciQHqTD.c:

    void logBulkTransfer(usbBulkTransfer_t* bT)
    

  • Mod

    Rev. 461:

    Analyse des MBR und Lesen des ersten Sectors der Partition
    http://de.wikipedia.org/wiki/Partitionstabelle


  • Mod

    Rev. 462:

    - Auswertung von SCSI command "Inquiry"
    - Verbesserte Master Boot Record Erkennung und Auswertung

    Fehlerbehandlung bei USB-bulk-Transfer noch nicht ausreichend


  • Mod

    Rev. 463:

    zur Verbesserung der Lesbarkeit beim Auswerten von Bit-Feldern:
    (Dank an: kwolf == taljeth für die Mithilfe bei der Formulierung)

    util.h/c:

    // fetch data field bitwise in byte "byte" from bit "shift" with "len" bits  
    uint8_t getField(void* addr, uint8_t byte, uint8_t shift, uint8_t len)
    {
        return  ( (((uint8_t*)addr)[byte] >> shift) & ((1 << len) -1));
    }
    

    Beispiel:

    void* addr = (void*)DataQTDpage0;  
    //...
    uint8_t RMB                  = getField(addr, 1, 7, 1); // byte, shift, len
    //...
    uint8_t SftRe                = getField(addr, 7, 0, 1);
    uint8_t CmdQue               = getField(addr, 7, 1, 1);
    uint8_t Reserved4            = getField(addr, 7, 2, 1); 
    uint8_t Linked               = getField(addr, 7, 3, 1);
    uint8_t Sync                 = getField(addr, 7, 4, 1);
    uint8_t WBus16               = getField(addr, 7, 5, 1); 
    uint8_t WBus32               = getField(addr, 7, 6, 1); 
    uint8_t RelAddr              = getField(addr, 7, 7, 1);
    

  • Mod

    Rev. 464:

    Überarbeitung der Auswertung des SCSI command "inquiry" entsprechend dem Buch von Jan Axelson, "USB Mass Storage":

    Beispiele:

    16 GB usb-stick:

    Vendor ID: JetFlash
    Product ID: Transcend 16GB
    Revision: 8.07
    Version: 2 (4: SPC-2, 5: SPC-3)
    Response Data Format OK
    Removable device type: yes
    Supports hierarch. addr. support: no
    Supports normal ACA bit support: no
    Supports linked commands: no
    Supports tagged command queuing: no
    direct-access device (e.g., magnetic disk)
    opcode: 12h cmd: OK data in: OK CSW: OK

    4 GB usb-stick:

    Do Ping<-- command
    Vendor ID: Verbatim
    Product ID: STORE N GO
    Revision: PMAP
    Version: 0 (4: SPC-2, 5: SPC-3)
    Response Data Format is not OK: 1 (should be 2)
    Removable device type: yes
    Supports hierarch. addr. support: no
    Supports normal ACA bit support: no
    Supports linked commands: no
    Supports tagged command queuing: no
    direct-access device (e.g., magnetic disk)
    opcode: 12h cmd: OK data in: OK CSW: OK

    1 GB usb-stick:

    Do Ping<-- command
    Vendor ID: memory
    Product ID: USB2.0
    Revision: 1.00
    Version: 2 (4: SPC-2, 5: SPC-3)
    Response Data Format OK
    Removable device type: yes
    Supports hierarch. addr. support: no
    Supports normal ACA bit support: no
    Supports linked commands: no
    Supports tagged command queuing: no
    direct-access device (e.g., magnetic disk)
    opcode: 12h cmd: OK data in: OK CSW: OK

    512 MB usb-stick:

    Vendor ID: A60C0704
    Product ID: Flash Disk
    Revision: 8.07
    Version: 2 (4: SPC-2, 5: SPC-3)
    Response Data Format OK
    Removable device type: yes
    Supports hierarch. addr. support: no
    Supports normal ACA bit support: no
    Supports linked commands: no
    Supports tagged command queuing: no
    direct-access device (e.g., magnetic disk)
    opcode: 12h cmd: OK data in: OK CSW: OK

    Response Data Format OK bedeutet, das der Wert gleich 2 ist.


  • Mod

    Rev. 465: Zwischenschritt

    FAT Filesystem hinzugefügt, so dass man nun mittels filename von usb msd laden kann:

    fat.c, zeile 1191: hier bitte den Namen eingeben:

    strncpy(foCompareTo->name,"CLEAN   BAT",11); // <--------------- this file will be searched
    

    Also unser clean.bat auf stick oder usb HDD laden und danach suchen lassen.

    Beispiel:
    evtl. Schritt 0: MBR wird ausgelesen und Beginn der Partition (Sektor 8192) nachgeladen.

    This seems to be a Master Boot Record:                                          
    
    Disc Signature: 00000000h       Null (check): 0000h                             
    
    no partition table 0                                                            
    partition table 1:  not bootable                                                
    type:               0Bh                                                         
    first sector (CHS): 130 3 0                                                     
    last  sector (CHS): 6 229 161                                                   
    start sector:       8192                                                        
    number of sectors:  31367168                                                    
    
    no partition table 2                                                            
    no partition table 3
    

    Schritt 1: Die Partition wird als FAT 32 erkannt, wir speichern die Daten in unsere Struktur DISK usbstick:

    OEM name:           MSDOS5.0    byte per sector:        512                     
    sectors per cluster:    16      reserved sectors:       64                      
    number of FAT copies:   2       max root dir entries:   0                       
    total sectors (<65536): 0       media Descriptor:       F8h                     
    sectors per FAT:        0       sectors per track:      63                      
    heads/pages:            255     hidden sectors:         8192                    
    total sectors (>65535): 31367168        FAT 12/16:                              
    This is a volume formated with FAT32.                                           
    The root dir starts at cluster(!) 2.                                            
    Sectors per FAT: 15344.                                                         
                 - - - - - - - - - - - press key - - - - - - - - - - -              
    buffer:     C0290000h                                                           
    type:       3                                                                   
    SecPerClus: 16                                                                  
    maxroot:    512                                                                 
    fatsize:    15344                                                               
    fatcopy:    2                                                                   
    firsts:     8192                                                                
    fat:        8256                                                                
    root:       38944                                                               
    data:       38960                                                               
    maxcls:     1959931                                                             
    mount:      1
    

    Schritt 2: die Root Dir (sector 38944 = 8192 (hidden sectors) + 64 (Reserved Sectors) + 15344 (FAT1) + 15344 (FAT2)) mit den File Entries wird gefunden:

    >>> SCSI: read sector: 38944
    55h 53h 42h ...... 0Ch 00h 00h                                 
    USB-STICK  Py<Test1.binEST1   BIN q.<.<x`.<s.ppt6tEffe6ctivenesfor_A6GQM_AssePre
    se6ntation_RESEN~1PPT \Py<<Py<GCC     PDF /<<<5&,KERNEL C   Kp<<o<HCI    C   X{<
    <ar<SB2    C   X{<<$v<+SB2    C   Gq<<y< CS      H   Tq<<cH<HCI    H   Tq<<l<#SB
    2    H   Tq<<}<
    

    Schritt 3:
    Der Name "clean bat" wird als Entry Nr. 85 gefunden:

    *curEntry: 85                            
    ...                                                                             
    An entry is found. Attributes OK for search                                     
    index: 0 character: C test: C                                                   
    index: 1 character: L test: L                                                   
    index: 2 character: E test: E                                                   
    index: 3 character: A test: A                                                   
    index: 4 character: N test: N                                                   
    index: 5 character:   test:                                                     
    index: 6 character:   test:                                                     
    index: 7 character:   test:                                                     
    index: 8 character: B test: B                                                   
    index: 9 character: A test: A                                                   
    index:10 character: T test: T
    

    Schritt 4:
    Dann erfolgt der entsprechende Ladevorgang mit Hilfe von First Cluster und Filesize (in Entry) und der FAT32 chain, hier der Fund und Ladevorgang mit "size" Byte aus dem Sektor 38960:

    >>>>> fread <<<<<!                                                              
    >>>>> cluster2sector<<<<<    cluster: 3  sector 38960                           
    >>>>> sectorRead <<<<<!                                                         
    
    >>> SCSI: read   sector: 38960                                                  
    ......
    tools\mingw32-make clean OS=WINDOWS                                             
    
    74h 6Fh 6Fh 6Ch 73h 5Ch 6Dh 69h 6Eh 67h 77h 33h 32h 2Dh 6Dh 61h 6Bh 65h 20h 63h 
    6Ch 65h 61h 6Eh 20h 4Fh 53h 3Dh 57h 49h 4Eh 44h 4Fh 57h 53h                     
    >>>>> fclose <<<<<!
    

    Entsprechend läuft dies auch mit Sticks ohne MBR und/oder mit FAT16 Volume.


  • Mod

    Rev. 466:

    Serials von usb msd und von der FAT16 oder FAT32 Partition werden angezeigt und gespeichert. Damit können wir eine Partition sicher erkennen.

    usb-stick    usb device ser. #    FAT ser. #     FAT..   
    ------------------------------------------------------
    512 MB                8B6A0861    F6 1C E9 20    16    
      1 GB                     110    ED 50 07 58    16
      4 GB            0D09297675C0    62 F9 2A 94    32
     16 GB                N014IM75    79 A2 6C 5C    32
    

    Hierbei verwende ich bei den usb device ser. # nur die letzten 12 Stellen, weil nur diese unterschiedlich sein müssen.

    Die serial vom 1GB stick erscheint verflixt kurz.
    Die serial vom 4GB stick ist sogar 16 Stellen lang, die vorderen 4 habe ich beim Speichern verworfen. Wir können aber auch erhöhen.



  • Revision 467:

    - Weiterbau an CDI
    - ...


  • Mod

    Herzlichen Dank an MrX für das Engagement bezüglich CDI! 👍

    Rev. 468:

    Zwischenschritt: Hidden Sectors durch Startsector der Partition ausgetauscht (dürfte momentan bei einer Partition - also bei sticks - zuverlässig funktionieren)

    Für Tests:

    1. Datei auf stick kopieren oder entsprechend auswählen/benennen
    2. Filename[8] incl. Extension[3] ohne Punkt(!), aber mit Spaces (Summe 11 character) hier eingeben:
      usb2_msd.c, zeile 660 ff.
    // testFAT("clean   bat"); // TEST FAT filesystem filename: "prettyOSbat" without dot and with spaces in name!!! 
    testFAT("makefile.xxx"); // TEST FAT filesystem filename: "prettyOSbat" without dot and with spaces in name!!! 
    // testFAT("makefile   "); // TEST FAT filesystem filename: "prettyOSbat" without dot and with spaces in name!!! 
    // test more!
    

    EDIT: testFAT("makefile.xxx"); ist leider verkehrt gewesen, sorry, richtig: "makefilexxx"


  • Mod

    Rev. 469:

    Korrekturen und Umbenennungen (z.B. von DISK nach PARTITION)

    usb2_msd.c, zeile 660:

    testFAT("clean   bat"); // TEST FAT filesystem filename: "prettyOSbat" without dot and with spaces in name!!!
    

Anmelden zum Antworten