Question

Actuellement, je développe le module de GPIO pour friendlyarm Linux 2.6.32.2 (mini2440). Je suis d'arrière-plan électronique et nouveau pour Linux.

Le module du noyau chargé au démarrage et le fichier de périphérique associé est situé dans /dev comme gpiofreq.

Dans un premier temps l'écriture de temps de fichier de périphérique, garrots broches GPIO en continu à 50 kHz. Au deuxième fois écrire arrêter le basculement. À la troisième fois, il recommence, et ainsi de suite.

Je l'ai écrit module de noyau séparé pour générer fréq. mais CPU se fige après fichier dispositif d'écriture à la première fois. L'invite est représentée, mais la borne, je ne peux pas exécuter une commande par la suite.

Voici le bout de code:

//calling function which generates continuous freq at gpio

static int send_freq(void *arg)
{
    set_current_state(TASK_INTERRUPTIBLE);
    for(;;)
    {
        gpio_set_value(192,1);
        udelay(10);
        gpio_set_value(192,0);
        udelay(10);
    }
    return 0;
}

Voici le dispositif d'écriture de code, qui démarrer ou arrêter avec toutes les données écrites dans le fichier de périphérique.

if(toggle==0)
{
       printk("Starting Freq.\n");
       task=kthread_run(&send_freq,(void *)freq,"START");
       toggle=1;
}
else
{
       printk("Operation Terminated.\n");
       i = kthread_stop(task);
       toggle=0;
}
Était-ce utile?

La solution

Vous faites une boucle infinie dans un thread noyau, il n'y a pas de place pour rien d'autre de se produire, sauf IRQ et peut-être autre thread noyau.

Ce que vous pouvez faire est soit

  • programme une minuterie sur votre matériel et faites votre broche dans le basculement d'une interruption

  • remplacer udelay avec usleep_range

Je suggère de faire chose progressivement, et à partir de la plage kHz avec usleep_range, et éventuellement de passer à Cust om timer + ISR

dans les deux cas, vous aurez probablement beaucoup de gigue, et de faire ce GPIO basculement peut être une bonne idée sur un DSP ou d'un PIC, mais est un gaspillage de ressources sur ARM + Linux, sauf si vous êtes matériel assisté par pwm capable moteur GPIO.

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