Qu’est-ce que platform_get_resource dans le pilote Linux?

Quelqu’un peut-il s’il vous plaît expliquer pourquoi et comment utiliser la fonction platform_get_resource ?

J’ai vu que IORESOURCE_MEM est utilisé à plusieurs endroits, comme celui ici , en second paramètre, qu’est-ce que cela signifie?

J’ai parcouru les liens ci-dessous mais je n’ai pas pu obtenir la bonne explication.

  • http://lwn.net/Articles/448499/
  • http://www.gnugeneration.com/books/linux/2.6.20/kernel-api/re720.html

platform_get_resource() est utilisé dans la fonction __init d’un pilote pour obtenir des informations sur la structure de la ressource du périphérique, comme l’adresse de début et l’adresse de fin, afin de trouver la taille de la mémoire de ressources.

la déclaration de la fonction platform_get_resource est la suivante

 struct resource * platform_get_resource ( struct platform_device * dev, unsigned int type, unsigned int num); 

Le premier paramètre indique à la fonction quel périphérique nous intéresse, de manière à pouvoir extraire les informations dont nous avons besoin.

Le second paramètre dépend du type de ressource que vous manipulez. Si c’est de la mémoire (ou tout ce qui peut être mappé en tant que mémoire :-)) alors c’est IORESOURCE_MEM. Vous pouvez voir toutes les macros à include / linux / ioport.h

Pour le dernier paramètre, http://lwn.net/Articles/448499/ dit:

Le dernier paramètre indique quelle ressource de ce type est souhaitée, zéro indiquant la première. Ainsi, par exemple, un conducteur pourrait trouver sa deuxième région MMIO avec:

 r = platform_get_resource(pdev, IORESOURCE_MEM, 1); 

La valeur de retour est un pointeur sur un type struct resource var.

Voici un exemple

 unsigned long *base_addr; /* Virtual Base Address */ struct resource *res; /* Device Resource Structure */ unsigned long remap_size; /* Device Memory Size */ static int __devinit bram_io_probe(struct platform_device *pdev) { res = platform_get_resource(pdev, IORESOURCE_MEM, 0); // get resource info remap_size = res->end - res->start + 1; // get resource memory size base_addr = ioremap(res->start, remap_size); // map it }