mboost-dp1
Dumt C spgsml....
- Forside
- ⟨
- Forum
- ⟨
- Programmering
filen er foriøvrigt "device.h" i kernel/include/linux/
hele struct'en:
hele struct'en:
struct device {
struct device *parent;
struct device_private *p;
struct kobject kobj;
const char *init_name; /* initial name of the device */
struct device_type *type;
struct mutex mutex; /* mutex to synchronize calls to
* its driver.
*/
struct bus_type *bus; /* type of bus device is on */
struct device_driver *driver; /* which driver has allocated this
device */
void *platform_data; /* Platform specific data, device
core doesn't touch it */
struct dev_pm_info power;
#ifdef CONFIG_NUMA
int numa_node; /* NUMA node this device is close to */
#endif
u64 *dma_mask; /* dma mask (if dma'able device) */
u64 coherent_dma_mask;/* Like dma_mask, but for
alloc_coherent mappings as
not all hardware supports
64 bit addresses for consistent
allocations such descriptors. */
struct device_dma_parameters *dma_parms;
struct list_head dma_pools; /* dma pools (if dma'ble) */
struct dma_coherent_mem *dma_mem; /* internal for coherent mem
override */
/* arch specific additions */
struct dev_archdata archdata;
#ifdef CONFIG_OF
struct device_node *of_node;
#endif
dev_t devt; /* dev_t, creates the sysfs "dev" */
spinlock_t devres_lock;
struct list_head devres_head;
struct klist_node knode_class;
struct class *class;
const struct attribute_group **groups; /* optional groups */
void (*release)(struct device *dev);
};
Som navnet og kommentaren forklarer, så peger pointeren på nogle platformsspecifikke data. Derfor kan det ikke angives i definitionen af denne struct hvad det er den peger på, da det afhænger af hvilken platform det er. Det er ganske almindeligt at bruge void pointere til den slags.
Der vil sikkert være nogle platforme hvor pointeren aldrig bruges. Den bør i så fald sættes til NULL når denne struct initialiseres, og så aldrig røres igen.
På platforme hvor pointeren bruges er du nødt til at kigge på den platformsspecifikke kode for at finde ud af hvad pointeren peger på.
Der vil sikkert være nogle platforme hvor pointeren aldrig bruges. Den bør i så fald sættes til NULL når denne struct initialiseres, og så aldrig røres igen.
På platforme hvor pointeren bruges er du nødt til at kigge på den platformsspecifikke kode for at finde ud af hvad pointeren peger på.
er mxc_irda_dev en struct du selv opfinder?
struct mxc_irda_dev {
void* platform_data ;
};
det . skal væk, , ligeså, og platform_data er altså bare et variabel navn, ikke en datatype, datatypen er stadigtvæk void.
struct mxc_irda_dev {
void* platform_data ;
};
det . skal væk, , ligeså, og platform_data er altså bare et variabel navn, ikke en datatype, datatypen er stadigtvæk void.
Syntaktisk set ser den kode rigtig nok ud. Men at initialisere .platform_data uden at initialisere en helt masse andet er ikke den rigtige måde at gøre det på, selvom det måske kan compileres.Qw_freak (7) skrev:Mere spørgsmål
Min driver skal nu benytte sig af netop platform_data. hvordan angiver jeg den i min struct??static struct device mxc_irda_dev = {
.platform_data = NULL ,
};
virker ikke
Du bør tage et kig på hvordan andre drivere gør. Jeg ved ikke nok om device driver kode til at fortælle dig, hvem der er ansvarlig for initialisering af den struct.
Det er en variabel. Structen hedder device.Mamad (moveax1ret) (8) skrev:er mxc_irda_dev en struct du selv opfinder?
Det er da gyldig C99 notation.Mamad (moveax1ret) (8) skrev:det . skal væk
Et eksempel på brug af void pointer:
#include <stdio.h>
enum one_or_other { ONE, OTHER };
struct many_things
{
char *name;
enum one_or_other what;
void *something;
};
struct one_thing
{
int iv;
};
struct other_thing
{
double xv;
};
void dump(struct many_things *o)
{
struct one_thing *ont;
struct other_thing *ott;
printf("name=%s\n", o->name);
switch(o->what)
{
case ONE:
ont = o->something;
printf("iv=%d\n", ont->iv);
break;
case OTHER:
ott = o->something;
printf("xv=%f\n", ott->xv);
break;
default:
/* we should do something bad here */
;
}
}
int main()
{
struct many_things a, b;
struct one_thing a2;
struct other_thing b2;
a2.iv = 123;
a.name = "A";
a.what = ONE;
a.something = &a2;
dump(&a);
b2.xv = 123.456;
b.name = "B";
b.what = OTHER;
b.something = &b2;
dump(&b);
return 0;
}
Gå til top
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.