驱动编写流程图(精炼)_第1页
驱动编写流程图(精炼)_第2页
驱动编写流程图(精炼)_第3页
驱动编写流程图(精炼)_第4页
驱动编写流程图(精炼)_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、struct platform_drigr s5pcl00_adc_driyer = .probe = | s5pcl6o_adpr 岳叩.name = Ms5pcl00-adcife ¥ platf orm_de vice *1 % 个 IORESOURCE_MEM 资擦: res_mem = platformgetresoupdev, IORESOURCE_MEM? 0); 获Wplatform.device U!第:个IORESOURCERQ资源; resjrq = platformesourcefpdev, I0RES0URC6JRQ, 1); 映易adt奇存器物理區为内核的

2、虚拟堆址:adcbase = ioremapfresmemstart, resmem-nd - res_mem->start); 向石核中iAadc山断资艇 注册adc屮赵理旳数顶半应ret = requestq(re$rq>start,| ack interrupt, |4«¥=CiSABLED, ”adc”,NULL); 注册字符设备: registerchrdevregionldevno, number_of_device, ”ack') 初始化辻JWcdev:cdev_init(&cdev, &s5pclOO_ad jfops);

3、 cdev.owner = THIS.MODULE; ret = cdev add(&cdev, dev no z number_of device); 获紂adW亍钟控制结构体.井IHJjdcHf+: elk = clk_get NULL, "adn; clk_enable(clk);return IRQ_HANDLED;模块川战函故:static int _init sSpclOOm 75jnit(void)return i2jadd-driver( I&lm75_driyerhstatic struct fileoperations Im75_fops = .o

4、wner = THIS_MODULE,-jlm75_readj .open = Im75_open, .release = Im75eleas©;static int Im75_read_value(struct i2c_dient -client)支持include <linux/module.h> include <linux/kemel.h> include <linux/init.h> include <linux/fs.h> include <linux/cdev.h> include <linux/i2c.

5、h> 稈include <linux/slab.h> 務include <asm/uaccess.h>初始化cdev结 <rfite_opertionsrdpjdjalp划 & 叶75芮);struct i2c_msg msgs2; int status;char bufl2;char buf2 ;第个河息的长度: msgsO.len = 1; 器件堆址: msgsO.addr = client->addr; 写入数据: msgsO.flags = O;/write 消息缓冲区: msgsO.buf = bufl; 消总怪片内地址0X00: m

6、sgs0.buf0 = 0x0: 第:个河息ffJKtt: msgsl).len = 2; 器件炮址: msgsl.addr = client->addr;msgsl.flags = i2C_M_RD;/read息的级冲衣:' msgsl.buf = buf2; 发送河息: status = i2cansfQr(dient>adapter, msgs, 2);返回:return (buf20 « 8) | buf2l; b>二T卄J4.yh” <<j w 4” w j w ify W :Ai*><F.*亠7Z CXC: k JB7&q

7、uot; 3 «M .:k Y = K“ rre.L 二 <5=°.%S*f % *" >l»«4ew <« 一*r<*s比:以"员k4«rv*ee mm ”iT 7*. I.mm ”7*. 5tat: = :Cc_re»xster_adaptex'adap): icagr xkxesut = HZ:urztzre ka ”. ;:c这.frit?- »rl: SMP- S SUS = 一 :丨xcap- &ev. tz?c = 4i2c.sGaptcr_

8、t7PCxcs = devicc_rctxztcr Icirj- icv : Ixtrxi 2:jde*xfo ( xr*ct llitjxit llrt: U? Jus: xtr*ct 2:j>x< jsfo U<x<_uc::ruct tus.tTje iZc.Ous.t/pe = .Z£D«=士 c".-aitcb=12c_devicejxa:ch.pi*=12c.device_proe.reoyre=12c_device_rexove.=12c.device_51ntfl3Tn.R=fii2c_deviceja_op5.);-LXS

9、TJCmD '_12c.boareL115:>:L iCz.scarCtf-li»t-£ss,_cach_cn .£ <cc»insa- zxnus =s setter- nr dtv.czr litdeptCT- £cv, "Ctx t exeatec tdiptcx. fcicvinf©- bccrduiafoIc.ner.aevice :rxtadap. struct :Zc tinfo)cl,ent = X:alloc(51:eof cliext. CTPJZZOTLi: i|'i/jdl

10、nt* dlen:- cllen:- dlen:- dlen:- dlen:-a flap: er = a flap: fiev. pla:forseata = :fo- platfcrx_da:a: flas: = info- flijs: afifir = info- Sir:Ixq = lnfo->lr:oarOlnfo const:us_fcr_each_drv - t12c_t>us_t>-pe. NVLL. sfi&p. « r»ce:s_xev.ai3ipTeri:strlcpyicllen:- pase. =o-21:eof(cli

11、ent- naxe)::dlen:- Oev. bus 彳 McjDctRe |dlen:- dev. type = iCc.cLiext.tTe;dev-:e:_nasei4cllen:- eer.l:c_adapter_ld'adap), client- afifir>:staxus = aevice_re515ter icliezt- dev;little itt eccx:r»s«trT x*:t «»:c.cr;vcz *1 y &«<uttu lit :2«.u.&i4_»4S

12、7:cr stsxxt tic.eivcz 'tomr. stsxxty结驱动程序编写流程:模块加载函数;static int _init s5pcl00_led_init(void)static struct file_operations s5pcl00_led_ops = o wner> static int s5pcl00Jed_open(struct inode *inode, struct file *file);生成设备号;MKDEV(led_majorz led_minor);注册设备号,设备号名;register_chrdev_region(devno, 1,

13、"s5pcl00_led");初始化cdev,结合file operti ons;cdev_init( &Cdevz&s5pcl00 led ops注册cdev,设备号; cdev add(&cdev, dev no, 1);.ope n .release .ioctlTHIS_MODULE, s5pc200ed_ope n, s5pclOO led closi7 s5pcl00_ledo ctl 卞GPIO初始化为IO模式;lednit();返回:return 0;static int s5pcl00_led_ioctl(struct inode

14、*inode, struct file *file, unsigned int cmd, unsigned long arg)switchlcmdstatic void led_init(void)writel(readl(S5PC100_GPG3_BASE) & 0xF) | 0x1, S5PC100_GPG3_BASE); static void led_ on (void)case LED ON:led_on();break;case LED_OFF:led_off();break;default: break;writel(readl(S5PC100_GPG3_BASE + 4

15、) | 0x1), S5PC100_GPG3_BASE + 4); static void led_off(void)writel(readl(S5PC100_GPG3_BASE + 4) & 0xl)z S5PC100_GPG3_BASE + 4); r返回:return 0;返回:return 0;向内核注册设备号register_chrdev_region(设备号,连续申请儿个设备号,设备号名称)cdev初始华;丨+cdev_init(cdev 结构体指针, file_opertions 结构体指针);向内核注册cdev结构;cdev_add( cdev结构体指针,设备号,连续注

16、册儿个次设备)初始化信号量为“1” ; 用于资源尹发访级控制;semanit( &Sem *初始花读等待队列头;init_waitqueue_head( |&r_wait |4r 初跖化写等待丛列头;一init_waitqueue_head( |&w_wait )7结束struct cdev cdev;struct file_opertions fops = .owner = THIS_MODULE, .read = xxx_read, .wirte = xxx_write,.ope n = xxx_ope n, .releasy = hello_release, .p

17、oll = globalfifo_poll, ;'waitstatic unsigned int globalfifo_poll( struct file *filp, poll_table获得信号量;dow n(&sem);&r wait wait Y,驱动增加等待队列到poll table结构 poll_wait( filp,poll_wait( filp,一wait一if (丧备可读)mask | = POLLIN | POLLRDNORM;/*标示数据可获得*7 if (设备可写)mask |=POLLOUT | POLLWRNORM;/*标示数据可写入*/ 释

18、放信号量;up(&dev->sem);返回设备状态,给轮询的进程;return mask;rexumO;static int _init s3c64xx_spi_probe(struct platform_device *pdev)SpLdrvier注册过程static struct spi_drivQm25pl0a_griver = master = spi_alloc_master(&pdevxkv, sizeof(struct s3c64xx_spi_dnver_data);master->bus num = pdev-xd; master->setup

19、 = s3c64xx_spi_setup; master->transfer = s3c64xx_spi_transfer; master->num_chipselect = sci-x)um_cs; masterdmaalignment = 8;spi_register_driver( | &m25pioa,driver 十 sdrv->driver.bus = if (sdrv->probe) sdrv->be = | spi_drv_probe; if (sdrv->remove)sdrv->driver.remove

20、 = spi_drv_remove;&spi bus type; I.probe = I m25plOa_probe, .remove = m25pl0a_remove, .driver = .name = m25plOa,spiegister_master(master)> deviceaddfmaster-xiev);> static UST_HEAD(boardist);driver_register(&sdrv->driver);struct bus_type spi_bus_type = .name .dev_attrs .matchispi:=sp

21、i_dev_attrs,=spi_match_device,.uevent=spi_uevent,.suspend=spi_suspend,.resume=spi_resume,结束scan_boardinfo(master)(ii5t_for_each_entry( bi, | &bonrd.lbt. | l/t ) fstruct sp»_00Br(3jnfo = ”>ooard.ro; urtsnedn;for (n bhn.y d.rrto; n> 0;rv. chip+f)( <f(<hip->bu5_num != nw5ter->

22、;Ou5_nurH) continue:Other = driver_find(drv->name, drv->bus); 黃看drivers否被注册过了如果注册了.返町EBUSY; bus_add_driver( Struct device_driver drv);|vo>d) sp new devicem82terf chip);driver_attach(Struct device_driver drv);struct spi_cer.ce *spi.nejievruct spimaster master, struct 5pi_boBrc_mfo chipnroxy

23、= %p B”oc_cevce(rrater); t| i 讷 sp_devicestatus = spiadddeviceproxjj;- device_ocd(3piAcle¥);static int spi_drv_probe(struct device 4dev)const struct spi_drigr sdrv 二 to_spi_driveqdzAReturn I sdrv->pfobe(to_spi-device(dev); "i river);bus_for_each_dev( drvbus, NULL, drv, | _driverattach )

24、;为drv,历诉有deQ:试匹砒人体匹配冇何调卜焉数_drive jauach完成_driver_attach(struct device *dev, void data);driver_match_device(stnjct devicedriver *drvz struct device *dev)return drv->bus->match ? drv->bus->match(dev, drv): 1; drv->probe(dev);调用 platfbrm.driver->be(dev)函数:并JL传入dev給构。 3S 4ywx

25、»! VUiXUL 屮八GU (tiy uy* *%<*«* rMM Met, *.«<*.Me tfnxi 叽"* rv;如m»"a«r pros* nv-noN «»xn®c«nv.neN «»xn®r. qaaogftMHUMX24.“2Q.ECPM.FIBTW aTTk2?oUla*.ilHX三三Qf t tjM 2t<9 l» L!«)»«|irM*MW. 0、;AxM«*fl并

26、3 C'/MlNfflW. |l«n<MQIt. «AB«RnV9-t»TrSe4>MM、DhSHThM*. «e>W rw» K<<l. OOJMl.QC*-r,VA< H>JM|uaxr<U.比卩">j|2 3.疋 l,dwSWAVtsa vaiuarn, a uMcaui 'i i2竟運 GUd atrMwww« 8|“3 tu« 11 »m »r.J» «aJ i(1 lieAMfa4MA

27、>|tW(|,UK- w . dwSWi5mta?K«. *3 3.WI,27TJFGU;1 a tram tar I* b tiluju Z27(力杓TW9hI5n>3< rt n2Sp】C*.rM<| irut nTSlte efUir. WT.tfw% tMtoac治r 0卄<!“町 aq>/BWrxAA 金賈冲")5.町0叶30乂w.a 3M$J 7. C-* *' > * irwwW r t<l(U.teNUt2斥肿匕4, (HkneiM,Gar<dM入 ,rMut“ 3M Av4< aK.sa冷

28、w?冷工 f u/.a A61f tw.a At imzizzaiii “nnJ A IT X»C"U CA«OJVUb_»WW.2 伽 |1(>"“如2 溯 刽3“<"3 w/nur?jrmjj?r. w"思kQirWK.«-H “M 丄fW»xr»4li. CMl.MrtjWMA 、Zs ua ><rrf. 1 klt.y irt fMd.ufanjct nJ*Ha负金冷 nitwit r«TiMi 9lt_thMV»adytMb>g &am

29、p;cod«. I, IX"ToQVr.»*K/nit*>* lM>*xr*4.3Q”*a»jng vuft»/A»«(Rieii»Arn tou>ur4tl|«rwi»>t« vuft*/A»«(RieM*i«4rn teu>ur4p|>fm»a «»»«»( rum iMtrn tM»X«4ppr*M.xnc- 化MT4 tWrMsftr

30、M Ifjn »<返I叫 return 0;应用程序编写流程结束static Struct net_device vnetdev;«tindude <8inux/module/i> itindude dnux/ermo.h> ttindude <inux/netdevice.h> ttindude <anux/etherdetice.h> ttindude <flnux/kemel.h> ttindude <flnux/types.h> itindude <anux/fcnti.h> ttindude <inux/interrupth> ttindude <ftnu/ioportn> itindude <anux/in.h> itindude <anux/s*i>u

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论