驅(qū)動編寫流程圖(精煉)_第1頁
驅(qū)動編寫流程圖(精煉)_第2頁
驅(qū)動編寫流程圖(精煉)_第3頁
驅(qū)動編寫流程圖(精煉)_第4頁
驅(qū)動編寫流程圖(精煉)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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奇存器物理區(qū)為內(nèi)核的

2、虛擬堆址:adcbase = ioremapfresmemstart, resmem-nd - res_mem->start); 向石核中iAadc山斷資艇 注冊adc屮趙理旳數(shù)頂半應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;模塊川戰(zhàn)函故: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; 寫入數(shù)據(jù): msgsO.flags = O;/write 消息緩沖區(qū): msgsO.buf = bufl; 消總怪片內(nèi)地址0X00: m

6、sgs0.buf0 = 0x0: 第:個河息ffJKtt: msgsl).len = 2; 器件炮址: msgsl.addr = client->addr;msgsl.flags = i2C_M_RD;/read息的級沖衣:' msgsl.buf = buf2; 發(fā)送河息: 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結驅(qū)動程序編寫流程:模塊加載函數(shù);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;向內(nèi)核注冊設備號register_chrdev_region(設備號,連續(xù)申請兒個設備號,設備號名稱)cdev初始華;丨+cdev_init(cdev 結構體指針, file_opertions 結構體指針);向內(nèi)核注冊cdev結構;cdev_add( cdev結構體指針,設備號,連續(xù)注

16、冊兒個次設備)初始化信號量為“1” ; 用于資源尹發(fā)訪級控制;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,驅(qū)動增加等待隊列到poll table結構 poll_wait( filp,poll_wait( filp,一wait一if (喪備可讀)mask | = POLLIN | POLLRDNORM;/*標示數(shù)據(jù)可獲得*7 if (設備可寫)mask |=POLLOUT | POLLWRNORM;/*標示數(shù)據(jù)可寫入*/ 釋

18、放信號量;up(&dev->sem);返回設備狀態(tài),給輪詢的進程;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:試匹砒人體匹配冇何調(diào)卜焉數(shù)_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);調(diào)用 platfbrm.driver->be(dev)函數(shù):并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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論