Sourcecode Fortschritt


  • 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!!!
    


  • Revision 470:

    - cdi_list: Bugfixes
    - list_GetElement gibt nun element_t* statt void* zurück.
    - video.c: Titelzeilen-Bug gefixt
    - fat.c: Code optimiert und (verlustfrei) gekürzt.
    - Sound wieder aktiviert


  • Mod

    Rev. 471:

    FAT32 Filestruktur wurde angepasst mit Cluster > 2^16

    Test bei MrX: mit vollem Stick bezüglich FAT32 OK. 🙂


  • Mod

    Rev. 472:

    Zwischenschritt: Umbauten in ehci und usb_msd, damit auch bereits eingesteckte/angeschlossene usb msd getestet werden. Als Suchfile wird makefile.xxx verwendet (ohne xxx taucht ein seltsames 'B' auf, das nicht aus dem Entry auf dem msd, sondern offensichtlich aus dem code stammt.


  • Mod

    Rev. 473:

    - user heap verlegt
    - uint16 gegen uint32 ausgetauscht in fat.h/c (wegen Zahlen > 2^16)
    - volume formatiert mit NTFS wird gemeldet

    Suchfile: makefile.xxx (im FAT-Filetest)



  • Revision 474:

    - Userlib:
        - Neue Funktionen: vprintf, snprintf, vsnprintf, strncat
        - Änderungen: strncpy aus util.c übernommen
        - Bug in gets gefixt (Neue Zeile wurde eingefügt, wenn \b an Pos 0|0 (Relativ vom Start) gedrückt wurde)
        - Kleinigkeiten (Typen, etc.)
    - Kernel:
        - cprintf basiert nun auf vprintf
        - Bug mit %v in printfs behoben (nun in allen kernel-printfs unterstützt)
        - ehci, usb, etc.: Umformatierungen, etc.
        - Kommentare gefixt
        - Sound reaktiviert
    

  • Mod

    Rev. 475:
    fat, data packages bei ehci: Ausgaben korrigiert, verringert zur besseren Übersicht. Kleine Fehler bei Filename-Handling korrigiert.

    Inzwischen existieren in os.h folgende Schalter:

    /// #define _DIAGNOSIS_     // Diagnosis-Output - activates prints to the screen about some details and memory use
    /// #define _USB_DIAGNOSIS_ // only as transition state during implementation of USB 2.0 transfers
    /// #define _FAT_DIAGNOSIS_ // only as transition state during implementation of FAT 16/32
    #define _SOUND_         // Sound-Messages  - deactivation makes sense during development, because of better boot-time
    

  • Mod

    Rev. 476:

    ttt.elf (tic tac toe) wird von usb-stick geladen und ausgeführt! 🙂

    Bei 3 aus 4 usb-sticks wurde ttt.elf sauber geladen/ausgeführt, beim 4GB stick (billiges "unsauberes" Device) knallen momentan vorne nur so die scsi-transfer-errors, ttt wird aber nach mehreren versuchen dennoch irgendwie geladen, allerdigs defekt ausgeführt, man sieht nur 0 und X beim setzen. Das liegt also an den usb-transfers.

    Meilenstein: Ausführen eines Programms von usb-stick! 👍 🙂

    MrX hat ebenfalls bestätigt, einzige Kritik: "Die Kreuzchen sind Gelb" 😃


  • Mod

    Rev. 477:

    %i wurde weitgehend gegen %u ausgetauscht beim Ausdruck.

    utoa in util.c eingefügt und in ...printf bei %u verwendet.

    Dies führt zum Beispiel zu verbesserten Ergebnissen bezüglich der Darstellung bei der Analyse der Partitionstabelle im MBR.


  • Mod

    Rev. 478:

    - testFAT(...) ausgelagert aus fat.c (soll möglichst allgemein bleiben)
    - scsi-abfolge test unit ready - test unit ready - request sense - (test unit ready - request sense)
    - utoa (von MrX überarbeitet) 👍
    - FAT testablauf etwas optimiert
    - die beiden QH (out/in) bei bulk-Transfer wieder getrennt


Anmelden zum Antworten