Annotation of driverkit/notes/AdbThread, revision 1.1

1.1     ! root        1:                        ADB driver thread pcode
        !             2:                
        !             3: adbThread(id adbObject)
        !             4: {
        !             5:        set up registers and interrupt ports and so forth;
        !             6:        cmdPort initially disabled;
        !             7:        doReset;
        !             8:        enable cmdPort;
        !             9:        while(1) {
        !            10:                wait for msg on portSet;
        !            11:                if msg on interrupt port 
        !            12:                        adbInterruptHandler;
        !            13:                else if msg on cmdPort
        !            14:                        adbCommandHandler;
        !            15:                else
        !            16:                        log error;
        !            17:        }
        !            18: }
        !            19: 
        !            20: /*
        !            21:  * Called on async interrupt only; should be "data avaiable" or
        !            22:  * service request.
        !            23:  */
        !            24: - adbInterruptHandler
        !            25: {
        !            26:        grab interrupt cause and clear the pending bits;
        !            27:        if (interrupt cause == AS_INPUT_DATA_PENDING) {
        !            28:        
        !            29:                /*
        !            30:                 * Normal async data in case.
        !            31:                 */
        !            32:                handleDataIn(currentAddress);
        !            33:                enableAutopoll(currentAddress);
        !            34:                enable cmdPort;
        !            35:        }
        !            36:        else if(interrupt cause == service request) {
        !            37:                scanServiceRequestor;
        !            38:        }
        !            39:        else {
        !            40:                handle error - probably just do a reset;
        !            41:        }       
        !            42: }
        !            43: 
        !            44: /*
        !            45:  * Execute client command. 
        !            46:  */
        !            47: - adbCommandHandler
        !            48: {
        !            49:        switch cmd {
        !            50:            case reset:
        !            51:                disable cmdPort;
        !            52:                doReset;
        !            53:                status = good;
        !            54:                enable cmdPort;
        !            55:                break;
        !            56:                
        !            57:            case send_cmd:
        !            58:                disable cmdPort;
        !            59:                disableAutopoll;
        !            60:                status = sendCmd(cmd);
        !            61:                enableAutopoll;
        !            62:                return rtn;
        !            63:                
        !            64:            case attach:
        !            65:                if desired address already attached
        !            66:                     status = IO_CR_BUSY;
        !            67:                else {
        !            68:                    record client/address pair;
        !            69:                    status = good;
        !            70:                }
        !            71:        }
        !            72:        I/O complete(status);
        !            73: }
        !            74: 
        !            75: /*
        !            76:  * Handle service request.
        !            77:  */
        !            78: - scanServiceRequestor
        !            79: {
        !            80:        disableAutopoll;
        !            81:        for(currentAddress = 0 to max) {
        !            82:                send a talk register 0 command;
        !            83:                if OK {
        !            84:                        get other registers;
        !            85:                        dispatch to client;
        !            86:                }
        !            87:                else try next address;
        !            88:        }       
        !            89:        enableAutopoll(last responding adress);
        !            90:        return;
        !            91: }
        !            92: 
        !            93: - doReset
        !            94: {
        !            95:        disable cmdPort;
        !            96:        assert reset;
        !            97:        while(1) {
        !            98:                wait for interrupt message;
        !            99:                if resetPulseCompleted          // nothing else matters
        !           100:                        break;
        !           101:        }
        !           102:        scanBus;
        !           103:        enableAutopoll(address = 0);
        !           104: }
        !           105: 
        !           106: /*
        !           107:  * Autopoll must be off.
        !           108:  */
        !           109: - (IOReturn)sendCmd : (adbDriverCommand *)cmd
        !           110: {
        !           111:        disable cmdPort;
        !           112:        load cmd and byte count;
        !           113:        hit AC_TRANSMIT_COMMAND;
        !           114:        wait for interrupt;
        !           115:        if interrupt status = userAccessCompleted {
        !           116:                cool;
        !           117:                save bit count in *cmd;
        !           118:                return IO_R_SUCCESS;
        !           119:        }
        !           120:        if service request {
        !           121:                scanServiceRequestor;
        !           122:        }
        !           123:        deal with other errors;
        !           124:        if autopoll not enabled {
        !           125:                enableAutopoll(user access address);
        !           126:        }
        !           127: }
        !           128: 
        !           129: - (void)enableAutopoll(adbAddress address)
        !           130: {
        !           131:        cmd = talk register 0 (address);
        !           132:        load cmd and bit count registers;
        !           133:        hit AC_ENABLE_AUTO_POLL;
        !           134: }
        !           135: 
        !           136: /*
        !           137:  * Shut down autopoll mode in preparation for doing a user poll operation.
        !           138:  */
        !           139: - (void)disableAutopoll
        !           140: {
        !           141:        if !autoPollEnabled
        !           142:                return;
        !           143:        hit AC_DISABLE_AUTO_POLL;
        !           144:        while(1) {
        !           145:            wait for interrupt;
        !           146:            if interrupt cause == AS_INPUT_DATA_PENDING {
        !           147:            
        !           148:                /*
        !           149:                 * Lost a race, must handle this incoming event from
        !           150:                 * last autopoll address.
        !           151:                 */
        !           152:                handleDataIn(currentAddress);
        !           153:            }
        !           154:            else if interrupt cause = auto polling stopped
        !           155:                return;
        !           156:        }
        !           157: }
        !           158: 
        !           159: /*
        !           160:  * scan bus, resolve address conflicts.
        !           161:  */
        !           162: - (void)scanBus
        !           163: {
        !           164: 
        !           165: }
        !           166: 
        !           167: /*
        !           168:  * Handle async data available condition (AS_INPUT_DATA_PENDING true).
        !           169:  */
        !           170: - -(void)handleDataIn(deviceAddress)
        !           171: {
        !           172:        adbEvent localEvent;
        !           173:        
        !           174:        disable cmdPort;
        !           175:        do {
        !           176:                save reg 0 (current data0/1) in localEvent;
        !           177:                get the other three registers, stash in localEvent;
        !           178:                localEvent.deviceAddress = deviceAddress;
        !           179:                dispatchEvent(localEvent);
        !           180:                error = sendCmd(talk register 0 (deviceAddress));
        !           181:        while(!error);
        !           182: }
        !           183: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.