Question

Nos systèmes embarqués programmeur a développé la coquille d'un pilote de port série virtuel pour notre matériel mobile, et je comblons les méthodes pour l'obtenir au travail. Le pilote fonctionne comme prévu, il simule un port COM pour un périphérique USB qui est crachant des chaînes NMEA (données GPS).

type I WM6 pour faire court, mais le système d'exploitation est WM6.1 si cela fait une différence.

Le problème que j'ai est que le pilote ne se charge pas au démarrage de l'appareil sur WM6 uniquement. Le pilote a été développé pour les CE5 et WM6, mais CE5 le conducteur « ne » charge au démarrage, qui me pointe vers un problème de configuration WM6. Il vaut peut-être noter à ce stade que le pilote se charge dans la méthode WM6 et CE5 en utilisant ActivateDevice (), ce que je l'ai utilisé jusqu'à présent pour WM6, une petite application de test pour lancer le pilote afin que je puisse au moins tester le pilote travaille sur WM6.

Le registre est déjà rempli avec les clés nécessaires pour le démarrage du pilote. Ainsi, le pilote doit charger au démarrage sans aucun problème. HKEY_LOCAL_MACHINE \ Drivers de BuiltIn contient une sous-clé A36D_GPS_COM, et cette clé est contenue.

DeviceArrayIndex: 0

DeviceType: 0

dll: A36D.dll

Drapeaux: 0

Nom: A36D GPS COM Port

Indice 8

Ordre: 3

Prefix: COM

Priorité: 0

Priorité: 256

D'après ce que je peux dire qu'il ya généralement 2 réponses communes à cette question que je l'ai déjà étudié. Ces idées me ont été données par le programmeur intégré, mais je l'ai étudié comment les faire moi-même.

1) Le port COM est déjà utilisé lorsque le conducteur tente de charger, même si ce port COM est finalement libre une fois que le dispositif est chargé. Je l'ai changé la valeur de l'indice dans le registre entre 1 à 20 et redémarré l'appareil et le pilote ne se charge pas sur un port COM spécifié. Donc, pour essayer de le tester plus à fond, je l'ai déplacé à un autre appareil de COM9 à COM8 et déplacé mon chauffeur à COM9 (en utilisant les paramètres de Registre ci-dessus). Les autres charges de pilote de périphérique au démarrage sur COM8 mais heureusement mon tout pilote de périphérique ne démarre pas sur COM9. J'ai même essayé de peaufiner les autres paramètres, mais encore il ne se charge pas au démarrage.

2) Une autre questions possibles et les différences entre CE5 et WM6 est la sécurité. Donc, en utilisant l'article MSDN http://msdn.microsoft.com/en-us /library/bb737570.aspx Je travaille à la signature et l'approvisionnement XML. En utilisant une clé privilégiée (non expiré), Le A36D.dll est signé en studio visuel et le fichier d'installation CAB créé est également signé avec la même clé. Un fichier _setup.xml est créé et ajouté au fichier de la cabine pour que la clé signée est ajoutée au magasin de certificats. Le fichier CAB est signé à nouveau avec la même clé pour assurer qu'elle est toujours valide. En outre, le _setup.xml est emballé dans son propre fichier .CPF. L'ACR et les fichiers du PCF ajoutent la clé des magasins de certificats « HKEY_LOCAL_MACHINE \ Comm \ Security \ SystemCertificates » Sache donc cela fonctionne. En prudence, je l'ai installé à FAVORISÉS sans droits, ROOT et magasins de certificats SPC. Mais le pilote de périphérique ne se charge toujours pas en Device.exe lorsque le périphérique démarre mobile.

Autre qu'une solution de contournement d'une application de démarrage qui appelle ActivateDevice () sur le conducteur, je suis perplexe sur la façon d'obtenir ce pilote à la charge au démarrage.

Je trouve cela fonctionne très étrange dans CE5 mais pas dans WM6, je ne sais pas de quoi que ce soit d'autre qui pourrait causer des problèmes.

Est-ce que quelqu'un a d'autres suggestions qui peuvent être essayées.

Toute aide appréciée.

Était-ce utile?

La solution

Je suis plus familier avec Windows CE, mais voici quelques choses:

  • Avez-vous une impression ajouter debug dans la fonction DllMain pour voir si elle est appelée?
  • Avez-vous vérifié une pause de dépendance. Serait-ce que vous avez en quelque sorte une dll disponible sous CE 5 qui ne sont pas là sous WM6?

Autres conseils

Ceci est une réponse, mais pas celui « droit ». Il est simplement un travail autour de la question de chargement. Je me suis dit ceci il y a plus d'une semaine, mais ne voulait pas l'utiliser comme solution. Donc, c'est, espérons juste une solution temporaire.

Le code suivant est utilisé pour charger le pilote manuellement, Il est écrit en C # en utilisant les appels de C, je suis habitué à C # qui est la raison pour laquelle je l'ai fait un projet C # pas C ++ un. Ceux qui utilisent C ++ sera sans aucun doute créer cela dans une application C ++.

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);
            }
        }
    }
}

Pour que cela fonctionne, il doit être exécuté au démarrage, donc j'ajouté dans les clés de Registre requises.

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

"32 00" est d'assurer qu'il charge après la Shell32.exe

Maintenant, le démarrage du dispositif, le conducteur est activé dans Device.exe.

En ce qui concerne la question signature / registre, cela est encore à l'étude.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top