Siège de l'analyse syntaxique lion pour l'horloge enregistrement et Shu (a)

Lorsque nous écrivons ou modifions la conduite, souvent rencontrent des problèmes liés à l'horloge, je ne sais pas où commencer. Ici, dans la version 3.0.35 exemple noyau i.MX6 comment obtenir et utiliser l'horloge.

La façon la plus courante pour obtenir l'horloge
❶ acquisition par nom
, par exemple: Get horloge CLKO

CLKO = clk_get (NULL, "clko_clk");

❷ acquis par l'appareil
, par exemple, l'horloge d' entraînement est une interface audio de ssi admissible,

SSI> = clk clk_get (& pdev-> dev, NULL); // nom du périphérique est "IMX-ssi"

Nous pouvons toujours vérifier comment est obtenu en regardant le prototype de la fonction de clk_get

struct clk clk_get (struct dispositif dev, const char * CON_ID)

{

    const char *dev_id = dev ? dev_name(dev) : NULL;

     return clk_get_sys(dev_id, con_id);

}

Nous continuons à voir la fonction clk_get_sys, cette fonction pour obtenir l'horloge par le nom de l'équipement ou le nom de l'horloge

struct clk clk_get_sys (const char dev_id, const char * CON_ID)

{

     struct clk_lookup *cl;

     mutex_lock(&clocks_mutex); 

     cl = clk_find(dev_id, con_id);

     if (cl && !__clk_get(cl->clk))

             cl = NULL;

     mutex_unlock(&clocks_mutex);

     return cl ? cl->clk : ERR_PTR(-ENOENT);

}

Cette fonction appelle clk_find obtenir l'horloge de trouver en fonction du nom du périphérique et le nom de l'horloge dans la liste d'horloge, et le retour pour obtenir l'horloge.

statique struct clk_lookup clk_find (const char dev_id, const char * CON_ID)

{

     struct clk_lookup *p, *cl = NULL;

     int match, best = 0;

     list_for_each_entry(p, &clocks, node) {

             match = 0;

             if (p->dev_id) {

                     if (!dev_id || strcmp(p->dev_id,dev_id))

                             continue;

                     match += 2;

             } // 先找设备名

             if (p->con_id) {//再找时钟名

                     if (!con_id || strcmp(p->con_id,con_id))

                             continue;

                     match += 1;

             }

             if (match > best) {

                     cl = p;

                     if (match != 3)

                             best=match;

                     else

                             break;

             }

     }

     return cl;}

l' horloge d'enregistrement
mentionné le nom de l' horloge d'acquisition, l'horloge de la liste dans une liste selon le nom de l' appareil d'horloge ou de l' horloge est de savoir comment généré.

Nous appelons la fonction d'initialisation d'horloge dans le fichier d'initialisation au niveau du conseil i.Mx6 à l'intérieur.

__init vide statique mx6_sabresd_timer_init (void)

{

     struct clk *uart_clk;

#ifdef CONFIG_LOCAL_TIMERS

     twd_base = ioremap(LOCAL_TWD_ADDR,SZ_256);

     BUG_ON(!twd_base);

#fin si

     mx6_clocks_init(32768, 24000000, 0, 0);

     uart_clk = clk_get_sys("imx-uart.0", NULL);

     early_console_setup(UART1_BASE_ADDR, uart_clk);

}

Nous voyons la fonction mx6_clocks_init

int __init mx6_clocks_init (unsigned long ckil, osc unsigned long,

     unsigned long ckih1, unsigned long ckih2)

{



     for (i = 0; i < ARRAY_SIZE(lookups); i++){

             clkdev_add(&lookups[i]);

             clk_debug_register(lookups[i].clk);

     }

....

}

Regardez à l'intérieur du tableau de fonction a décidé lookups combien horloge

statiques clk_lookup lookups struct [] = {

 ……

_REGISTER_CLOCK ( "IMX-ssi.0", NULL, ssi1_clk),

     _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk),

     _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk),

_REGISTER_CLOCK (NULL, "clko_clk", clko_clk),

......

}

définition clk_lookup

struct clk_lookup {

     struct list_head          node;

     const char                *dev_id;

     const char                *con_id;

     struct clk                *clk;

};

affectation clk_lookup

#define _REGISTER_CLOCK (d, n, c) \

     { \

             .dev_id = d, \

             .con_id = n, \

             .clk = &c, \

     }

Regardez la fonction clkdev_add

vide clkdev_add (struct clk_lookup * cl) {

     mutex_lock(&clocks_mutex);

     list_add_tail(&cl->node, &clocks);

     mutex_unlock(&clocks_mutex);

}

Ainsi, nous pouvons trouver la fonction d'horloge mx6_clocks_init dans les tableaux de recherches, tous ajoutés à la liste dans les horloges. On obtient alors l'horloge définie par la première étape de la méthode lookups.

Je suppose que tu aimes

Origine blog.51cto.com/14771178/2485915
conseillé
Classement