Domanda

I nostri sistemi programmatore ha sviluppato il guscio di un driver della porta seriale virtuale per il nostro hardware mobile incorporato, e sono stato di riempimento nei metodi per farlo funzionare. Il driver funziona come previsto, si simula una porta COM per un dispositivo USB che è vomitando NMEA stringhe (dati GPS).

I tipo WM6 in breve, ma il sistema operativo è WM6.1 se fa alcuna differenza.

Il problema che sto avendo è che il driver non viene caricato in avvio del dispositivo solo su WM6. Il driver è stato sviluppato sia per CE5 e WM6, ma su CE5 il driver "fa" carico in fase di avvio, che mi sta puntando ad un problema di configurazione WM6. E 'forse la pena di notare a questo punto che il driver verrà caricato in WM6 e CE5 usando il metodo ActivateDevice (), questo è quello che ho utilizzato finora per WM6, un piccolo test applicazione per lanciare il driver in modo posso almeno prova il conducente sta lavorando su WM6.

Il Registro di sistema è già popolata con i tasti necessari per l'avvio del driver. Quindi il driver dovrebbe essere caricato all'avvio senza problemi. HKEY_LOCAL_MACHINE \ Drivers \ BuiltIn contiene una chiave sub A36D_GPS_COM, e in quella chiave è contenuto.

DeviceArrayIndex: 0

DeviceType: 0

Dll: A36D.dll

Bandiere: 0

Soprannome: A36D GPS porta COM

Indice: 8

ordine: 3

Prefisso: COM

Priorità: 0

Priorità: 256

Da quello che posso dire ci sono generalmente 2 risposte comuni a questo problema che ho già indagato. Queste idee sono state date a me dal programmatore incorporato, ma ho studiato come fare io stesso.

1) La porta COM è già in uso quando il driver prova a carico, anche se quella porta COM è finalmente libera una volta che il dispositivo viene caricato. Ho cambiato il valore Indice nel registro di tra 1 e 20 e riavviato il dispositivo, e il conducente non caricare su una porta COM specificata. Quindi, per provare e testare questo più a fondo, ho spostato un altro dispositivo per da COM9 a COM8 e si è trasferito il mio autista a COM9 (utilizzando le impostazioni del registro di cui sopra). Gli altri carichi driver di periferica all'avvio su COM8 tranquillamente, ma il mio driver di periferica non si avvia su COM9. Ho anche provato tweaking le altre impostazioni, ma ancora non carica la fase di boot.

2) Un altro possibile i problemi e le differenze tra CE5 e WM6 è la sicurezza. Quindi, utilizzando l'articolo di MSDN http://msdn.microsoft.com/en-us /library/bb737570.aspx ho lavorato sulla firma e XML di provisioning. Utilizzando una chiave privilegiata (non scaduto), l'A36D.dll è firmato in Visual Studio e il file di installazione CAB creato viene anche firmato con la stessa chiave. Un file _setup.xml viene creato e aggiunto al file cab in modo che la chiave firmata viene aggiunto all'archivio certificati. Il file CAB è firmato ancora una volta con la stessa chiave per assicurarsi che sia ancora valido. Inoltre il _setup.xml è confezionato in un proprio file .CPF. Sia il file CAB CPF e fanno aggiungere la chiave per raggiungere i negozi certificati "HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates", così lo sanno sta funzionando. Come una questione di prudenza ho installato ai privilegiati, senza privilegi, ROOT e archivi di certificati SPC. Ma il driver di periferica non viene ancora caricata in Device.exe all'avvio del dispositivo mobile.

Oltre ad una soluzione di un'applicazione di start-up che chiama ActivateDevice () sul driver, io sono perplesso su come ottenere questo driver per carico allo start-up.

Trovo molto strano che funziona in CE5 ma non in WM6, solo che non so di qualsiasi altra cosa che potrebbe essere la causa problemi.

Qualcuno ha qualche ulteriori suggerimenti che possono essere provati.

Tutto l'aiuto ha apprezzato.

È stato utile?

Soluzione

Sono più familiarità con Windows CE, ma qui ci sono un paio di cose:

  • Hai aggiungere una stampa di debug nella funzione DllMain per vedere se si chiama?
  • Hai controllato per una pausa di dipendenza. Potrebbe essere che in qualche modo si dispone di una DLL disponibile sotto CE 5 che non c'è sotto WM6?

Altri suggerimenti

Questa è una risposta, ma non quella 'giusta'. Si tratta semplicemente di un modo per aggirare il problema di caricamento. Ho capito questo più di una settimana fa, ma non ho voglia di usarlo come la soluzione. Quindi questo è si spera solo una correzione temporanea.

Il codice seguente viene utilizzato per caricare il driver manualmente, il suo scritto in C # utilizzando le chiamate C ++, sono abituato a C #, che è il motivo per cui ho fatto un C # non progetto di un C ++ uno. Coloro che utilizzano C ++ sarà senza dubbio creare questa in C ++ app.

public class LoadDriver
{
    [DllImport("coredll.dll", SetLastError = true)]
    public extern static IntPtr ActivateDevice(string lpszDevKey, int dwClientInfo);
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern void SignalStarted( uint dw);

    public static void Main(string[] args)
    {
        Cursor.Current = Cursors.Default;
        IntPtr handle = ActivateDevice("Drivers\\BuiltIn\\A36D_GPS_COM", 0);
        if(handle != IntPtr.Zero)
        {
            Console.Write("Success");
        }

        if (args.Length > 0)
        {
            try
            {
                SignalStarted(uint.Parse(args[0]));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

Ora, al fine di far funzionare tutto questo ha bisogno di essere lanciato alla partenza, così ho aggiunto nelle chiavi di registro richieste.

"HKEY_LOCAL_MACHINE/init"
Launch62 = A36D_loaddriver.exe
Depend62 = "32 00"

"32 00" è quello di garantire che i carichi dopo la Shell32.exe

Ora la l'avvio del dispositivo, il driver viene attivato in Device.exe.

Per quanto riguarda la questione della firma / Registro di sistema, questo è ancora attualmente in esame.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top