




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
編程能力(C語(yǔ)言input子系統(tǒng)CPU1)2)硬件的手CPU1嵌入式系統(tǒng)uC/OS-IICPU64位的各種系統(tǒng)上。.51版本之后,就通過(guò)了FAA認(rèn)證,可以運(yùn)行在諸如航天器等對(duì)安全要求極為苛刻 vxworks是這幾種實(shí)時(shí)系統(tǒng)中性能最好的一個(gè)也是比較貴的,主要用于商業(yè)領(lǐng)域和科研ThreadX是優(yōu)秀的硬實(shí)時(shí)操作系統(tǒng),具有規(guī)模小、實(shí)時(shí)性強(qiáng)、可靠性高、易于使用等特“hreadX實(shí)時(shí)操作系統(tǒng)完成。2005年8月12日,宇航局發(fā)射的火星探測(cè)器MRO,其關(guān)鍵任務(wù)仍由ThreadX實(shí)RTOS,ECOS由RedHat推出的小型實(shí)時(shí)系統(tǒng)(RealTimeOperatingSystem),最低編譯可小10KC++編寫。此系統(tǒng)和嵌入式LinuxTCP/IP協(xié)Cs命令行、輕型的多窗口。目前在國(guó)內(nèi)已經(jīng)有十多家企業(yè)在使用,從、數(shù)據(jù)到機(jī)械控NUT/OS是一個(gè)RTOSCUnixPOSIX規(guī)范,主要用于嵌入式領(lǐng)域,是業(yè)界公認(rèn)的X86平臺(tái)上最好的嵌入式實(shí)時(shí)系統(tǒng)之一,其應(yīng)用極廣,包含車載音樂(lè)和功能、核電站和無(wú)人駕駛Crusher的控制系統(tǒng),RIM公司的BlackBerryyBook,支持.netframwork。和winxp等系統(tǒng)同宗,開發(fā)使用EVC、VS,容易被開發(fā)者接受。后續(xù)有Windows6、WindowsPhone7等版本推出。SystemsRTOSPOSIX標(biāo)準(zhǔn),目標(biāo)標(biāo)準(zhǔn)化嵌入式系統(tǒng)。832位系統(tǒng)。2nandflash與norcpu連接方式nor以字節(jié)為單位nandnandnor只需要擦一個(gè)字節(jié)NAND器件需要對(duì)介質(zhì)進(jìn)行初始化掃描以發(fā)現(xiàn)壞塊,NAND器件時(shí),必須先寫入驅(qū)動(dòng)程序,NAND器件寫入信息需要相當(dāng)?shù)募记?因?yàn)樵O(shè)計(jì)師絕不能向壞塊寫入,這就意味著在NAND器件上自NOR閃存是隨機(jī)介質(zhì),用于數(shù)據(jù)量較小的場(chǎng)合;NAND閃存是連續(xù)介質(zhì),適合Nandflash型號(hào):K9K8G08U0B(K9GK9LMLC,以HYUUHYUVMLC)NORFLASH:一般幾十M,和指針一樣可以直接使用,最大不超過(guò)4G 問(wèn),一一對(duì)應(yīng),接口和內(nèi)存一樣,讀寫和內(nèi)存一樣.8Nandfah讀寫的本單位頁(yè)ag(512,2k4k) 若干個(gè)頁(yè)以拼成個(gè)(64pg),擦的基本位是塊當(dāng)寫入個(gè)頁(yè)時(shí)要先把這頁(yè)所在塊中的容的緩沖區(qū),把要寫入的頁(yè)修改,然后把這個(gè)塊擦除,最后回寫到塊中當(dāng)寫入一個(gè)塊的多個(gè)頁(yè)時(shí)要先把內(nèi)容到緩沖然后改各個(gè)內(nèi)容然后除這個(gè)最后寫這個(gè)塊。Nandflashpage2k64B64ALE:被拉高傳入的是地址CLE:被拉高傳入的是命令nRE:讀使能R/nBready/busyoutput傳命令通過(guò)8 Rising Falling 0xb0e0 MLCnandflashSLCnandflashTacls(命令或者地址鎖存) Control Commandb0e00008Addressb0e0000c b0e00010(閃存單元中存放電荷的部分然后利用不位(Level)的電荷,通過(guò)內(nèi)存的電壓控制精準(zhǔn)讀寫。MLC通過(guò)使用大量的電壓等級(jí),每一個(gè)單元兩位數(shù)據(jù),數(shù)據(jù)密度架構(gòu)可以有比較好的密度.而MirrorBit則是每個(gè)單元中只有4bit數(shù)據(jù)。SLC的技也是同樣容量,MLCSLC低很多的原因。讀寫速度:SLC的非常快,MLC的采用先進(jìn)工藝生產(chǎn)MLC閃存方面重重。隨著閃存技術(shù)的演進(jìn),在浮動(dòng)?xùn)?floatinggate)中的電荷總量減少了,使得檢測(cè)的信息變得更加,尤其是對(duì)MLC而言,它需要識(shí)別四個(gè)電壓值,而非兩個(gè)。NANDFLASH和NORFLASHIn1988NORflash技術(shù),EPROMEEPROM一NORNOR的特點(diǎn) ce),這樣應(yīng)用程序可以直接在flash閃存NOR的傳輸效率很高,1~4MB的小容量時(shí)具有很高的成本效益,但是很低的寫入和NAND結(jié)構(gòu)能提供極高的單元密度,可以達(dá)到高密度,并且寫入和擦除的速度也很快。應(yīng)用NAND的在于flash的管理和需要特殊的系統(tǒng)接口。flash器件的寫入操作只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡(jiǎn)單的,NOR則要求在0。NORNANDNAND的寫入速度比NOR快很多。NAND4msNOR5s快。NAND的擦除單元更小,相應(yīng)的擦除電路更少。NORflashSRAM接口,有足夠的地址引腳來(lái)尋址,可以很容易地存取其內(nèi)部的每一NAND器件使用復(fù)雜的I/O口來(lái)串行地存取數(shù)據(jù),各個(gè)產(chǎn)品或廠商的方法可能各不相同。8個(gè)引腳用來(lái)傳送控制、地址和數(shù)據(jù)信息。NAND512字節(jié)的塊,這一點(diǎn)有點(diǎn)像硬盤管理此類操作,很自然地,NAND的器就可以取代硬盤或其他塊設(shè)備。 問(wèn)題見于NAND閃存,NAND的供應(yīng)商建議使用NAND閃存的時(shí)候,同時(shí)使用EDC/ECC算法這個(gè)問(wèn)題對(duì)于用NAND多信息時(shí)倒不是致命的。當(dāng)然,如果用本地設(shè)備來(lái)EDC/ECCNAND可以非常直接地使用基于NOR的閃存,可以像其他器那樣連接,并可以在上面直接NANDNAND寫時(shí)需要同時(shí)指定邏輯塊號(hào)和塊內(nèi)偏移。應(yīng)用程序?qū)AND操作是以“塊”為基本單要修改NAND中一個(gè)字節(jié),必須重寫整個(gè)數(shù)據(jù)塊。<3>由于NOR地址線和數(shù)據(jù)線分開所以NOR可以像SRAM一樣連在數(shù)據(jù)線上。NOR的使用也類似于通常的內(nèi)存,它的傳輸效率很高,可執(zhí)行程序可以在內(nèi)執(zhí)行(XIP,eXecuteInce),這樣應(yīng)用程序可以直接在flash閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中。由于NOR的這個(gè)特點(diǎn),嵌入式系統(tǒng)中經(jīng)常將NOR做啟動(dòng)使用。NANDNAND芯片做啟動(dòng)比較難.<4>NAND閃存因?yàn)楣灿玫刂泛蛿?shù)據(jù)總線的原因,不允許對(duì)一個(gè)字節(jié)甚至一個(gè)塊進(jìn)行的數(shù)據(jù)清空,只能對(duì)一個(gè)固定大小的區(qū)域進(jìn)行操作;而NOR可以對(duì)字進(jìn)行操10325121280NAND512字節(jié)需要的時(shí)間包括:51250納秒+10微秒的尋頁(yè)時(shí)間+200微秒的片擦寫時(shí)間=234微秒。的空間使用了塊和頁(yè)兩級(jí)體系,也就是說(shuō)閃存的空間是二維的,比如放錯(cuò)誤空間(有時(shí)也稱為out-of-band,OOB空間);在進(jìn)行寫操作的時(shí)候NAND閃存NAND閃存進(jìn)行大量數(shù)據(jù)的讀寫時(shí),NANDNOR閃存。<6>NORNANDNOR<7>NANDFlash一般地址線和數(shù)據(jù)線共用,對(duì)讀寫速度有一定影響;而NORFlash閃(1NOR(2NAND型閃存在擦、寫文件(特別是連續(xù)的大文件)時(shí)速度非常快,非常適用于順序的場(chǎng)合,而NOR的速度很快,在隨機(jī)存取的應(yīng)用中有良好的表現(xiàn)。NANDFLASHNORFLASH<1>NAND和NOR的共性首先表現(xiàn)在向中寫數(shù)據(jù)必須先將中對(duì)應(yīng)的內(nèi)容清空,然后再寫入,也就是通常說(shuō)的“先擦后寫。只不過(guò)NOR只用擦寫一個(gè)字,而NAND需要擦寫整個(gè)塊。其次,閃存擦寫的次數(shù)都是有限的.當(dāng)閃存的使用接近使用的通常NAND的可擦寫次數(shù)高于NOR,但是由于NAND通常是整塊擦寫,塊內(nèi)的頁(yè)面整體上來(lái)說(shuō)NOR的較長(zhǎng)。MTDMemoryTechnologyDrivers)模塊中或者在FTLZ(FlashTranslationLayer)層內(nèi)實(shí)現(xiàn),具體算法和的生產(chǎn)廠商以及型號(hào)有一般的原則是:在大容量的多應(yīng)用中選用NAND型閃存,而在數(shù)據(jù)/程序存貯應(yīng)用中選用NOR型閃存。根據(jù)這一原則,設(shè)計(jì)人員也可以把兩種閃存結(jié)合起來(lái)使用,用NOR程序,用NAND數(shù)據(jù),使兩種閃存的優(yōu)勢(shì)互補(bǔ)。事實(shí)上,這種聰明的設(shè)計(jì)早已普遍應(yīng)用于、PocketPC、PDA及電子詞典等設(shè)備中了。NAND在使用中還存在著壞塊管理的問(wèn)題,在NAND閃存中,由于壞塊是隨機(jī)分NAND閃存上自始至終都必須進(jìn)行虛擬映射。NORNAND閃存上進(jìn)行同樣操作MTDRAM、ROM、SRAM、DRAM、RAM(Randomaccessmemsory):隨機(jī)存取器DRAM(DynamicRandomaccessmemsory)動(dòng)態(tài)隨機(jī)存取器,內(nèi)存里面的數(shù)據(jù)需要?jiǎng)討B(tài)的刷新,現(xiàn)在的主流內(nèi)存設(shè)備,節(jié)省成本,速度略低(SDRAM,DDRAM)SRAM(staticrandomaccessmemsory)靜態(tài)隨機(jī)器,器陣列,不需要刷新就保SRAMki2c協(xié)議(I2C(Inter-IntegratedCircuit)PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其設(shè)備。,, 4K8K16K s5pv210處理器集成了i2c但是有的cpui2c控制器,那么怎么辦?gpio模擬時(shí)序輸出,根據(jù)圖可以看出在sclsda的值。1scl為低電平的時(shí)候進(jìn)行。定義:I2CSCL:SDA:數(shù)據(jù)線開始信號(hào):start,SCL處于高電平,SDA產(chǎn)生一個(gè)下降沿結(jié)束信號(hào):stopSCLSDA產(chǎn)生一個(gè)上升沿應(yīng)答信號(hào):ACKSCL處于高電平,SDA為低電平狀態(tài)0/1(i2c——dataSDA低/1,SDASCL低SCLSCL088bitcpu9cpuI2CcpuACK信i2ci2c總線上的每個(gè)從設(shè)備都有一個(gè)固定的地址i2cEEPROM通信:寫過(guò)程 ACKACK這個(gè)過(guò)程在用戶態(tài)可能會(huì)產(chǎn)生回寫因?yàn)槭?bit寫,寫完8bit7:18:29:310:478bit910bit沒有寫上,12bit。ACKACKCPUSDA上的數(shù)據(jù)i2ci2ceepromself-timedwritecycle(5msmax)5ms5uart Set1LCDLCD顯示屏上的像素點(diǎn)與顯存是一一對(duì)應(yīng)的,顯存是在內(nèi)存中劃出一塊區(qū)域,可對(duì)LCD上顯示一條線,只要在顯存與其對(duì)應(yīng)的位置放上一條線就可以了。ARMLCD控制器會(huì)周期性的到顯存中讀數(shù)據(jù),然后將讀LCD1>三個(gè)時(shí)間,即HSYNC、VSYNC、VCLK,不然會(huì)使到的數(shù)據(jù)丟3>按照一定的時(shí)序?qū)⒌降臄?shù)據(jù)發(fā)送給LCD驅(qū)動(dòng)(不同廠家的LCD性能不一樣,支持的時(shí)序不同,ARMLCD)Frambuffer:LCD物理緩存(顯存)到用戶空間(0~3G)用戶空間要顯示一幅圖像(這項(xiàng)工作是由內(nèi)核完成的,會(huì)先把內(nèi)容到內(nèi)核中,在放到顯存中,F(xiàn)rambuffer機(jī)制LCDVD0~VD23VCLKVCLK信號(hào)使電子槍跳到下一個(gè)像素點(diǎn)VDEN:數(shù)據(jù)使能,VDEN有效時(shí)電子槍才會(huì)從VD0~VD23上取數(shù)時(shí)序圖(P1207)(timingHSPW:水平同步脈沖寬度(CPUHSYNC到LCD確認(rèn)收到該電平信號(hào)的時(shí)間間隔)HFPD:一行打點(diǎn)完成,到下一水平同步信號(hào)開始的時(shí)間間隔(VCLK數(shù)VSPW:cpuVSYNCLCDLINEVAL:VSYNCLCD)。CPUHSYNCLCDHSPW(HSYNCLCD個(gè)信號(hào)當(dāng)作一個(gè)干擾信號(hào)。LCDHBPD,HOZVAL,HFPDframebuffer本質(zhì)上是字符設(shè)備,結(jié)構(gòu)是fb_info結(jié)struct{structfb_var_screeninfovar{}structfb_fix_screeninfofix{}structfb_ops*fbops;}LCDfb_info
gpioLCDLCDLCDLCD4)fb_infoLCD驅(qū)動(dòng)移植:修改寄存器值,即時(shí)間,從LCD手冊(cè)中找與arm手冊(cè)時(shí)序圖對(duì)應(yīng)的位內(nèi)核自帶的LCD ->Device->Graphics->Supportforframebuffer fbmem.ofbmon.ofbcmap.ofbsysfs.omodedb.ofbmem.c中的->S3CFramebuffer結(jié)論:s3cfb.c->需要完成的驅(qū)動(dòng)程序s3cfb_fimd6x.c(s3cfb.c所調(diào)用) structtform_devices3c_device_fb= = =- = = = = =.tform_data=lte480wv(移植}->SelectLCDstaticstructs3cfb_lcdlte480wv= = = = =.clkval_f= .timing====20,=====.polarity=.rise_vclk= = =.inv_vden={.lcd=}{}LCDthpw: thb: fbmem.c{fb_info結(jié)構(gòu)中open函數(shù)}s3cfb.cmmapfbmem.c中實(shí)現(xiàn)了fb_mmap驅(qū)動(dòng)的移植:利用makeconfig,找到相關(guān)的驅(qū)動(dòng),然后看其help,找到驅(qū)動(dòng)的路徑一般第一個(gè)文件是文件。我們移植這個(gè)驅(qū)動(dòng)只需要修改這些文件就可以了。device.C中的內(nèi)容就可以了。ib_tablenamename相同的deviceresourcesMakefile中沒有,那makeconfig/ 搜索 .config中的宏arch/arm/machifndefkconfig.config里面包含了默認(rèn)的內(nèi)核編譯配置。arch/arm/mach-s5pv210/mach-cw2104)查看.config里面的默認(rèn)配置,對(duì)這個(gè)驅(qū)動(dòng)的宏的處理Input子系統(tǒng)(Linuxinput子系統(tǒng)提供了輸入設(shè)備的驅(qū)動(dòng)框架,比如鼠標(biāo)、鍵盤、觸摸屏等就屬于輸入設(shè)備。按鍵:鍵值觸摸屏:坐標(biāo)(絕對(duì)坐標(biāo),相對(duì)與左上角)鼠標(biāo):相對(duì)位移Input子系統(tǒng)的應(yīng)用層的開發(fā),只需要用structinput_event就可以誕生了structinput_event{type; //位置,鍵值,還是x,y坐標(biāo) //按下1,釋放0 Structinput_eventbutton;Read(fd,&button,sizeofbutton);Printf(“%d%d%d”,button.type,button.code,button建、read函數(shù)的實(shí)現(xiàn))抽象了出來(lái),已經(jīng)寫好了,這些寫好的代碼就組成input模塊。Linux中關(guān)于input子系統(tǒng)的文檔在ation/input,input的代碼在input.c和input.h中原理:有一個(gè)模塊:input.c,有一個(gè)處理模塊eventhandler,用來(lái)處理。通過(guò)input_register_handler函數(shù)與模塊產(chǎn)生聯(lián)系。當(dāng)有一個(gè)時(shí),通過(guò)input_register_handler通知模塊,是這樣通知的:會(huì)有一個(gè)鏈表,有一個(gè)處理器要到input模塊,實(shí)際上就是將一個(gè)struct結(jié)構(gòu)體加到一個(gè)鏈表(input_handler_list)上,在這個(gè)鏈表上添加一個(gè)新的節(jié)點(diǎn)。這樣模塊就可以管理這個(gè)處理器。Linux系統(tǒng)中register就是將放到一個(gè)鏈表上,模塊就可以通過(guò)管理鏈表管理這個(gè)。內(nèi)核中有evdev.c和mouse.c兩個(gè)處理器。還有一個(gè)input_device模塊,這個(gè)模塊的工作:分配,設(shè)置,,報(bào)告,注銷,釋放,用來(lái)發(fā)出。通過(guò)input_register_device函數(shù)一次就在模塊管理的另一個(gè)鏈表(input_dev_list)中形成一個(gè)新的節(jié)點(diǎn)。Input_register_handlerinput_handler_list中的新時(shí)間處理器能不能處理device中的,對(duì)比成功就調(diào)用對(duì)應(yīng)的handler中connect函數(shù),每個(gè)handler函數(shù)都會(huì)實(shí)現(xiàn)一個(gè)connect函數(shù)。哪個(gè)就調(diào)用哪個(gè)handler處理函數(shù)。Input_dev_listinput_match_deviceinput_handler_list鏈表,input_deviceinput_device,eventhandler不用動(dòng)。eventhandler處理。read,writeeventhandler中的相handlerhandler函數(shù)集合中有這個(gè)函數(shù)就調(diào)用handler中的函數(shù)集合,調(diào)用的就是evdev_open。struct{}分配一個(gè)structinput_devinput_allocate_device動(dòng)態(tài)申請(qǐng)?jiān)O(shè)置 input_dev5)
1)ls/dev/event*2)insmodbuttondriver.ko3)ls/dev/event*4)hexdump/dev/event3 (type(4ff40000d10600014ff40000d10e00004ff40000057d00004ff4000005810000inputinputinput_dev結(jié)構(gòu)體structinput_dev{constchar*name;constcharconstcharstructinput_id--設(shè)備idunsignedlong-BITS_TO_LONGSbitlong類型的數(shù)據(jù),evbit用于表明設(shè)備對(duì)unsignedlongkeybit[BITS_TO_LONGS( T)];--按鍵使能標(biāo)志位unsignedlongrelbit[BITS_TO_LONGS( T)];--相對(duì)坐標(biāo)使能標(biāo)志unsignedlongabsbit[BITS_TO_LONGS( T)];--絕對(duì)坐標(biāo)使能標(biāo)志unsignedlongmscbit[BITS_TO_LONGS( unsignedlongledbit[BITS_TO_LONGS( unsignedlong unsignedlong unsignedlongswbit[BITS_TO_LONGS( T)];unsignedintkeycodemax; unsignedintkeycodesize;--鍵盤碼表項(xiàng)的大小void*keycode; int(*setkeycode)(structinput_dev*dev,intscancode,intint(*getkeycode)(structinput_dev*dev,intscancode,int*keycode);structff_device*ff;unsignedintrepeat_key;structtimer_listtimer;intsync;intabs[ABS_MAX+intrep[REP_MAX+1];unsignedlongkey[BITS_TO_LONGS( unsignedlongled[BITS_TO_LONGS( unsignedlong unsignedlongsw[BITS_TO_LONGS( T)];intabsmax[ABS_MAX+1];intabsmin[ABS_MAX+1];intabsfuzz[ABS_MAX+intabsflat[ABS_MAX+1];int(*open)(structinput_dev*dev);void(*close)(structinput_dev*dev);int(*flush)(structinput_dev*dev,structfileint(*event)(structinput_dev*dev,unsignedinttype,unsignedintcode,intvalue);structinput_handle*grab;spinlock_tevent_lock;structmutexmutex;unsignedintintgoing_away;structdevicedev;structlist_headh_list;structlist_headnode;structinput_dev{structinput_devdev=kzalloc(sizeof(structinput_dev),GFP_KERNEL);if(dev){dev->dev.type dev->dev.class=&input_class; }
return}有兩種可以去設(shè)定,1.set_bit(EV_KEY,xx->evbit),設(shè)定evbit支持EV_KEY2.xx_dev->evbit[0]=BIT(EV_KEY);input_set_capability函數(shù)來(lái)實(shí)現(xiàn)。voidinput_set_capability(structinput_dev*dev,unsignedinttype,unsignedint{switch(type){caseset_bit(code,dev->keybit);break;caseEV_REL:set_bit(code,dev->relbit);break;caseEV_ABS:set_bit(code,dev->absbit);break;caseEV_MSC:set_bit(code,dev->mscbit);break;caseEV_SW:set_bit(code,dev->swbit);break;caseEV_LED:set_bit(code,dev->ledbit);break;caseEV_SND:set_bit(code,dev->sndbit);break;caseEV_FF:set_bit(code,dev->ffbit);break;caseEV_PWR:/*donothing*/break;default:"input_set_capability:unknowntype%u(code%u)\n",type,code);}set_bit(type,dev-}name,bus,open,closeopen和closeopen0,否則出錯(cuò),closeinputintinput_register_device(structinput_dev{staticatomic_tinput_no=ATOMIC_INIT(0); --input_no增加structinput_handler --handlerconstcharinterrorset_bit(EV_SYN,dev --linux中采用定時(shí)器定時(shí)去查詢?cè)O(shè)(!]! --repdev->timer.data=(long)dev->timer.function=input_repeat_key; dev->rep[REP_DELAY]=250;dev->rep[REP_PERIOD]=}if(!dev-dev->getkeycode=input_default_getkeycode;if(!dev->setkeycode)dev->setkeycode=input_default_setkeycode;dev_set_name(&dev->dev,"input%ld",(unsignedlong)atomic_inc_return(&input_no)-1);--設(shè)置設(shè)備名稱error=device_add(&dev- -ifreturnerror;path=kobject_get_path(&dev->dev.kobj,printk(KERN_INFO"input:%sas%s\n",dev->name?dev->name:"Unspecifieddevice",path?path:"N/A");k(path);error= if(error){returnerror;}list_add_tail(&dev->node, --將設(shè)備節(jié)點(diǎn)添加到input,, input_attach_handler(dev, --匹配處理函數(shù) --mutex_unlock(&input_mutexreturn}No.1input_repeat_keyrepeatevent層staticvoidinput_repeat_key(unsignedlong{structinput_dev*dev=(void*)unsignedlongflags;spin_lock_irqsave(&dev->event_lock,flags); 的代碼不能夠阻塞 &&is_event_supported(dev->repeat_key,dev->keybit,KEY_MAX)){ EV_KEY,dev->repeat_key,2); if(dev->sync){ if(dev->rep[REP_PERIOD])mod_timer(&dev->timer,jiffies+}No.2keycode,下面的函數(shù)又是很好理解的,偷懶一下。staticintinput_default_getkeycode(structinput_dev*devintscancodeint*keycode){if(!dev->keycodesize)return-EINVAL;if(scancode>=dev->keycodemax)return-EINVAL;*keycode=input_fetch_keycode(dev,scancode);return0;}staticintinput_fetch_keycode(structinput_dev*dev,int{switch(dev->keycodesize){case1:return((u8*)dev->keycode)[scancode];case2:return((u16*)dev->keycode)[scancode];return((u32*)dev-}}No.3staticintinput_default_setkeycode(structinput_dev*dev,intscancode,int{intintiifscancodedev- return-if(!dev->keycodesize)return-EINVAL;ifdev->keycodesizesizeof(keycode&&keycodedev->keycodesize* case1:u8*k=(u8*)dev->keycode;old_keycode=k[scancode];k[scancode]=keycode;}case2:u16*k=(u16*)dev->keycode;old_keycode=k[scancode];k[scancode]=keycode;}default:u32*k=(u32*)dev->keycode;old_keycode=k[scancode];k[scancode]=keycode;}clear_bit(old_keycodedev set_bit(keycode,dev->keybit);for(i=0;i<dev->keycodemax;i++){ if(input_fetch_keycode(dev,i)==old_keycode){break;/*Settingthebittwiceisuseless,sobreak}}return}No.4這個(gè)函數(shù)很重要,這個(gè)其實(shí)類似于tform中probe函數(shù),將設(shè)備與設(shè)備處理相連接staticintinput_attach_handler(structinput_dev*dev,structinput_handler{conststructinput_device_id*id;interror;if(handler->blacklist&&input_match_device(handler->blacklist, --devreturn-idinput_match_device(handler->id_table --idifreturn-error=handler->connect(handler,dev,id); if(error&&error!=-ENODEV) ""error:%d\n",handler->name,kobject_name(&dev->dev.kobj),error);return} tform虛擬總線(見圖總線設(shè)備驅(qū)動(dòng)CPU的硬件上存在各種類型的總線,這些總線上掛接著很多的,驅(qū)動(dòng)工程師的作就是驅(qū)動(dòng)這些。linux內(nèi)核提供了一套總線設(shè)備驅(qū)動(dòng)模型的架構(gòu),使驅(qū)動(dòng)開發(fā)更加規(guī)include/linux/device.hstructbus_type{match(匹配規(guī)則,匹配設(shè)備和設(shè)備驅(qū)動(dòng)程序的}總線的ls/sys/bus:查看內(nèi)核中了那些總struct{struct }device.bus&i2c_bus_type//i2cstruct{proberemove//driver中的remove}2、平臺(tái)設(shè)備總線//總線drivers/base/tform.c(core)structtform_device繼承自總線驅(qū)動(dòng)模型的structdevice。就是包含有這個(gè)結(jié)構(gòu)體struct{structdevice_driver}和設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)體。tform_device結(jié)構(gòu)體通過(guò)tform_device_register函數(shù)與模塊聯(lián)系,有一個(gè)device就向模塊維系的devicelist中添加一個(gè)節(jié)點(diǎn)。設(shè)備驅(qū)動(dòng)的structtform_driverstructdriver_devicetform_driver_register到模塊,第一件事情就是在模塊維系的driverlist鏈表devicedrivermatch函數(shù)與另一name或者ib_table。make-》driverdevicedrivername”{}{
}} tform-》-》{/*device鏈表中的每一個(gè)節(jié)點(diǎn)*/}
-》bus_for_each_dev(drv->bus,NULL,drv-》-》{等于調(diào)用returndrv->bus->match?drv->bus->match(dev,drv):}在{drv->driver.bus=&}TCP/UDP五層的TCP/IP協(xié)議棧嚴(yán)謹(jǐn)?shù)腎SO/OSI七層協(xié)議棧大行其道成為事實(shí)上的標(biāo)OSITCP/IP的五層結(jié)構(gòu)圖。表示層:處理在兩個(gè)通信系統(tǒng)換信息的表示方傳輸層:向用戶提供可靠的端到端服務(wù)。UDPTCP協(xié)議。塞控制、網(wǎng)絡(luò)互聯(lián)等功能。數(shù)據(jù)傳輸單元是分組。IP地址,路由器,IP協(xié)議。TCP連接,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā),ABCDEF,甲方向乙方發(fā)A,B,C…..,而乙AABB的消息,EA的消息,那么甲方會(huì)重新Aconnect這是服務(wù)器上的accept函數(shù)等待客戶端連客戶端連接時(shí)accept客戶端就有幾個(gè)socket??偟胹ocket只是端,有客戶端就建立一個(gè)socket(見圖UDP用戶數(shù)據(jù)報(bào)協(xié)議是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)報(bào)的層協(xié)議UDP不提供可靠性,IP層的數(shù)據(jù)報(bào)發(fā)送出去,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)前不用在客戶和服務(wù)器之間建立接,且沒有超時(shí)重發(fā)等機(jī)制,故一個(gè)包然后把這些數(shù)據(jù)包發(fā)出去然后這些包自己通過(guò)網(wǎng)絡(luò)發(fā)送出去尋找目的地,I/O函數(shù)。voidstrcpy(char*lpszDest,char*lpszSrc){}1charcTemp;//全局變量voidSwapChar1(char*lpcX,char*lpcY){}voidSwapChar2(char*lpcX,char*lpcYstaticcharcTemp;//靜態(tài)局部變量}disinterrupt()之類的操作,就是關(guān)閉硬件中斷。unsignedintsum_int(unsignedintbase){unsignedintindex;staticunsignedintsum0;//staticfor(index=1;index<=base;index++)sum+=index;return}staticstatic變量staticstatic變量,使用原則是,能不用sum即變?yōu)橐粋€(gè)autostatic變量的,比如當(dāng)某函數(shù)的返回值為指針類型staticauto類型,則返回為錯(cuò)指針。Arm數(shù)據(jù)時(shí)通過(guò)內(nèi)存控制器,而內(nèi)存控制器數(shù)據(jù)是按照4字節(jié)對(duì)齊來(lái)讀 -- 111 -- 223 -- 344這時(shí)如果arm核來(lái)數(shù)據(jù)222,會(huì)先把A讀出來(lái),然后在把B讀出來(lái),之后把222剝離出來(lái),這樣一個(gè)數(shù)字,需要兩次,增加了時(shí)間,如果按照四字節(jié)方式 - 011 - 022 - 033CPU外接設(shè)備 (地址總線、數(shù)據(jù)總線中斷l(xiāng)inux內(nèi)核中希望你的中斷處理程序執(zhí)行時(shí)間越短越好,但是中斷處理程序要完成的頂半部:完成盡可能少的緊急功能,往往是寄存器,清除中斷標(biāo)志,登記底半部,cdd_isr_bottom完{12}{34}structtasklet_struct{data;//struct}(...)//func函數(shù)工作于中斷上下文,這個(gè)函數(shù)中是不是sleepfunc工作于進(jìn)程上下文,funcstruct{work_func_t}INIT_WORK(...)//work(...)//(X86mov0x100(虛擬地址)in/out0x100(物理地址)pc,mipsMov0x100Linux編程用到的都是虛擬地址,所以必須要將物理地址映射成虛擬地址才能操作。I/O內(nèi)存(建議性的)request_mem_region(startn,name)n:start開始的字節(jié)數(shù)request_mem_region(0xe0200c00,12,GPH0")ioremap(phys_addr,size)phys_addr,size, -> -> ->I/ODS18B209~12四種比特的攝氏測(cè)量。DS18B02遵守一線總線式協(xié)議,主設(shè)備與從設(shè)備之間的通信都是通過(guò)一條數(shù)據(jù)線,在這一條線上可以掛接很多的從設(shè)備,因?yàn)槊總€(gè)DS18B0264bit的序列碼,主設(shè)備通過(guò)這個(gè)序列碼來(lái)找從設(shè)備,264次方個(gè)從設(shè)備。2ROMskipromDS18B20默認(rèn)是上電低功耗的進(jìn)入正常模式需要發(fā)送一個(gè)convertT命令(0x44)。DS18B20(RESET)脈沖、存在(PRESENCE)01016種信號(hào),以保證數(shù)據(jù)的完DS18B205個(gè)皆由控制器發(fā)出MCU在寫時(shí)隙向DS18B20寫入數(shù)據(jù),在讀時(shí)隙從DS18B20數(shù)據(jù),每一時(shí)隙只能傳送1比特?cái)?shù)據(jù)。各種讀寫時(shí)隙必須持續(xù)至少60us,兩個(gè)連續(xù)時(shí)隙之間要有1us的Uboot啟動(dòng)過(guò)程 14K是在cpu,主要作用設(shè)置異常向量表,進(jìn)入管理模式IRQ,FIQ中斷,關(guān)閉看門狗,關(guān)閉中斷MMU,cache,時(shí)鐘,內(nèi)存,,cpuU-BootRAM空間//norflashnandflashbss將內(nèi)核從Flash到RAM中LOGO顯示3加載操作系統(tǒng)內(nèi)核,并且給內(nèi)核傳遞參數(shù),并且正確掛接完根文件系統(tǒng)以后,uboot才算結(jié)1u-boot對(duì)應(yīng)的第一階段代碼放在cpu/arm920t/start.S文件中,代碼如下:.globl_startglobal 與.global相同*/ /**/b是不帶返回的跳轉(zhuǎn)(bl是帶返回的跳轉(zhuǎn))start_code標(biāo)號(hào)出執(zhí)行程序 pc,_undefined_instruction /*未定義指令向量ldr相當(dāng)于mov操作*/ pc,_software_interrupt 軟件中斷向量*/ pc pc pc, pc fiq中斷向量 中斷向量表地址 .word /*就是在當(dāng)前地址,即_undefined_instruction .wordword偽操作用于分配一段字內(nèi)存單元(分配的單元都是字對(duì)齊的)expr初.balignlCPU04個(gè)字節(jié)_undefined_instruction:.wordundefined_instruction表示未定義的這個(gè)異常是由.word32位的數(shù)word后面的數(shù):表示把該標(biāo)識(shí)的編譯地址寫入當(dāng)前地址,標(biāo)識(shí)是不占用任何指令的。把標(biāo)copy到指針pc上面,那么標(biāo)識(shí)上存放的值是什么?CPUSVC模式//u-boot一開始就跳轉(zhuǎn)到了復(fù)位,cpu在復(fù)位時(shí)是處于管“1001(CPUCPSR程序狀態(tài)字,并將中斷禁止位和快中斷位置一,從而了IRQFIQ中斷。 if definepWTCON defineINTMSK defineCLKDIVN /*s3c2410與s3c2440下面4個(gè)寄存器地址相同*/#definepWTCON#define /*INTMSK寄存器地址#defineINTSUBMSK/*INTSUBMSK器 defineCLKDIVN /*CLKDIVN;時(shí)#s3c2440WATCHDOG,INTMSK,INTSUBMSK,CLKDIVN四個(gè)寄存器的地址的設(shè)置。,CPU但實(shí)際上,F(xiàn)CLKFinPLL。這就需要設(shè)CLKDIVN,MPLLCON,UPLLCON3個(gè)寄存器。關(guān)閉 (也就是做bank的設(shè)置bllowlevel_initbankbank設(shè)置必須搞清楚,對(duì)以后移植復(fù)雜uboot有很大幫助設(shè)置完畢后拷貝uboot4kuboot其中的lowlevel_init就完成了內(nèi)存初始化的工作,由于內(nèi)存初始化是依賴于開發(fā)板的因此lowlevel_init的代碼一般放在board下面相應(yīng)的 lowlevel_init13RAM時(shí)鐘的初始化。lowlevel_initU-Boot從NANDFlash或NORFlash.text{ board/samsung/mini2440/lowlevel_init.o(.text)board/samsung/mini2440/nand_read.o(.text)…}board/samsung/mini2440/lowlevel_init.o將被到cpu/arm920t/start.o后面,因 到CPU內(nèi)部4KB的部RAM中。因此第137~146行的代碼將從CPU內(nèi)部RAM中 內(nèi)存中的地址,而此時(shí)內(nèi)存中的地址,而此時(shí)U-Boot還在NORFlash中,因此還需要在NORFlash 數(shù)據(jù)RAM 由于NORFlash的開始地址是U-Boot的加載到內(nèi)存的起始地址是 U-BootRAMNORFlashNANDFlashU-BootNANDFlash還是NORFlashr0bBootFrmNORFlash函數(shù)返回0表示NANDFlash啟動(dòng),否則表示在NORFlash啟動(dòng),跳轉(zhuǎn)到NANDFlash啟bBootFrmNORFlashU-BootNANDFlashNOR被存放在r0bBootFrmNORFlash函數(shù)后根據(jù)r0U-BootNANDFlash啟動(dòng)還是NORFlash啟動(dòng)。NORFlash還是從NANDFlash0處為U-Bootbstart_codeNORFlash啟動(dòng)的情況,NORFlash0,必須通過(guò)一定NORFlashNANDFlash還是NORFlash0NORFlash,否則就是NANDFlash。nand_read_llNANDFlashU-BootRAM,該函數(shù)board/samsung/mini2440/nand_read.c中定義。NANDFlash根據(jù)page大小可分為2種:512B/page2048B/page這兩種NANDFlash的讀操作是不同的。因此就需要U-Boot識(shí)別到NANDFlash的類型,然后采用相應(yīng)的nand_read_llNANDFlash。BSSr0,r1,/*BSSu-boot.lds中指定/*BSSu-boot.lds中指定r2,r2,/*將bss段addr0,r0,#4 r0,r1 有初始化的變量將引起未知的。 uboot中u-boot.lds看一下uboot.lds文件,在 下面,uboot.lds是告訴編譯器這些段start.s會(huì)第一個(gè)執(zhí)行,編譯在最開始呢?就是通過(guò)uboot.lds文件進(jìn)行/*OUTPUT_FORMAT("elf32-armelf32-armelf32-arm")*/OUTPUT_ARCH(arm)//arm匯編ENTRY(_start)//指定{.= ALIGN(44.text//test3{cpu/arm920t/start.otextstart.ostart.s*(.text}ALIGN(4..rodata:{*(.rodata).=.data:{*(.data).=.got:{*(.got).=u_boot_cmd_start=.u_boot_cmd:{*(.u_boot_cmd)u_boot_cmd_end=.=bss_startbss.bss:{*(.bss)_endbss}cpu/arm920t/startoMMU是MemoryManagementUnit的縮寫,中文名是內(nèi)存管理單元,它是處理寄存器,寄存器都是實(shí)地址(物理地址MMU又要做虛實(shí)地址轉(zhuǎn)換的話先MMUMMUMMUcatchcatch一定要關(guān)閉,否則可能導(dǎo)catchRAM中數(shù)據(jù)還沒有catchCatchcpu2cpu內(nèi)部catchVolatile,以后在設(shè)置寄存器時(shí)會(huì)經(jīng)常遇到,他的本它直接從cpu的緩存中去取,但常用的代碼就是為了感覺一些常用變量的變化catchMMU。CcatchMMU的,會(huì)打開,如果編寫者要感覺外界變化,或變化太快,從catchVolatile。NorFlashNandFlashNorFlashNandFlash,思想就是將uboot代碼搬運(yùn)到內(nèi)存中去運(yùn)行,但是沒有拷貝bss后面這段代碼,只拷貝bss前面的代碼,bss代碼是放置全局變量的。Bss段代碼是為了,拷貝過(guò)去再清能承受所設(shè)置的頻率,如果頻率過(guò)高則會(huì)導(dǎo)致cpu操作設(shè)備失敗說(shuō)白了:設(shè)置頻率,就為了CPU能去操作設(shè)關(guān)閉看門狗。否則在U-Boot啟動(dòng)過(guò)程中,CPU路,不在cpu看門狗,cpu內(nèi)部的看門狗是復(fù)位的cpucpu時(shí),就不能完全讓板子復(fù)位,但我們通常都讓整的話,代碼還沒改完就又進(jìn)行喂狗,代碼也改不完中斷處理中發(fā)生中斷會(huì)自動(dòng)跳轉(zhuǎn)到異常向量表,ldrpc是將代碼的編譯地址放在了指針TASK_STOPPEDSIGSTOPSIGTSTP等信號(hào)時(shí),進(jìn)程進(jìn)SIGCONT信號(hào)后,進(jìn)程重新回到TASK_RUNNING狀態(tài)LinuxstructfilestructfilefilpStructinode–VFSinode包含文件權(quán)限、屬主、組、大小、生成時(shí)間、時(shí)間、最后修改時(shí)間等Linux管理文件系統(tǒng)的最基本單位,也是文件系統(tǒng)連接任何子、文件的橋梁udev用戶工具udevLinux2.6 udev完全在用戶態(tài)工作,利用設(shè)備加入或移除時(shí)內(nèi)核所變送的熱插拔(hotplugevent)來(lái)工根下的procprocfs文件系統(tǒng)中的所有內(nèi)容,系統(tǒng)初始化procfs掛載到該可以通過(guò)對(duì)procfs文件系統(tǒng)中虛擬文件的讀寫作為與內(nèi)核中實(shí)體進(jìn)行通信的一種,和等等命令根下的syssysfs文件系統(tǒng)中的所有內(nèi)容,系統(tǒng)初始化時(shí)sysfs掛載到該sysfs是一個(gè)虛擬的文件系統(tǒng),它可以產(chǎn)生一個(gè)包括所有系統(tǒng)硬件的局級(jí)視圖,與提供進(jìn)proc文件系統(tǒng)十分類似30設(shè)備驅(qū)動(dòng)的分類字符設(shè)備(chardevice)塊設(shè)備(block512字節(jié)(或一2n次冪的數(shù)據(jù)尺寸)的整塊數(shù)據(jù)進(jìn)行讀、寫、擦除等控制操作系統(tǒng)標(biāo)準(zhǔn)塊設(shè)備,例如:磁盤、光盤、USB設(shè)備、NandFlash設(shè)備等設(shè)網(wǎng)絡(luò)設(shè)備(network31**移植內(nèi)核時(shí)要看makeconfig/system /針對(duì)的cpu類**cparch/arm/configs內(nèi)核移植(u-boot會(huì)傳參數(shù)給內(nèi)核)(一、arch1u-boot提供環(huán)境中運(yùn)行archMMUBSS不需要激活內(nèi)存,u-bootclock,Nandflash初始化了,環(huán)境基本搭好,內(nèi)核自啟動(dòng)階段不需要做很多與硬件相關(guān)的事情***2(ubootIDu-boot2456cpucpu匹配,但是開發(fā)板不一定匹配,一個(gè)內(nèi)核可能支持多個(gè)開發(fā)板,所以u(píng)-bootid傳到內(nèi)核ENDMACH-STARTEND傳遞給內(nèi)核1.重點(diǎn)就是寫函數(shù),函數(shù)寫的主要步驟就是給系統(tǒng)的各種設(shè)備驅(qū)動(dòng)傳遞相應(yīng)的數(shù)以重中之重就是這個(gè)數(shù)組里每一個(gè)設(shè)備是怎樣構(gòu)建的,構(gòu)建方法就是搞一個(gè)resrouce的結(jié)構(gòu)體,其中包含各種資源,這寫資源就是驅(qū)動(dòng)真正執(zhí)行所需要 cparch/arm/configs/s5pv210_defconfig.config make修改kconfig只要有源代碼就有Kconfig文件,通過(guò)修改Kconfig就可以把相應(yīng)的代碼添加到config中選擇某一段代碼在config的systemtype修改samsungaquila~SMDKC110選擇開發(fā)板要在內(nèi)核中加入某個(gè)驅(qū)動(dòng)或者部分,最簡(jiǎn)單就是修改Kconfig,然后config就可以看到,就可以選中了config打頭添加參照MACH_SMDKV210configMACH_CW210 depend default bool //selectSMD210了 Makefile是分層的,我們修改的在 下的是別的,它在運(yùn)行時(shí)會(huì)調(diào)用Makefileobj-$(CONFIG_MACH_SMDKV210)+=mach_smdkv210.o NULL+=以附加的方式編譯,在編譯內(nèi)核的過(guò)程中,在加上這個(gè)目標(biāo)文件 肯定編譯到zImage內(nèi)核里面,是,可以利用其添加內(nèi)核必須的文件 obj- +=(二)init/main.c內(nèi)核初始化完成之后,,內(nèi)核調(diào)用1(init)進(jìn)程32i2c,一線總線,usb等eepromarch/arm/mach-s5pv210/mach-cw210.c//開發(fā)板文件staticstructi2c_board_infoi2c_dev[]{} 0x50<<0x50i2c33ADC數(shù)字,滑動(dòng)變阻器0~3.3v,直接與cpu相連,接在ASN1cpuADC模塊PCL(66MHZ)5MHZ才能使用。34misc設(shè)備來(lái)實(shí)現(xiàn)。所有混雜設(shè)備共個(gè)主設(shè)備號(hào)(10),但是它們的次設(shè)備號(hào)不同alloc_chrdev_region()分配主/次設(shè)備號(hào)。使用cdev_init()和cdev_add()來(lái)以一個(gè)字符設(shè)備自己所有的miscdevice設(shè)備形成一個(gè)鏈表,對(duì)設(shè)備時(shí),內(nèi)核根據(jù)次設(shè)備號(hào)查找對(duì)應(yīng)miscdevice設(shè)備,然后調(diào)用其file_operations中的文件操作方法進(jìn)行操作在Linux內(nèi)核中,使用structmiscdevice來(lái)表示miscdevice。這個(gè)結(jié)構(gòu)體的定義為:structmiscdevice intconstcharconststructfile_operations*fops;structlist_headlist;structdevice*parent;structdevice*this_device;constchar*nodename;mode_tmode;minor是這個(gè)混雜設(shè)備的次設(shè)備號(hào),若由系統(tǒng)自動(dòng)配置,則可以設(shè)置為misc驅(qū)動(dòng)會(huì)自動(dòng)出現(xiàn)在/sys/class/misc下S3C2440GPIOARM-LINUX上最簡(jiǎn)單的驅(qū)動(dòng)。本驅(qū)動(dòng)通過(guò)S3C2440GPB5~84LEDMISC(混雜)驅(qū)動(dòng),其實(shí)MISC也是一種特殊的字10MISC類驅(qū)動(dòng)。MISC1》staticstructmiscdevicemisc.minor=.name=.fops=MinorMISC_DYNAMIC_MINORNameFopsfile_operations2》staticstructfile_operationsdev_fops 3》35文件系統(tǒng)的搭建 sbin/ 第庫(kù)的移u-boot.bin1.3.4Makefile的頭幾行代碼就是版本號(hào)再就是ionkernelrootfs.imgbusybox-1.19.4userdata.img kernel cramfs只讀,壓縮ramdiskyaffs2flashinitramfs=ramdisk+kernel(rootfs.img+1:cramfs2:ramdisk+yaffs2makeconfigFile[*]Miscellaneousfilesystems CompressedROMfilesystemsupport(cramfs)Generalsetup[*]InitialRAMfilesystemandRAMdisk(initramfs/in│Filesystems><*>TheExtended4(ext4) Useext4forext2/ext3filesystemsDeviceDrivers>[*]Blockdevices RAMblockdevice │ DefaultnumberofRAM │(8192)DefaultRAMdisksize (KconfigFilesystems>[*]Miscellaneousfilesystems YAFFS2filesysteminitramfs(ramdisk+Generalsetup[*]InitialRAMfilesystemandRAMdisk(initramfs/in│(/opt/rootfs)initramfssourcefilestructmtd_partitions3c_partition_info[]={//這個(gè)結(jié)構(gòu)體數(shù)組的每一項(xiàng)代表一個(gè){ bootloader",// // 1024*SZ_1K),// = //{.name=.offset=.size= =} = MTDPART_SIZ_FULL,//剩余所有空間MemoryTechnologydevice(MTD)supportMTDpartitioningsupport添加分區(qū)表3.0以后的版本沒有這個(gè)選項(xiàng)busyboxBusyboxSettings>BuildOptions[]BuildBusyBoxasastaticbinary(nosharedlibs)MiscellaneousUtilities>[*]nandwrite //nandflash[*]nanddump //nandflash[*]flash_eraseall//nandflash,norflash[*]flashcp//norflash[*]flashlock//norflash[*]flashunlock//norflashMakefilemakeinstall默認(rèn)安裝到源碼 的 結(jié)cdmkdirdevetcsyslibprochomemntroottmp/etc/inittab/etc/init.d/rcS/etc/fstab::sysinit:/etc/init.d/rcS//rcS就是一個(gè),里面做系統(tǒng)的初始化工作,initvforkexec函數(shù)組執(zhí)行這個(gè)rcS內(nèi)容:/bin/mount-amkdirmounttdevptsdevpts/dev/pts//掛接,把/dev/ptsdevptsecho/sbin/mdev/proc/sys/kernel/hotplug//建立設(shè)備節(jié)點(diǎn)文件,沒有這兩句,mdev-/usr/sbin/netd&exec/usr/local/rc.local方案1:把交叉編譯器里的所有庫(kù)統(tǒng)統(tǒng)拷貝到lib whichisarm-linux-gcc尋找交叉編譯器庫(kù)文件所在的位置。方案2:拷貝應(yīng)用軟件涉及的庫(kù)!arm-linux-readelfa|grepNFS共享 insmodenv命令來(lái)查看/home/app/o&//&指運(yùn)mount-tyaffs2/dev/mtdblock4(mount命令查看是否掛接成功)mount-tdevpts掛載在/dev/pts上操作設(shè)備文件mount-a掛載所有設(shè)備文件sudomkfs.cramfsrootfs nanderase700000nand 700000setenvbootargsroot=/dev/mtdblock3 //(ubot(mtdblockinit=/linuxrcrootfsramdisk#獲取一個(gè)空數(shù)據(jù)塊(08Mddif=/dev/zeroof=ramdiskbs=1kcount=8192mkfs.ext2Framdisksudomounttext2oloopramdiskmnt#rootfsmntcprootfs/*mntfrdsudoumountmntgzip--best-cramdisk>6.12.2 nanderase700000500000nand 7000006.12.3setenvbootcmdnandread 200000500000\;nandread 700000500000\;bootmsetenvbootargsroot=/dev/ramrwconsole=ttySAC0,115200 mkyaffs2image nanderasec00000nand c00000CPUstartupmainmain環(huán)WIN32C中不包含中斷。許多編譯開發(fā)商C(ISR)interrupt、#programinterruptISR的時(shí)候,編譯器會(huì)自動(dòng)為該ISRISRprintf(char*lpFormatString,…)函數(shù)會(huì)帶來(lái)重入和性能問(wèn)題,不能在ISR中采用。;如果使用動(dòng)態(tài)申請(qǐng),則申請(qǐng)后一定要判斷是否申請(qǐng)成功了,并且malloc和提供數(shù)量有限的漢字供必要的顯示功能。例如,一個(gè)微波爐的LCD上沒有必要提供顯示"電子郵件"的功能;一個(gè)提供漢字顯示功能的空調(diào)的LCD上不需要顯示一條"短消息",諸94個(gè)漢字,位號(hào)則為該字在該區(qū)中的位置。因此,漢字在漢字庫(kù)中的具置計(jì)算為:94*(區(qū)號(hào)-1)+位號(hào)-1。減1是因?yàn)閿?shù)組是以0為開始而區(qū)號(hào)位號(hào)是以1為模占用字節(jié)數(shù),以16*16點(diǎn)陣字庫(kù)為例,計(jì)算則為:(94*(區(qū)號(hào)-1)+(位號(hào)-1))*32。漢字庫(kù)中從該位置起的32字節(jié)信息記錄了該字的字模信息。#define#defineEX_FONT_UNICODE_VAL(value)(value),#defineEX_FONT_ANSI_VAL(value)(value),typedefstruct{WORDvalue*BYTE /*#define_CHAR_NUM…/*漢字?jǐn)?shù)量Unicode[_CHAR_NUM]{{{0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x44,0x44,0x46,0x24,0x4c,0x24,0x48,0x14,0x50,0x1c,0x50,0x14,0x60,0x04,0x40,0x04,0x40,0x04,0x44,0xff,0xfe,0x00,0x00,0x00,{{0x01,0x00,0x01,0x00,0x21,0x08,0x3f,0xfc,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x3f,0xf8,0x21,0x08,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,{{0x00,0x00,0x00,0x30,0x3f,0xf8,0x00,0x00,0x00,0x00,0x00,0x0c,0xff,0xfe,0x03,0x00,0x07,0x00,0x06,0x40,0x0c,0x20,0x18,0x10,0x31,0xf8,0x7f,0x0c,0x20,0x08,0x00,{{0x10,0x40,0x1a,0x40,0x13,0x40,0x32,0x40,0x23,0xfc,0x64,0x40,0xa4,0x40,0x28,0x2f,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,0x40,0x20,}} C語(yǔ)言中,宏是產(chǎn)生內(nèi)嵌代碼的唯一方法。對(duì)于嵌入式系統(tǒng)而言,為了能達(dá)到性能80-2020%80%的運(yùn)行時(shí)間,因而我們20%的代碼。嵌入式C程序中主要使用匯編,即在C程序中直接插入_asm{}內(nèi)嵌匯編語(yǔ)句:首先要明白CPU對(duì)各種器的速度,基本上是對(duì)于程序代碼,已經(jīng)被燒錄在FLASH或ROM中,我們可以讓CPU直接從其中讀取代碼執(zhí)行,但通常這不是一個(gè)好辦法,我們最好在系統(tǒng)啟動(dòng)后將FLASHROM中的目標(biāo)代碼拷貝入RAM中后再執(zhí)行以提高取指令速度;UARTBUFFERBUFFER被CPURS-232傳遞數(shù)據(jù)時(shí),不宜設(shè)置UART只接收到一個(gè)BYTE就向CPU提中斷,從而無(wú)謂浪費(fèi)中斷處理時(shí)間;如果對(duì)某設(shè)備能采取DMA方式,就采用DMA,DMA方式在目DMACPUCPU與外設(shè)的CPU內(nèi)部RAM>RAM>RAM>C語(yǔ)言的位操作可以減少除法和取模的運(yùn)算。在計(jì)算機(jī)程序中數(shù)據(jù)的位是可以操/etc/init.d/rcS是否有echo….Mdev…SPI總線(SerialPeripheralSPI接口是Motorola首先全雙工三線同步串行接口,采用主從模式(MasterSlave)slaveMasterMaster控制,在時(shí)鐘移firstSPIMbpsSPIEEPROM,F(xiàn)LASH,實(shí)時(shí)時(shí)鐘,AD轉(zhuǎn)換器,還有數(shù)字信號(hào)處理器和數(shù)字器之間SPI43(單向傳輸時(shí)SCLKSDO線,數(shù)據(jù)在時(shí)鐘上升沿或下降沿時(shí)改變,在緊接著的下降沿或上升沿被(改變和恰好是在半個(gè)周期。完成一位數(shù)據(jù)傳輸,輸8SPI的設(shè)備中,至少有一個(gè)主控設(shè)備。這樣傳輸?shù)奶攸c(diǎn):這樣的傳輸方式有一個(gè)優(yōu)點(diǎn),8SPI允許數(shù)據(jù)一位SCK時(shí)鐘線由主控設(shè)備控制,當(dāng)沒有時(shí)鐘跳變時(shí),從設(shè)備不或傳送數(shù)據(jù)也就是說(shuō)主設(shè)備通過(guò)對(duì)SCK時(shí)鐘線的控制可以完成對(duì)通訊的控制。SPISPI的數(shù)據(jù)輸入和輸出線獨(dú)立,所以允許同時(shí)完成數(shù)據(jù)的輸入和輸出。不同的SPI設(shè)備的實(shí)現(xiàn)方式不盡相同,主要是數(shù)據(jù)改變和的時(shí)間不同,在AT91RM9200SPI4個(gè)引腳構(gòu)成:SPICLK、MOSI、MISO/SS,其MOSI是主機(jī)的輸出,從機(jī)的輸入,MISO是主機(jī)的輸入,從機(jī)的輸出。/SS是從機(jī)的標(biāo)志管腳,SPI總線的器件,/SS管腳的電平低的是從機(jī),相反/SS管腳的電多從,互為主從。SPI16個(gè)外設(shè),PCS輸出=S,說(shuō)S0~3接4-16譯,這個(gè)譯是需要外接4-16譯,譯的輸入為S0~3,輸出用于16SPI操作中,最重要的兩項(xiàng)設(shè)置就是時(shí)鐘極性(CPOLUCCKPL)UCCKPHSPI具有相同的時(shí)鐘極性和時(shí)鐘相位。傳輸時(shí)序:SPI是一個(gè)環(huán)形總線結(jié)構(gòu),SPI接口在內(nèi)部硬件實(shí)際上是兩個(gè)簡(jiǎn)單的移位寄存器,8位,在主器件產(chǎn)生的從器件使能信號(hào)和移位脈沖下,按位傳輸,高SPI時(shí)鐘周期內(nèi),會(huì)完成如下操作:1)MOSI1位數(shù)據(jù),從機(jī)通過(guò)該線這1位數(shù)據(jù);2)從機(jī)通過(guò)MISO線發(fā)送1位數(shù)據(jù),主機(jī)通過(guò)該線這1位數(shù)據(jù)。這是通過(guò)移位寄存器來(lái)實(shí)現(xiàn)的。如下圖所示,主機(jī)和從機(jī)各有一個(gè)移位寄存器,且二者連接成環(huán)。隨著時(shí)鐘脈沖,數(shù)據(jù)按照從到低位的方式依次移出主機(jī)寄存SDOSDOSDI同從16位,即兩個(gè)字節(jié),因?yàn)?,首先主機(jī)要發(fā)送命令過(guò)去,然后從機(jī)根據(jù)主機(jī)令準(zhǔn)備數(shù)據(jù),主機(jī)在下一個(gè)8位時(shí)鐘周期才把數(shù)據(jù)讀回來(lái)。上升沿SDO發(fā)送數(shù)據(jù)1,同時(shí)從設(shè)備SDO發(fā)送數(shù)據(jù)0;緊接著在SCLK的下降0.SPI主要特點(diǎn)有:可以同時(shí)發(fā)出和接收串行數(shù)據(jù);可以當(dāng)作主機(jī)或從機(jī)工作;提供頻率可編程時(shí)鐘;發(fā)送結(jié)束中斷標(biāo)志;寫保護(hù);總線競(jìng)爭(zhēng)保護(hù)等。下圖示出SPI總線工作的四SPI0SPI3方式(實(shí)線表示):SPI46CAN總線協(xié)議(ControllerAreaCANCAN控制器根據(jù)兩根線上的電位差來(lái)判斷總線電平??偩€電平分為顯性電平和隱性*1CAN協(xié)議中,所有的消息都以固定的格式發(fā)送。總線空閑時(shí),所有與總線相連的以下稱為ID)決定優(yōu)先級(jí)。ID并不是表示發(fā)送的目的地址,而是表示總線的消息的ID的每個(gè)位進(jìn)行逐個(gè)仲裁比較。123結(jié)構(gòu)4硬件相關(guān)初始化合()read、write函數(shù)。取設(shè)備號(hào)cdev添加到內(nèi)核:add_cdeveve_raedev鏈表:rct_hadlist_head成員名稱)Expires=0不會(huì)超時(shí)Kmalloc(_page(valloc(kzalloc(?queuetimeout超時(shí)后,立即返回?queue指定的等待隊(duì)列數(shù)據(jù)鏈上?conditionTASK_INTERRUPTIBLE類型的睡眠queue指定的等待隊(duì)列數(shù)據(jù)鏈上?queue?queue::?? 定義在arch/arm/include/asm/bitops.h–set_bit(nr,void?addrnr–clear_bit(nr,void?addrnr–change_bit(nr,void?addrnr–inttest_bit(nr,void?addrnr–inttest_and_set_bit(nr,void–inttest_and_clear_bit(nr,void–inttest_and_change_bit(nr,void–atomic_tv=?定義一個(gè)原子變量v?v–intatomic_read(atomic_t?–atomic_add(inti,atomic_t?–atomic_sub(inti,atomic_t?–spinlock_t??–intspin_trylock(spinlock_t?true;否則立即返回?spinlock_tlock;//…spin_lock_init(&lock);//spin_lock(&lock);//criticalsectioncode;//spin_unlock(&lock);//量structsemaphore?定義信號(hào)量類型變量–sema_init(structsemaphore*sem,int?semval?nameDECLARE_MUTEXsemm);//down(&semm);//criticalsectioncode;//up(&semm);//cpuVoidndelay(unsignedlongnses);納秒級(jí)別的延時(shí)Voidudelay(unsignedlongusecs)微妙級(jí)延時(shí)Voidmdelay(unsignedlongmsecs)毫秒級(jí)別的延時(shí)Unsignedlongmsleep_interruptible(unsignedintmillosecs)Voidssleep(unsignedintseconds)中斷Intstructtasklet_struct{data;//struct}(...)//func函數(shù)工作于中斷上下文,這個(gè)函數(shù)中是不是sleepfunc工作于進(jìn)程上下文
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租車行業(yè)勞動(dòng)合同與租賃合同解析通則
- 標(biāo)準(zhǔn)勞動(dòng)合同簡(jiǎn)易模板
- 吊籃采購(gòu)合同參考范本
- Module 1 Unit 1 Hello!(教學(xué)設(shè)計(jì))-2024-2025學(xué)年外研版(一起)英語(yǔ)一年級(jí)上冊(cè)
- 企業(yè)股權(quán)轉(zhuǎn)讓法律合同
- 度購(gòu)物中心戶外廣告牌制作安裝合同
- 技術(shù)轉(zhuǎn)讓與許可合同樣本
- 計(jì)劃生育政策變動(dòng)導(dǎo)致的勞動(dòng)合同終止范本
- 交通建設(shè)合同轉(zhuǎn)讓協(xié)議書
- 9 明天要遠(yuǎn)足(教學(xué)設(shè)計(jì))2024-2025學(xué)年-統(tǒng)編版語(yǔ)文一年級(jí)上冊(cè)
- 部編版小學(xué)五年級(jí)下冊(cè)《道德與法治》全冊(cè)教案含教學(xué)計(jì)劃
- 運(yùn)動(dòng)會(huì)活動(dòng)流程中的醫(yī)療安全保障措施
- 2025公司員工試用期合同(范本)
- 第十章皮膚軟組織擴(kuò)張術(shù)醫(yī)學(xué)美容教研室袁曉野講解
- 2025年冷鏈物流產(chǎn)品配送及倉(cāng)儲(chǔ)管理承包合同3篇
- 2024-2025學(xué)年成都高新區(qū)七上數(shù)學(xué)期末考試試卷【含答案】
- GB/T 19342-2024手動(dòng)牙刷一般要求和檢測(cè)方法
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 國(guó)內(nèi)外創(chuàng)造性思維培養(yǎng)模式的對(duì)比研究綜述
- 2022年露天煤礦安全資格證考試題庫(kù)-上(單選、多選題庫(kù))
- 計(jì)價(jià)格(2002)10號(hào)文
評(píng)論
0/150
提交評(píng)論