Moblin: Hvordan skrive en plugin for din Driver

Forfatter Moblin DocumentationJuly 1, 2009, 00:21

Du vet kanskje det ikke er en standard driver delsystem for sensor som HID eller input system. Jonathan Cameron [Denne e-postadressen er beskyttet mot programmer som samler. Du må aktivere Javascript for å kunne se] kjemper for å sjekke hans iio (industri I /O) til oppstrøms, som er en driver system for sensor. Jeg vet ikke datoen når kjernen aksepterer det, eller når sensor driver forfattere vil følge den, derfor vårt rammeverk har å jobbe med ulike drivere for lang tid. Dette er grunnen til at vi trenger en driver plugin system.

Nåværende pulgin system-koden er bare et inital versjon eller med andre ord en prototype. Imidlertid er den grunnleggende skjelett klar, du kan strekke det for din virksomhet. Flekkene er alltid weclome

Skriv en modul er svært enkel i sensor rammeverket er bare to funksjoner nødvendig


GInt sf__init (SFModule * m);.. Tomrommet sf__exit (SFModule * m );


#SFModule struct definerer felt som kreves av sensor daemon, generelt bør du ikke direkte berører den. Uansett, kan noen av feltene inneholder nyttig info for din modul, pls treate dem som skrivebeskyttet. se nedenfor:

Twitter /** * SFModule: *name: Navnet på modulen. Det er gruppenavn i module.conf. * For eksempel, i prøven module.conf det er en [modul-als-simulator] * deretter modul-als-simulator behandles som modulnavn. *type: Type modul. se #ModuleType *userdata: plassering for modulen redde sitt private data. Du kan direkte * vurdere det. *gmodule: #GModule Struct. Ikke rør det *core: #SFCore. Ikke rør det *keyfile: #GKeyFile inneholder parametere av modulen. Pls bruke nøkkelfilen funksjon * sett glib å få parameter og ikke frigjøre den. *init: Peker til sf_init () til modulen. Ikke berør *exit: peker til sf_exit () til modulen. Ikke berør * /typedef struct _SFModule {¬ † ¬ † ¬ † gchar * navn, ¬ † ¬ † ¬ † ModuleType type; ¬ † ¬ † ¬ † gpointer brukerdata, ¬ † ¬ † ¬ † GModule * gmodule; ¬ † ¬ † ¬ † SFCore * kjerne; ¬ † ¬ † ¬ † guint indeksen; ¬ † ¬ † ¬ † GKeyFile * nøkkelfil; ¬ † ¬ † ¬ † ¬ † ¬ † SFModuleInit init; ¬ † ¬ † ¬ † SFModuleExit exit;} SFModule; Alle verkene til initailization skal være ferdig i sf__init () og returnere 0 for å indikere en suksess eller -1 for å indikere en mislykkes, sf__init () er ansvarlig for å frigjøre ressurser bevilget av seg selv i løpet av første periode i sin feil håndtaket. sf__exit () kalles når modulen losser, alle ressurser tildelt av modulen skal bli frigjort her.


Nåværende modulen kalles * driver moudle *, som betyr at det skal representere en sensor driver eller representerer en sensor i andre ord. Funksjonell modul vil bli introdusert senere hvis det er et reelt behov. Du kan opprette en struct av dere sensor, for eksempel:


struct my_accelerometer {¬ † ¬ † ¬ † ¬ † ¬ † SFSensorDev forelder; ¬ † ¬ † ¬ † ¬ † ..... ......};


#SFSensorDev er en forelder objekt for alle sensor structs, må det alltid satt som første element. sf_sensordev_new () er den funksjonen som er tildelt minne og initial #SFSensorDev for din struct, se nedenfor:

Twitter /** * sf_sensordev_new: *c: En #SFCore objekt. *type: #SFSensorType Indikerer type sensor *ops: Et sett av funksjoner som tilbys av modul for * forvaltning av rammeverket. se #DevOps *size: Størrelsen på #SFSensorDev å skape * * Opprett en ny #SFSensorDev struct. Størrelsen er angitt å tillate skape * struktur stammer fra #SFSensorDev som inneholder flere data størrelsen * bestått må være minst sizeof (SFSensorDev); * * Returnerer: En nyopprettet #SFSensorDev */¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† SFSensorDev * sf_sensordev_new (SFCore * c, SFSensorType type, DevOps * ops, guint størrelse);


forc, kan du finne #SFCore fra # SFModule- > kjerne. #SFType Definerer som nedenfor:


typedef enum {s¬ † ¬ † ¬ † TYPE_INVAILD = -1, ¬ † ¬ † ¬ † TYPE_MIN, ¬ † ¬ † ¬ † TYPE_ACCEL = 1, ¬ † ¬ † ¬ † TYPE_GRYO = 1 < < 1, ¬ † ¬ † ¬ † TYPE_THERMAL = 1 < < 2, ¬ † ¬ † ¬ † ¬ † TYPE_COMAPSS = 1 < < 3, ¬ † ¬ † ¬ † TYPE_ALS = 1 < < 4, ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † TYPE_MAX,} SFSensorType;


#DevOps bare har to funksjoner nå:


struct _DevOps {¬ † ¬ † ¬ † GInt (* dev_set_active) (SFSensorDev * se, DevActiveLevel nivå); ¬ † ¬ † ¬ † void (* dev_msg_process) (SFSensorDev * se, GInt kode, gpointer data, guint datalen, gpointer ret_val);};


dev_set_active () brukes til å aktivere /deaktivere sensoren. Handlingen av aktivering /deaktivering er modul bestemt at jeg ikke bryr meg. Pls tilbake 0 for å indikere en vellykket eller -1 når en feil skjer, men denne funksjonen må ikke sviktet. #DevActiveLevel Definerer som fulgte:

Twitter /** * DevActiveLevel: *DEV_STOP: Stopp å injisere data /arrangement *DEV_ACTIVE: Begynn å injisere data /arrangement * /typedef enum {¬ † ¬ † ¬ † DEV_STOP, ¬ † ¬ † ¬ † DEV_ACTIVE,} DevActiveLevel;


Merk at dev_set_active () er et obligatorisk requirment så pls alltid gi det siden du kan implementere som et tomrom funksjon.

dev_msg_process () er en del av modul kommunikasjon mekanisme. Rammeverk implementerer en kommunikasjonskanal basert på asynkrone køer av glib.


/*¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† ¬ † ¬ † ¬ † ¬ † * dev_msg_process:¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† ¬ † ¬ † ¬ † ¬ † *se: En #SFSensorDev object¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† ¬ † ¬ † ¬ † ¬ † *code: alternativ koden angir hvilke tiltak som bør være executed.¬ † ¬ † ¬ † ¬ † *data: data sendes inn av sender¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† ¬ † ¬ † ¬ † ¬ † *datalen: lengde data¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† ¬ † ¬ † ¬ † ¬ † *ret_val: et sted å lagre returverdi. Merk at memory¬ † ¬ † ¬ † ¬ † * bør tildeles etter avsender, så memcpy () returnerer til @ ret_val¬ † ¬ † ¬ † ¬ † * er ok.¬ † ¬ † ¬ † ¬ † * ¬ † ¬ † ¬ † ¬ † * Handle melding fra rammeverket eller annen modules.¬ † ¬ † ¬ † ¬ † * ¬ † ¬ † ¬ † ¬ † * < note > < para > ¬ † ¬ † ¬ † ¬ † * Sender kan kalle sf_asyncmsg_send_sync () for å sende en melding og block¬ † ¬ † ¬ † ¬ † * til et signal for ferdigstillelse er mottatt. Dette skjer vanligvis when¬ † ¬ † ¬ † ¬ † * avsender venter på en returverdi. Så ikke sove i dette funksjon † ¬ † ¬ † ¬ † * ellers hele rammeverket kan være blocked.¬ † ¬ † ¬ † ¬ † * < /para > < /note > ¬ † ¬ † ¬ † ¬ † * /¬ † ¬ † ¬ † void (* dev_msg_process) (SFSensorDev * se, GInt kode, gpointer data, guint datalen, gpointer ret_val); Her opiton kode er definert i sensor.h som:



typedef enum {¬ † ¬ † ¬ † MSG_EXIT_THREAD, ¬ † ¬ † ¬ † MSG_STREAM_REGISTER, ¬ † ¬ † ¬ † MSG_STREAM_UNREGISTERED, ¬ † ¬ † ¬ † /* ALS melding * /¬ † ¬ † ¬ † MSG_ALS_SET_RANGE, ¬ † ¬ † ¬ † MSG_ALS_GET_RANGE,} DevMsgCode;


For å legge til dine personlige kode, må du utvide denne opptellingen. Legg merke til at det er noen meldinger for rammeverk som modulen ikke bør bry seg om. På grunn av meldingskøen vil blokkere når det er ingenting å motta, må den kjøres i en individuell tråd. For å forenkle arbeidet, vil sf_sensordev_run_msg_process () være vegne i deg å lage tråd

Twitter /** * sf_sensordev_run_msg_process:. *se: En #SFSensorDev objekt * * Lag en tråd for å håndtere melding * /¬ † ¬ † ¬ † ¬ † ¬ † ¬ † void sf_sensordev_run_msg_process (SFSensorDev * se);


Denne funksjonen bør kalles i sf__init () siden din dev_msg_process () kan være NULL. Som nevnt før, er det noen meldinger håndteres av rammene selv, så uansett hva du bør ringe sf_sensordev_run_msg_process () i din sf__init ().

For å stoppe melding prosessen, ring sf_sensordev_stop_msg_process ().


/** * sf_sensordev_stop_msg_process: *se: En #SFSensorDev objekt * * Stopp melding prosessen og gjenvinne tråden. * /void sf_sensordev_stop_msg_process (SFSensorDev * se);


Du kan opprette tråden ved deg selv hvis det er noen ting i din modul må håndteres på en enkelt tråd. I dette tilfellet bør du direkte påberope sf_sensordev_process_msg () for å håndtere melding

Twitter /** * sf_sensordev_process_msg:. *se: En #SFSensorDev objekt *timeout: periode ut. En -1 indikerer blokkere inntil melding * blir tilgjengelige. * * Returnerer: 0 indikerer en MSG_EXIT_THREAD er kommet, det betyr at du bør * ​​avslutte tråden. 1 betyr å gå på håndtering av meldingen. * * /GInt sf_sensordev_process_msg (SFSensorDev * se, glong timeout);


Vennligst referer til modul-Accel-simulator.c å se hvordan du oppretter en tråd av deg selv til å behandle meldingen
<. p> For å sende en melding til modul, samtale sf_asyncmsg_send () eller sf_asyncmsg_send_sync (). se defintions:

Twitter /** * sf_asyncmsg_send: *q: En #GAsyncQueue objekt *code: En alternativ kode *data: data passere til mottaker *len: lengden på data * * Send en melding til eieren avq * * < note > < para > * Denne funksjonen sender melding i asynkron modus. * Sf_asyncmsg_send_sync () er den synkron versjon. * ≪ /para > < /note > * /void sf_asyncmsg_send (GAsyncQueue * q, GInt kode, gpointer data, guint len); /** * sf_asyncmsg_send_sync: *q: En #GAsyncQueue objekt *code: En alternativ kode *data: data videre til mottaker * @ len: lengde på data *ret_val: Sted å lagre returverdi. Avsender er ansvarlig for * tildeling og frigjøre minne. * * Send melding i synkron modus og bringe returverdi tilbake til * avsender hvis det er noen. * /void sf_asyncmsg_send_sync (GAsyncQueue * q, GInt kode, gpointer data,¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† guint len, gpointer ret_val); For #SFSensorDev er #GAsyncQueue # SFSensorDev- >. Henvendel


Det siste bruker rammeverk en auto-produsert header fil for å løse navnekonflikt fra sf__init () /sf__exit (). Legg inn header navn i src /Makefile.am som nedenfor:


SYMDEF_FILES = \\ ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † ¬ † modules/module-accel-simulator-symdef.h>-\\¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬† moduler /modul-als-simulator-symdef.h


Ok, til nå bør du ha en oversikt over hvordan du skal skrive en driver modul. Noen detaljer er ikke vist her, for eksempel hjelperen av valgdata. Som en kinesisk, skrive på engelsk er alltid en stor utfordring. Uansett, se eksempelkode er den raskeste måten å lære detaljer. Vennligst se modul Accel-simulator.c og modul-als-simulator.c. Og, patcher er alltid velkomne.

  • Sensor Work