mboost-dp1

Dumt C spgsml....


Gå til bund
Gravatar #1 - Qw_freak
10. maj 2012 08:55
hey, jeg har en struct hvori denne entry er:

void		*platform_data;


en pointervoid i en struct wtf?????
Gravatar #2 - sgt.borup
10. maj 2012 08:57
wat ? I'm gonna bump this one.
Gravatar #3 - Qw_freak
10. maj 2012 09:02
filen er foriøvrigt "device.h" i kernel/include/linux/

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);
};
Gravatar #4 - lorenzen
10. maj 2012 09:16
Hvad er dit spørgsmål helt præcist?
Gravatar #5 - kasperd
10. maj 2012 09:17
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å.
Gravatar #6 - Qw_freak
10. maj 2012 09:20
lorenzen (4) skrev:
Hvad er dit spørgsmål helt præcist?


sorry, det er nok hvad jeg skal gøre med den fra den driver jeg arbejder på... men kasperd har gjort det klart...

#5
Takker... :)
Gravatar #7 - Qw_freak
11. maj 2012 07:54
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
Gravatar #8 - Mamad (moveax1ret)
11. maj 2012 08:10
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.
Gravatar #9 - kasperd
11. maj 2012 08:35
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
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.

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.

Mamad (moveax1ret) (8) skrev:
er mxc_irda_dev en struct du selv opfinder?
Det er en variabel. Structen hedder device.

Mamad (moveax1ret) (8) skrev:
det . skal væk
Det er da gyldig C99 notation.
Gravatar #10 - arne_v
11. maj 2012 12:54
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.

Opret Bruger Login