Sourcecode Fortschritt



  • Revision 422:

    - vprintf und vsnprintf eingeführt, snprintf statt sprintf, strncat eingeführt
    - obsolete Syscalls mit nop "eliminiert" (testch, getCurrentMilliseconds und getUserTaskNumber) und dazugehörende Funktionalität gelöscht
    - kdebug repariert
    - checkKQ_and_return_char heißt nun keyboard_getChar
    - writeInfo hat jetzt auch dynamische Parameterliste
    - Mausoutput in Infobar verlegt
    - Formatierung&Aufräumarbeiten

    bitte in ehci.c, ab zeile 900, folgendes verwenden (Doppelausgabe vermeiden):

    for(uint32_t sector=0; sector < 10; sector++)
    {
     settextcolor(9,0); printf("\n>>> SCSI: read(10)"); settextcolor(15,0);
     usbSendSCSIcmd(devAddr, usbDevices[devAddr].numEndpointOutMSD, usbDevices[devAddr].numEndpointInMSD, 
                    0x28, sector, length, false); // dev, endp, cmd, LBA, transfer length, MSDStatus
     printf("\nIO:"); 
     showStatusbyteQTD(DataQTD); 
     waitForKeyStroke();                     
    }                   
    }
    

  • Mod

    Rev. 423:

    USB/SCSI:

    PrettyOS [Version 0.0.0.423] Console 1: EHCI Ports
    --------------------------------------------------------------------------------
    USB2: SET_CONFIGURATION 1
    USB2: GET_CONFIGURATION 1
    dev: 1 interface: 0 endpOUT: 2 endpIN: 1
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    > SCSI: test unit ready
    55h 53h 42h 53h 42h 42h 42h 42h 00h 00h 00h 00h 00h

    Command Passed ("good status")
    qTD Status: 00h OK (no bit set)

    > Press key to go on with USB-Test. <<<

    > SCSI: read(10)
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
    ... <lauter Nullen>
    00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h

    qTD Status: 80h Active - HC transactions enabled

    > Press key to go on with USB-Test. <<<
    --------------------------------------------------------------------------------

    Problem: warum läuft der Transfer mit dem read(10) nicht durch?


  • Mod

    Rev. 424:

    Zwischenstand zur Sicherung: Austausch von sleep gegen delay in performAsyncScheduler() ergibt positive resultate mit dem 1GB stick in VMWare.

    Diese Funktion muss umgebaut werden.


  • Mod

    Rev. 425:

    diese version funktionierte mit test unit ready, read capacity, read(10) (VMWare, 1GB stick)



  • Revision 426:

    - settextcolor(uint8_t, uint8_t) durch textColor(uint8_t) ersetzt. ACHTUNG: Userprogramme neukompilieren, da syscalls geändert (noch nicht mit allen Mitgelieferten gemacht)
    - my_stdarg.h durch types.h ersetzt im Userbereich.
    - einige Tabs beseitigt, sonstige Formatierungen & Kleinigkeiten


  • Mod

    Rev. 427:

    - testMSD(deviceAddr) ausgelagert aus ehci.c
    - alte usb-Funktionen nicht mehr gebraucht (auskommentiert, kommen demnächst weg)


  • Mod

    Rev. 428:

    Sicherung vor "Umbau auf qTD umhängen bei stabilen QH"

    Diese Version läuft mit 1GB usb-Stick auf VMWare

    bitte beachten: for(uint32_t sector=1055; sector < 1060; sector++)
    das ist 0x83E00 beginnend, hat bei mir in VMWare geklappt, zumindest ab 0x84000 (zweiter gelesener Sektor)



  • oh, hab ich ausversehen sektor 1055 bis 1060 committed? Das war ja eig. nur für meinen Stick gültig, damit ich mal was sehe...


  • Mod

    Macht doch nix. 🙂

    Erste Versuche des Einhängens von qTDs in QH endeten leider in Host System Error. 🙄
    http://www.henkessoft.de/OS_Dev/Downloads/PrettyOS_rev428umgebaut001.zip <--- bitte check, vielleicht können wir die Vorgehensweise doch noch nutzen.



  • Revision 429:

    - Ring-Strukturen angelegt (für Scheduler-Umbauten voraussichtlich nötig), analog zu list
    - ODA aufgelöst (in Einzelvariablen und system)
    - Alle Userprogramme neu übersetzt (wegen Userlibänderung)
    - Formatierungen
    - Smilie-Bug gefixt.


  • Mod

    Diese Revision 429 funktioniert in VMWare mit einem 1GB stick komplett wie gewünscht: http://www.henkessoft.de/OS_Dev/Bilder/rev429.PNG

    Wir suchen den Weg dies zu verallgemeinern.


  • Mod

    Rev. 430:

    Auslagerungen und Streichungen zur Erhöhung der Lesbarkeit und Wartbarkeit wurden vorgenommen:

    ehciQHqTD.h/c: Queue Head (QH) und Queue Element Transfer Descriptor (qTD)
    usb2_msd.h/c: USB 2.0 Mass Storage Devices (MSD)


  • Mod

    Rev. 431:

    Verbesserungen im Code bei ehci/usb


  • Mod

    Rev. 432:

    Zwischenstand nach Vorbild tatOS
    siehe: http://www.c-plusplus.net/forum/viewtopic-var-t-is-253016-and-start-is-71.html

    testMSD(): Umgebaut auf die dort verwendete Startreihenfolge.


  • Mod

    Rev. 433:

    In VMWare geht 1GB und 16 GB usb-stick, Test-PC zeigt noch qTD-status 0x80 (wird nicht ausgeführt)

    Fehler im Bereich SCSI-Befehle wurden korrigiert (z.B. werden bei read im SCSI cmd nicht byte sondern blocks angegeben).

    Bitte mit Simulationen und PC testen. 🙂

    Dank an den Ersteller von tatOS. Es geht nichts über praktische Vorbilder mit vielen Kommentaren direkt im Code, sollten wir uns selbst ein Beispiel daran nehmen. 👍



  • Ganz nützlich wär vlt. noch ein Link zu Tatos, denn Google rückt damit nur ungern raus, da es gerne nach Tattoos suchen möchte. (mit vielen "-"-Angaben schafft man es schon, aber es ist mühsam)


  • Mod


  • Mod

    Rev. 434:

    bei real PC hängt es im IN-Zweig von usbSendSCSIcmd


  • Mod

    rev. 435: Zwischenstand

    einige verbesserungen, real PC problem aber noch nicht gelöst


  • Mod

    Rev. 436: da +gjm+ auf speicherprobleme tippt, hier eine korrigierte Version mit #define _USB_DIAGNOSIS_ aktiviert.

    Hier der aktuelle Ablauf auf PC mit meinem 1GB stick:

    dev: 3 interface: 0 endpOUT: 2 endpIN: 1
    USB2: usbTransferBulkOnlyMassStorageReset, dev: 3 interface: 0#
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    > SCSI: inquiry
    OUT part#
    IN part transfer>0#
    virtAddrBuf0 C0252000h : 00h 80h 02h 02h 1Fh 00h 00h 00h 6Dh 65h 6Dh 6Fh 72h 79h
    00h 00h 55h 53h 42h 32h 2Eh 30h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 31h 2Eh
    30h 30h

    virtAddrBuf0 C0251000h : 55h 53h 42h 53h 12h 42h 42h 42h 00h 00h 00h 00h 00h

    Command Passed ("good status")
    qTD Status: 00h OK (no bit set)<-- data
    qTD Status: 00h OK (no bit set)<-- status

    Command Block Status Values in "good status"

    > Press key <<<
    > SCSI: test unit ready
    OUT part#
    IN part transfer==0###################
    timeout - no STS_USBINT set!
    virtAddrBuf0 C0257000h : 55h 53h 42h 53h AAh AAh AAh AAh AAh AAh AAh AAh AAh

    qTD Status: 00h OK (no bit set)<-- data
    qTD Status: 80h Active - HC transactions enabled<-- status

    > Press key <<<
    > SCSI: request sense
    OUT part#
    IN part transfer>0###################
    timeout - no STS_USBINT set!
    virtAddrBuf0 C025D000h : 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
    00h 00h 00h 00h

    virtAddrBuf0 C025C000h : 55h 53h 42h 53h AAh AAh AAh AAh AAh AAh AAh AAh AAh

    qTD Status: 80h Active - HC transactions enabled<-- data
    qTD Status: 80h Active - HC transactions enabled<-- status

    > Press key <<<

    Wie man sieht, steigt der Ablauf beim ersten "test unit ready" (der zweite SCSI command nach dem ersten "inquiry") Beim IN-Endpoint mit seinem QH/qTD Essemble aus.

    So sieht dort der Code aus:

    printf("\nIN part");
    
        pOpRegs->ASYNCLISTADDR = paging_get_phys_addr(kernel_pd, QH_In);
    
        // IN qTDs 
        void* QTD_In;
        void* next = createQTD_Handshake(OUT); // Handshake
        if (TransferLength > 0)
        {
            printf(" transfer>0");
            next = StatusQTD = createQTD_MSDStatus((uintptr_t)next, 1); // next, toggle // IN 13 byte
            QTD_In = DataQTD = createQTD_IO((uintptr_t)next, IN,  0, TransferLength); // IN/OUT DATA0, ... byte
        }
        else
        {
            printf(" transfer==0");
            QTD_In = StatusQTD = createQTD_MSDStatus((uintptr_t)next, 0); // next, toggle // IN 13 byte
        }
    
        // IN QH
        createQH(QH_In, paging_get_phys_addr(kernel_pd, QH_In), QTD_In, 1, device, endpointIn, 512); // endpoint IN/OUT for MSD
    
        performAsyncScheduler();
    
        if (TransferLength) // byte
        {
            printf("\n");
            showPacket(DataQTDpage0,TransferLength);
            if ((TransferLength==512) && (TransferLength==36)) // data block, inquiry feedback
            {
                showPacketAlphaNumeric(DataQTDpage0,TransferLength);
            }
        }
    
        printf("\n");
        showPacket(MSDStatusQTDpage0,13);
    
        if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x0 )
        {
            printf("\nCommand Passed (\"good status\") ");
        }
        if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x1 )
        {
            printf("\nCommand failed");
        }
        if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x2 )
        {
            printf("\nPhase Error");
        }
    
        // transfer diagnosis
        showStatusbyteQTD(DataQTD);   printf("<-- data");   // In/Out Data
        showStatusbyteQTD(StatusQTD); printf("<-- status"); // In CSW
    

Anmelden zum Antworten