




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目目 硬件配 S3C2410介 各部分接口說 第二章基礎實 AD接口實 DA接口實 鍵盤/LED接口實 IRDA紅外接口實 RS485通訊實 CAN總線通訊實 GSM/GPRS通訊實 第三章嵌入式Linux的開 建立嵌入式Linux開發(fā)環(huán) 將NFS用作根文件系統(tǒng)的步 第四章驅動模塊實 熟悉Linux開發(fā)環(huán) 串行接口程序設 內核模塊的驅動設計實 LCD驅動實 觸摸屏驅動實 SD卡讀寫實 IIS音頻驅動實 USB驅動實 Microwindows的應用實 第五章BootLoader編譯及燒錄實 實驗平臺提供的vivi具有如下功能 vivi的配置與編 vivi燒 vivi參數說 vivibootload的升 第六章Linux內核的移植與編譯實 Linux內核結 Linux操作系統(tǒng)移 Linux內核的編 WinCE系統(tǒng)的建 使用bootload運行 ADS實驗環(huán)境的建 LinuxLinux1.1THGMU-1ARM920T結構三星三星6432M×3.51host/12210bit4IIS,UDA134144.1KHz20SDCFIDE100CAN、RS485GPS/GPRSS3C2410ARM920T16/32RISCARM920T16KB16KBCacheARM920T:CP14CP15。CP14用于調試控制,CP15用于系統(tǒng)控制一級測試控制。S3C2410內部1.8V, 器3.3V,16KB數據cache,16KB指令cache,MMU。內置外部 器控制器(SDRAM控制和 TFT,4DMA。三個通用異步串行端口(IrDA1.0,16-byteTx FIFO,and16-ByteRxSPISD主接口版本1.0和多卡協(xié)議版本2.11兼容。DEVICE(VER1.14個定時器和一個內部定時看門狗定時器。電源控制模式:標準、慢速、休眠、掉電。810ADC帶日歷功能的實時時鐘。設計用于手持設備和通用嵌入式系統(tǒng)。16/32RISCARM920TCPU核的強大指令集。ARMMMUWINCE、Linux。ARM920TCPU核支持ARM調試的體系結構。BANK128MB(1G)BANK8/16/32Bank7BANK一共8個器BANK6個器BNAK用于ROM,SRAM和其他2個器BANK用于ROM,SRAM和同步DRAM每個器BANK可編程存取周期SDRAMROM(NOR、NANDFlash,EEPROM。JD1MPinPinPinPinPinPinPinPin123456789JD2MPinPinPinPinPinPinPinPin123456789PinPinPinPinPinPinPinPinPinPinPinPinPinPinPinPin123456789其他插座說明
了解在ADS環(huán)境下對s3c2410的8通道10位AD的操作和控制。軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 50MHz49,則A/D=50MHz轉換時間=1/(1MHz5cycles)=1200kHz(ADC位結束轉換標志位(只讀0=A/D1=A/D0A/D1=0=0A/DData001=1010=2011=3100=4101=50110=6111=70=1=1A/D0=1=00=1=A/D0 讀ADC-圖 建立實驗環(huán)境(詳見附錄0(CON6M)與計算機串口,打開實驗平臺電源S1J,打開仿真器驅動程序Multi-ICE,在ADS下打開并運行[ADC_INTest0.DispalyCount10 1....EnteranykeytoexitSelet:(R22MR21M分析實驗程序,理解ARMS3C2410的A/D轉換器控制方法:intReadAdc(int{intstaticintprevCh=-rADCCON=(1<<14)|(preScaler<<6)|(ch<<3); {rADCCON=(1<<14)|(preScaler<<6)|(ch<<3); } //開始ADCwhile(rADCCON&0x1); while(!(rADCCON&0x8000));return((int)rADCDAT0&0x3ff);{a1=ReadAdc(1);Uart_Printf("AIN1: AIN2:%0.2f}掌握MAX504D/A轉換的使用方D/ACPUD/A軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 5V電壓輸出緩沖2.048VINL=1/2LSB(MAX)電壓不隨溫度變化可變的輸出范圍:0V~VDD,Vss~VDD上電復位串行輸出圖 D/A轉換原理DAC[DACPleaseobservethecorrespondingofoutputandCurrentDigitalVoltageOfInput=“x”V其中x0~4.06分析實驗程序,理解MAX504D/A轉換的工作原理及ARMS3C2410對其控制方法void{intintfloat //將DAC寄存器設為0Uart_Printf("[DACTest]\nPleaseobservethecorrespondingofoutputand{ //MAX504數字量轉化v=((float)i)*Max504_FULL/1024.0f;//數字量顯示Uart_Printf("CurrentDigitalVoltageOfInput=%1.2fV\r",v); } }MAX504數字量轉化函數voidMax504_SetDA(int{ }
LED軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 輪詢方式通過把按鍵直接連接到系統(tǒng)外部I/O總線上使程序以外部端口的方式獲知總線狀態(tài)然后再按鍵所連接的位從而判斷出開關的狀態(tài)程序不斷地讀入外部端口的數值,2.3.1LED0-92.3.17LED0C1D2E3F4P5U6I7Y8H9LAB…圖 LED連接原理8PKEY_ARMJP11ES41、2OFF,3、4、5、6ON,JP10E、JP9E、JP8E、JP7E、JP6E、JP5E、JP4E、JP3E2、31、2。keyboardtest[Keyboard&LEDTest]Enter<0>toexit!keyvalueis?鍵盤實驗分別將JP10E、JP9E、JP8E、JP7E、JP6E、JP5E、JP4E、JP3E的短路1、22、3KEY_ARMJP11Eunsignedcharunsigned st[4][4]=rGPEDATrGPEDAT&0xfff7;GPE3rGPEDATrGPEDAT| rGPEDATrGPEDAT& rGPEDATrGPEDAT| rGPEDATrGPEDAT& rGPEDATrGPEDAT| rGPEDATrGPEDAT& rGPEDATrGPEDAT| 某列鍵值 //GPA5,6,7,80,15rSMG0=st[data][0]; //GPA5,6,7,8輸出0、15輸出低Uart_Printf("\rkeyvalueis%c
軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat TFDU4100是一個低功耗的紅外轉換模塊,滿足IRDA1.2的協(xié)議,傳輸速率可達到1IRED2IRED345678地115.2kbps。3/16,在紅外接收模式,接收3/1602.4.1S3C24104.2.4.2接紅外模塊和JD5E,并確保兩臺實驗平臺的紅外模塊相互正對,且設備間無物,兩臺設備打開兩臺實驗平臺電源,打開仿真器驅動程序Multi-ICE,分別在ADSIrDARx(B,超級終端分別顯示如下:Selectthebaud [IrDATxThistestshouldbeconfiguredtwoboards.Now...TxwithIrDAPleaseenteranykeytotransmit,enterkey'ESC'toSelectthebaud [IrDARxThistestshouldbeconfiguredtwoboards.Now...RxwithIrDAReceiveacontinuationofvaluekey'ESC'toAB1、2JP1EJP2E1、2回2、3IrDA{
irqrINTSUBMSK|=(BIT_SUB_RXD2|BIT_SUB_TXD2|BIT_SUB_ERR2); {}{}}
//INT_TXD2Requested //INT_TXD2Serviceavailablewhile(rUFSTAT2&0x2f0); //等待直到FIFO為空while(!(rUTRSTAT2&0x4)); //等待直到Txshifter為空 //INT_UART2IrDA
{while((rUFSTAT2&0x100)||(rUFSTAT2&0xf)) //receiveFIFOisfull||datainRxFIFO{{ }{}}}
硬件:THGMU-1,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 為脈寬調制()變速控制。在變速控制中,系統(tǒng)采用直流電源,變速控制通過調節(jié)脈寬圖2.5.1脈寬調制()變速原 圖2.5.2脈寬調制()控制直流電機原理ABCDLED1~LED40”鍵退出本分析實驗程序,理解直流電機控制原理和步進電機脈沖分配控制原理 //GPA71,GPA4、5、60Delay(50);//延時函數,控制低脈沖時間rGPADAT=0xfff90;GPA4、71,GPA5、60Delay(30);//延時函數,控制高脈沖時間rGPADAT=0xfff20;GPA51,GPA4、6、70Delay(50);//延時函數,控制低脈沖時間rGPADAT=0xfff60;GPA5、61,GPA4、70Delay(30);//延時函數,控制高脈沖時間rGPADAT=0xfff07;//0111,注意:低電平有效Delay(140);rGPADAT=0xfff0b;//1011rGPADAT=0xfff0d;//1101rGPADAT=0xfff0e;//1110軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 2.6.1RS485RS485(可以加一頭針一頭孔串口線延長。分別打開兩臺實驗平臺電源,打開RS485&CAN通訊模塊電源,打開仿真器驅動程序BA[RS485TxTestThistestshouldbeconfiguredtwoPleaseenteranykeytotransmit,enterkey'ESC'toexitTransmitData:[RS485RxTestThistestshouldbeconfiguredtwoboards.Receiveavalueofkey'ESC'toexitReceiveData:void{rGPACON&=~(0x1<<5);//GPA5rGPADAT|= }{gets=Uart_Getch();Uart_Printf("%c",gets);Uart_Printf("%c",gets);//接收端顯示所發(fā)送數據 “ESC,}void{rGPACON&=~(0x1<<5);//GPA5rGPADAT&=~(0x1<<5);}{gets=Uart_Getch();//獲得RS485if(gets==27)//收到“ESC}掌握CAN硬件:THGMU-1,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 本實驗系統(tǒng)采用MicroChipMCP2510CANCAN②0-8字節(jié)的有效數據長度,支持1Mbps(Fliter、Mask)(LoopBack)SPI5MHz(4.5V供電⑦3V5.5V的I/O口GPG2來控制。S3C2410帶有高速SPI接口,可以直接和MCP2510通訊。MCP2510MCP2510的控制包括了6設置內部寄存器為默認值,并設置MCP25102.7.3圖2.7.4圖2.7.5圖2.7.6狀態(tài)命通過設置MCP2510中的、、F3,CAN波特率的設置。在本系統(tǒng)中,MCP251016MHz??梢园凑杖缦路绞蕉xCANCAN相位1744174417441322在MCP2510Mask6FilterCAN(或者一組)IDMaskFilter設置Mask的所有位均為0就可以了。MCP2510的初始化MCP2510設置CAN設置ID切換MCP2510MCP2510MCP2510中有3個發(fā)送緩沖區(qū),可以循環(huán)使用。也可以只使用一個發(fā)送緩沖區(qū),但是,必須數據的發(fā)送和接收均可使用查詢或者中斷模式,這里,收發(fā)數據都采用查詢模式。通過狀態(tài)命令(ReadStatusInstruction)來判斷是否接收到(或者發(fā)送出)數據。CAN(可以加一頭針一頭孔串口線延長。分別打開兩臺實驗平臺電源,打開RS485&CAN通訊模塊電源,打開仿真器驅動程序ICE2410test.mcp[CANTestThistestshouldbeconfiguredtwoboards.EnterOrReceive<ESC>toexit!{ {canWrite(0x123,&data,8,FALSE,FALSE);} {canRead(n,&id,&data,&length,&rxRTR,&it);if(data=='\r')//發(fā)送換行}}
GPRSAT軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 模塊,如GSMUARTARMARMGSM2.5.2GSM GPRS模GPRSQ2406,是GSM/GPRSGSM/GPRSAT制其行為。GPRSAT短消息命令、GPRSAT+CSQ:測試模塊在本地的信號強度,返回若含99AT+CMGF:設置發(fā)送短消息的模式,0PDU;1TextAT建立實驗環(huán)境(詳見附錄0ON2410test.mcp,ShortMessagingService ( (AT+CMGS (AT+ (AT+CMGD1+CSQ:'99',選擇2可以進行英文短消息的發(fā)送實驗,向其他發(fā)送短消息。Uart_Printf("請輸入對方號碼(號碼長度為11位),并按回車確認!\n");len=0;gsm_[i]= for(i=0;i<11;i++) {if(gsm_[i]==0x0d}Uart_Printf("(64len=0;gsm_Recbuff[i]= for(i=0;i<64;i++) {if(gsm_Recbuff[i]==0x0d)}\n"); 1 //發(fā)送" //發(fā)送"0X1A",消息結束 0\n");LinuxRedHatLinux9.0LinuxARM-Linux該交叉編譯工具在光盤的 #cd/mnt/cdrom/toolchains#rpm–ivh*.rpm--注意:前有兩個中畫線,安裝完后修改PATH環(huán)境變量#visource/root/.bash_profilearmv,tab3)在linux操作系統(tǒng)Xwindow界面下建立終端(在桌面上點擊右鍵→新建終端,在終端的 Serialportsetup/dev/ttyS1V8W1“Enterdf1選擇“Exit”退 “/etc/minirc.df1為了退 A,Z, PCip0,NFSip1。nfs的 #vi加入/home/nfs該文件的意思是允許IP為1的機器來裝載/home/nfs這個 。Rw表示以主機上的root掛接該文件系統(tǒng)。#/etc/init.d/nfs5)關閉 /etc/init.d/iptablesNFSPCNFSServerNFSlinuxPC 下設置內核從nfs啟動令為:vivi>paramsetlinux_cmd_line“noinitrdinit=/linuxrcconsole=ttyS0root=/dev/nfsvivi>paramsave 下的內容是一致的NFSPCNFSS3C2410Linux學會使用Linux的armv4l-unknown-linux-gcc的編譯,使用NFS方式的調試。硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat (所提供的支持作出選擇。宿主機和目標板的處理器一般都不相同,宿主機為In處理器,而SAMSUNGS3C2410,GNU編譯器提供這樣的功能,在編譯編譯器時可以選擇開發(fā)所需的PCLinuxRedhatLinux,Redhat9.0PC4.1.1PCNFSTARGET假設/home/nfs/o是要調試的應用程序應程序的調試。運4.1.2#mkdiro#cdovi,viVi該實驗是在終端上打印出一個菱形,一個三角形(由*號構成)及打印以行字符o,my#include"starfun.h"#include"o.h"#include<stdio.h>intmain(){return0;}其中所包含的頭文件為:在starfun.hstar1(),star2()打印兩個三角形:#ifndefSTARFUN_H#defineSTARFUN_H NUM4 NUMBER3intstar1(){inti,j,k;for(k=1;k<=NUM;++k){printf("}return}intstar2()inti,j,k;for(k=NUMBER;k>=0;--k){printf("}return}在o.h中定義了一個函數o(),此函數中又調用了starfun()中的star1()函數#ifndef#defineO_Hvoid printf("o,my}voidshowo() }CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gccLIB=/opt/host/armv4l/libEXECOBJS=star.o$(CC)-ggdb3-I$(LIB)-o$(EXEC)star.o:starfun.h$(CC)-cstar.co.o:starfun.ho.ho.c$(CC)-co.crmf*.o.out$(EXEC)在終端上使用make–famake命令即可生成名為star的可執(zhí)行文件。makeclean–famakemake-famake注意編譯、修改程序都是在開發(fā)計算機上進行,不要 1)調 /home/nfs$mount–tnfs1:/home/nfs/mnt(IPPC改 再進入o 行剛剛編譯好的mystar程序,查看結果。$***o,my 可以反復修改、編譯、調試,不需要到開發(fā)板的過程。也可以把experiment 下的o文件拷貝到/home/nfs 經編譯好的mystar文件。LinuxIO硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 異步串行方式是將傳輸數據的每個字符一位接一位(例如先低位、后)地傳送。數據的不同位可以分時使用同一傳輸通道,因此串行I/O可以減少信號連線,最少用一對線即可進行。信息,雙方必須協(xié)調工作。在微型計算機中大量使用異步串行I/O方式,雙方使用各自的時鐘4.2.1據。每個字符的數據位長可以約定為5678ASCII110,150,300,600,1200,2400,4800,9600LinuxLinux數,實驗主要是為掌握在Linux中進行串行通信編程的基本方法。#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/stat.h>#include#include<fcntl.h> #include<termios.h> #include<errno.h> int if(fd==-1){}struct{unsignedshortc_iflags; unsignedshortc_oflags; unsignedshortc_cflags; unsignedshortc_lflags; /*localmodeflags*/unsignedshortc_line; /*linediscipline*/unsignedshortc_cc[NCC]; /*controlcharacters*/linuxmanstructtermiosopt; status= 8opt.c_cflag&=~PARENB;opt.c_cflag&=~CSIZE;opt.c_cflag|=CS8;opt.c_cflag&=~PARENB;opt.c_cflag&=~PARODD;opt.c_cflag&=~CSTOPB;opt.c_cflag&=~CSIZE;opt.c_cflag|=CS7;偶校驗(Even)7opt.c_cflag&=~PARENB;opt.c_cflag|=~PARODD;opt.c_cflag&=~CSTOPB;opt.c_cflag&=~CSIZE;opt.c_cflag|=CS7;Space7opt.c_cflag&=~PARENB;opt.c_cflag&=~CSTOPB;opt.c_cflag&=~CSIZE;opt.c_cflag|=CS7;
opt.c_cflag&=~CSTOPB;opt.c_cflag&=charbuffer[512];intwByte;wByte=write(fd,buffer,使用文件操作read函數,如果設置為原始模式(RawMode)傳輸數據,那么read函數charbuff[512];intrByte;rByte=read(fd,buff, ,使用vi編輯器或其他編輯器閱讀理解host和target下的源分別編譯host和target下的源文件,生成host_serial和target_serial可執(zhí)行文件將PC端主機的com1端口與實驗平臺的ttyS0連接,并連接好網線,在PC機上啟動NFSserver。假設主機IP為:0。 下啟 掛載PC機的 。并把target_serial可執(zhí)行文件拷貝到開發(fā)板的 下 上按下“ctrl+C”和回車鍵。出現提示符:#mount–tnfs-onolock0:/home/nfs/mnt#cd#cptarget_serial/usr#cd/usr# #cd#NFSserver學Linux下進行驅動程序的原理硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat rmmodmainmain通過使用宏module_init(初始化函數名,將初始化函數加入到內核全局初始化函數列表中,應用程序調用。驅動程序中有一個宏module_exit(退出處理函數名)退出處理函數,在驅printk<linux/module.h>。當模塊與內核連接時,insmodLinux-2.4Insmod/lib/modules和內核相關的子中查找模塊文件,如果需要從當前裝載,使用insmod./module.o。12、3、4,5、6…。查看 下的設備的主次設備號可以使用如下命令ls/devl之前Linux將設備文件放在/dev 下,設備名一般為設備文件名+數字或字母表示的子類。例如/dev/hda1、/dev/hda2。(devfs,命名規(guī)則也發(fā)生了變化,一般將主設備建立一 ,再將具體的子設備文件建立在 下file–operations{},它定義在include/linux/fs.hstructfile_operations{structmoduleloff_t(*llseek)(structfile*,loff_t,ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_structint(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);int(*mmap)(structfile*,structvm_area_struct*);int(*open)(structinode*,structfile*);int(*flush)(structfile*);int(*release)(structinode*,structfileint(*fsync)(structfile*,structdentry*,intdatasync);int(*fasync)(int,structfile*,int);int(*lock)(structfile*,int,structfile_lockssize_t(*writev)(structfile*,conststructiovec*,unsignedloff_tssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_tunsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedunsignedlong,unsigned以下是對常用接口的簡單介紹owner:modulellseek():重新定位讀寫位置,需要提供偏移量參數。read():向字符設備讀數據,需要提供字符串指針。write():向字符設備寫數據,需要提供所寫內容指針。readdir():指用于文件系統(tǒng),對設備無用。ioctl():控制設備,除讀寫操作外的其他控制命令。需要提供符合設備預先定義令open():NULL,這樣每次打開設備總會成release():關閉設備,并釋放資源等。readv():在進行讀操作之前,需要驗證地址是否可讀。在嵌入式系統(tǒng)的開發(fā)中,一般僅僅實現其中幾個接口函數:read、write、ioctl、open驅動程序的與注銷設備驅動程序可以在系統(tǒng)時初始化,也可以在需要時動態(tài)加載。字符設備初始化由 (tty_init()(lp_init()(ide_init()(floopy_init()每個字符設備或塊設備的初始化都要通過devfs_register_chrdev()devfs_register_blkdev()向內核。在關閉字符設備或塊設備時,還需要通過devfs_unregister_chrdev()devfs_unregister_blkdev()從內核中注銷設備。設備的打開與釋放開的。在大部分驅動程序中,open識別次設備號,必要則更新f_op指針lp_release(),tty_release()。釋放設備一般包括如下功能:設備的讀寫操作字符設備使用各自的read()和write(virtualconsolescreen)vcs_read()vcs_write()來進行數據讀寫的?;蛘咝枰獙懻埱髮懭朐O備,那么就需要真正地執(zhí)行數據傳輸。這是通過數據結構requeat_queuerequest_fn()來完成的。設備的讀寫操作IDEhd_ioctl(),cdrom_ioctl()。與讀寫操作不同,ioctl()floppy_ioctl():staticintfd_ioctl(structinode*inode,strucefile*filp,unsignedintcmd,unsignedlongparam);其中,cmd,FDEJECTioctl(llseek()等。設備的輪詢和中斷處理驅動程序在缺省時輪詢的狀態(tài)。#ifndef#define
#ifndefMODULE#define#include<linux/config.h>#include#include<linux/devfs_fs_kernel.h>#include<linux/init.h>#include<linux/kernel.h>/*printk()*/#include<linux/slab.h>/*kmalloc()*/#include<linux/fs.h>/*everything...*/#include<linux/errno.h>/*errorcodes*/#include<linux/types.h>/*size_t*/#include<linux/proc_fs.h>#include< tl.h>/*O_ACCMODE*/#include<linux/poll.h>/*COPY_TO_USER*/#include<asm/system.h>/*cli(),*_flags*/#defineDEVICE_NAME"mydemo"#definemydemo_MAJOR#definemydemo_MINOR0staticintMAX_BUF_LEN=1024;staticchardrv_buf[1024];staticintWRI_LENGTH=0;staticvoid{intintlen=WRI_LENGTH;chartmp;for(i=0;i<(len>>1);i++,len--){tmp=drv_buf[len-1];drv_buf[len-1]=drv_buf[i];drv_buf[i]=tmp;}}staticssize_tmydemo_write(structfile*filp,constchar*buffer,size_tcount){if(count>MAX_BUF_LEN)count=MAX_BUF_LEN;copy_from_user(drv_buf,buffer,count);{{WRI_LENGTH=printk("userwritedatatodriver\n");return}staticssize_tmydemo_read(structfile*filp,char*buffer,size_tcount,{if(count>MAX_BUF_LEN)copy_to_user(buffer,drv_buf,count);printk("userreaddatafromdriver\n");returncount;}staticintmydemo_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg){case1:printk("runingcommand1\n");break;case2:printk("runingcommand2\n");break;printk("errorcmd}return}staticintmydemo_open(structinode*inode,structfile*file){sprintf(drv_buf,"deviceopensucess!\n");printk("deviceopensucess!\n");return}staticintmydemo_release(structinode*inode,structfile*filp)printk("devicerelease\n");return0;}staticstructfile_operationsmydemo_fops={owner:THIS_MODULE,write:mydemo_write,read:mydemo_read,ioctl:mydemo_ioctl,open:mydemo_open,release:mydemo_release,#ifdefCONFIG_DEVFS_FSstaticdevfs_handle_tdevfs_demo_dir,devfs_demoraw;staticintinitmydemo_init(void){#ifdefdevfs_demo_dir=devfs_mk_dir(NULL,"mydemo",devfs_demoraw=devfs_register(devfs_demo_dir,"0",DEVFS_FL_DEFAULT,mydemo_MAJOR,mydemo_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&mydemo_fops,NULL);intresult;result=register_chrdev(mydemo_MAJOR,"scullc",&mydemo_fops);if(result<0)returnresult;//if(mydemo_MAJOR==0)mydemo_MAJOR=result;/*dynamic*/printk(DEVICE_NAME"initialized\n");return0;}staticvoidexitmydemo_exit(void)unregister_chrdev(mydemo_MAJOR,printk(DEVICE_NAME"unloaded\n");}參考MakefileKERNELDIR=/usr/src/linux-2.4INCLUDEDIR=$(KERNELDIR)/includeAS=$( LD CC=$( CPP=$(CC)-EAR NM STRIP=$( OBJCOPY OBJDUMP=$( CFLAGS+=-I..CFLAGS+=-Wall-O-DKERNEL-DMODULE-TARGET=demo_pxa.oo.otest_demoall:$(TARGET)demo_pxa.o:$(CC)-c$(CFLAGS)$^-o$@o.o:o.c$(CC)-c$(CFLAGS)$^-o$@test_demo:test_demo.o$(CC)$^-o$@install-dinstall-c$(TARGET).o$(INSTALLDIR)rm-f*.o*~core3.參考代碼test.cgcctest_demo.c–o#include<stdio.h>#include<stdlib.h>#include<fcntl.h>voidshowbuf(char*buf);intMAX_LEN=32;int{intfd;inti,j,k;charfor(i=0;i<MAX_LEN;i++){}if(fd<0){printf("####DEMOdeviceopenfail####\n");return(-1);}printf("write%dbytesdatato/dev/demo\n",MAX_LEN);printf("Read%dbytesdatafrom/dev/demo\n",MAX_LEN);}voidshowbuf(char{inti,j=0;if(i%4==0)printf("\n%4d:",j++);printf("%4d}}編譯demo.c為demo_pxa.o;編譯test_demo.c為test_demo。進入experiment/demo #makeclean#make進入/dev 下,用mknod命令建立節(jié)點:#mknod/dev/democ1990回到進入experiment/demo 所有插入的模塊,查看demo的插入情況。#硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat S3C2410的LCD控制器包括把LCD鏡像數據從系統(tǒng)內存的緩沖區(qū)轉換到外部LCD驅動器。LCD2(四級灰度掃描)4(16)模式。8(256)12(4096)STNLCD1位,248TFTLCD1624S3C2410LCDSTNTFTVSYNC(VFRAME):幀同步信號HSYNC(VLINE):行同步信號VCLK:像數時鐘信號VDEN(VM)LCDVLINE從而控制象素點的顯示或熄滅。VMVLINE4.4.7S3C2410LCD則VD[23:0LCDTIMEGENLPC3600LCD如VSYNC、HSYNC、VCLK、VDEN,然后從MUX送給LCD屏。明資料的有效,VCLK是用來鎖存資料的像數時鐘。并且在幀同步以及行同步的頭尾都(VSPW+1)+(VBPD+1就是(VFPD+1;HSYNC4.4.8TFTS3C2410LCDLCDPNRMODETFT11。ENVID:LCDlcdcon1:LCD1_BPP_16T|LCD1_PNR_TFT|TFTVSPW、VBPDVFPDlcdcon2:LCD2_VBPD(25)|LCD2_VFPD(5)|LCDlcdcon3:LCD3_HBPD(67)|LCDlcdcon4:LCD4_HSPW(31)|LCD屏的顏色信息屏控制信號的極性vline/hsync、vframe/vsync顏色信息的字節(jié)交換控制位:BSWP、lcdcon5:LCD5_FRM565|LCD5_INVVLINE|LCD5_INVVFRAME|LCD5_HWSWP|分析/drivers//s3c2410fb.cLCD驅動程序的源代碼修改驅動driver//s3c2410fb.c文件#ifdefstaticstructs3c2410fb_mach_info
initdata=::2,//度left_margin:24, upper_margin:11,right_margin: lower_margin: reg:{lcdcon1:LCD1_BPP_16T|LCD1_PNR_TFT|LCD1_CLKVAL(1),lcdcon2:LCD2_VBPD(25)|LCD2_VFPD(5)|LCD2_VSPW(1),lcdcon3:LCD3_HBPD(67)|LCD3_HFPD(40),lcdcon4:LCD4_HSPW(31)|lcdcon5:LCD5_FRM565|LCD5_INVVLINE|LCD5_INVVFRAME|LCD5_HWSWP|LCD5_PWREN,} ,運行 makedep make執(zhí)行boot命令進試:vivi>loadram 0x1c0000vivi>bootram 硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat xrxyry。rx是指xe-x0ry是指ye-y04.5.1rxrxk-6S3C2410nXPON、XMONT2、T4rx加電,xkrye-ykYPOSADCAIN[0](在實驗平臺上的實際連線10bitDxkS3C2410ADCDAT0Xpdatarxe-xkXPOSAIN[2]DykADCDAT1Ypdatax0xkrxk-x0ypykryk-yprxk-x0=rxe-x0*Vxk-x0/VEryk-y0=rye-yp*Vyk-y0Dxk=1024*Vxk-x0/VEDyk=1024*Vyk-yp/位置。要轉換成LCD像素點陣的位置,LCDKx則用下述計算:LCDKx=240*(Dxk-90)/(1022-90)LCDKy=320*(Dyk-72)/(1022-x0 LCDYLCDYs3c2410驅動初始化函數,需要完成的任務很多,有硬件初始化設置,中斷請求,設備等。static{
initinttsEvent=ret=register_chrdev(0,DEVICE_NAME,&s3c2410_fops);//設備,主if(ret<0){printk(DEVICE_NAME"can'tgetmajornumber\n");returnret;}tsMajor=/*gpio口為XP,YMYPYM*/#if0GPUP(GPIO106_nYPON)|=GPIO_bit(GPIO106_nYPON);GPUP(GPIO105_YMON)&=GPIO_bit(GPIO105_YMON);GPUP(GPIO104_nXPON)|=GPIO_bit(GPIO104_nXPON);GPUP(GPIO103_XMON)&=GPIO_bit(GPIO103_XMON);ret=request_irq(IRQ_ADC_DONE,s3c2410_isr_adc,SA_INTERRUPT,DEVICE_NAME,s3c2410_isr_adc);/*觸摸屏中斷請求,IRQ_ADC_DONE:請求的中斷號;s3c2410_isr_adc:中斷處理函數的指針;SA_INTERRUPT:這是一個與中斷管理有關的位掩碼選項;DEVICE_NAME:設備名,被用if(ret)gotoret=request_irq(IRQ_TC,s3c2410_isr_tc,SA_INTERRUPT,DEVICE_NAME,s3c2410_isr_tc);if(ret)gototc_failed; #ifdefCONFIG_DEVFS_FSdevfs_ts_dir=devfs_mk_dir(NULL,"touchscreen",devfs_tsraw=devfs_register(devfs_ts_dir,"0raw",DEVFS_FL_DEFAULT,tsMajor,TSRAW_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410_fops,#ifdefCONFIG_PM#if0tsdev.pm_dev=pm_register(PM_GP_DEV,tsdev.pm_dev=pm_register(PM_DEBUG_DEV,PM_USER_INPUT,printk(DEVICE_NAME"return0;_irq(IRQ_ADC_DONE,s3c2410_isr_adc);//釋放中斷return}設備退出函數,完成設備的注銷以及中斷的釋放staticvoidexit{#ifdefCONFIG_DEVFS_FSunregister_chrdev(tsMajor,DEVICE_NAME);//注銷設備#ifdefCONFIG_PM_irq(IRQ_ADC_DONE,s3c2410_isr_adc);_irq(IRQ_TC,} //模塊初始中斷處理函數,當觸摸屏發(fā)生時,內核捕捉該中斷后交由該函數處理。staticvoids3c2410_isr_adc(intirq,void*dev_id,structpt_regs{#ifDPRINTK("OccuredTouchScreenInterrupt\n");DPRINTK("SUBSRCPND=0x%08lx\n",spin_lock_irq(&(tsdev.lock));//提供一套鎖機制,與中斷機制來聯(lián)合保一些關鍵代碼,使其不被if(tsdev.penStatus==PEN_UP) #ifdefHOOK_FOR_DRAG}打開設備,該函數往往需要完成設備初始化和實用計數增值。staticints3c2410_ts_open(structinode*inode,structfile{tsdev.head=tsdev.tail=0;tsdev.penStatus=PEN_UP;#ifdefHOOK_FOR_DRAGts_timer.function=ts_timer_handler;tsEvent=tsEvent_raw;return}設備讀函數,*file*buffercount*pposstaticssize_ts3c2410_ts_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos){TS_RETts_ret;if(tsdev.head!=tsdev.tail){intcount;count=tsRead(&ts_ret);//設備緩存中的數if(count)copy_to_user(buffer,(char*)&ts_ret,count);returncount;}elseif(filp->f_flags&O_NONBLOCK)//非阻塞return-EAGAIN;interruptible_sleep_on(&(tsdev.wq));//安排進程進入睡眠if(signal_pending(current))return-ERESTARTSYS;gotoretry;}return}設備釋放函數staticints3c2410_ts_release(structinode*inode,structfile{#ifdefHOOK_FOR_DRAGMOD_DEC_USE_COUNT;//該宏常放在release函數中,使用計數減一。return0;}PClinuxNFSResetmizipda硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 測撫慰命令的模式,在此后的通信過程中始終是用此種通信方式。SD4.6.2:圖 SD4.6.3圖 SD卡原理SDSDSD。在CMD線上,數據傳輸的次序是先傳輸后傳低位SD卡令有四種類型帶響應廣播命令。各個卡的響應同時進行,這種類型令僅用于所用的CMD線是分CMD4.6.1SDCMDcommand[31:0]stuffSDidle[31:0]stuffSDCID線[31:0]stuff[15:0]stuffSDDSR[15:0]stuff這些情況中,卡接收到自己的CMD3RCA.[15:0]stuff特定地址的SD[15:0]stuff特定地址的SD[31:0]stuffSD[15:0]stuffSD[15:0]stuffSDSD[31:0]block[31:0]data[31:0]data連續(xù)多個[31:0]data[31:0]dataformanufacturer[31:0]stuffCSD[15:0]stuff指示SD卡,下面令是卡的特定命令而不是通用[31:1]stuffbitsformanufacturerSD表 ID(必有(可選SD特定數據寄存器,關于卡的操作條件(必有SD配置寄存器,關于卡的特征和性能(必有(必有SD錯誤校正類型,最大數據時間,是否使用DSR寄存器。通過使用命令CMD27來改變該寄存器RCA16SDSDRCA0X0000Stand-by(CMD70x404tarxzvfmmcsd.tar.gz在解壓后得到 mmcsd_core.o sdLinuxsdmountsdsd$mount–tnfs0:/home/nfs$cd$拷貝mmcsd文件夾到 $cd$cp/mmcsd/usr進入 $cd$insmod$insmod$insmodmmcsd_slot.oMMC/SDSlotinitialized$mount/dev/mmc/disc0/part1$cd$$umount掌握UDA1341TS音頻的工作原理熟悉軟件界碼編碼基本知識硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat IISIIS系結構。IIS又稱I2S,是飛利浦公司串行數字音頻總線協(xié)議。目前很多音頻和4.7.1(IISDI(IISDO(IISCLKIISCLK。S3C241034.7.1IISCONIIS表 IISCON寄存器的位描位左/右聲道指示(只讀0=左聲道1=1FIFO(只讀0=FIFO(空)1=FIFO(非空0FIFO(只讀0=FIFO(滿)1=FIFO(非滿0DMA0=1=0DMA0=1=00=IISRCLK1=00=IISRCLK1=0IIS0=1=0IIS(IIS(停止)1=IIS(開始0表 IISMOD寄存器的設IIS表 IISMOD寄存器的位描位0=主模式(IISLRCKIISCLK1=從動模式(IISLRCKIISCLK000=無轉移01=接收模式10=傳輸模式11式0=左聲道低(右聲道高)1=左聲道高(右聲道低00=IIS1=MSB(左)00=81=1600=256fs1=384fs(fs:000=16fs01=32fs10=48fs表 IISPSR寄存器的設IIS(與分頻寄存器表 IISPSR寄存器的位描位與分頻系數與分頻系數AA=MCLK/<與分頻系數與分頻系數BB=MCLK/<表 IISFCON寄存器的設表 IISFCON寄存器的位描位0=模 00=模 FIFO1=FIFO0FIFO1=FIFO0FIFO(只讀數據計數值0FIFO(只讀數據計數值0IISCONS3C2410與飛利浦公司的UDA1341T音頻的連接框圖如4.7.1所示圖 UDA1341TS音頻的連SDMA1,IISIIS給音頻。通道2用來。統(tǒng)資源是難點。在三星公司的ARM中,I/O設備的寄存器作為內存空間的一部分,可以使用普通的內存語句讀寫I/O寄存器進而控制外部設備這是該嵌入式系統(tǒng)與傳統(tǒng)的基于InPC驅動程序構架Linux驅動程序中將音頻設備按功能分成不同類型,每種類型對應不同的驅動程序。UDA1341TS音頻提供如下功能設備(audio)、混頻器(mixer)對應的設備文件分別是/dev/dsp和/dev/mixer。設備初始化和卸載register_sound_dsp()和register_sound_mixer()音頻設備和混頻器設備。這兩個函數在實現設備無關操作的邦定。在這些函數里使用的第一個參數都是structDMA、設備中斷等。三星公司的DMA控制器沒有內置DMA區(qū)域在驅動程序中必須為音頻設備分配DMA緩存DMADMA設備無關操作設備無關操作對應于File_operations指向的各個例程,讓用戶用文件的方式設open、readwriteopen例程中需要完成的任務主要是設備的初始化,包括:;dma根據采樣參數計算出緩存內段的大小(程序也可以指定緩存內段的大小音頻中的暫停和繼續(xù)。這兩個操作在ioctl接口中實現,通過對相應的IIS總線控制THGMUUDA1341TSlinux/drivers/sound/s3c2410-uda1341.cDir ,然后進入usr文件夾,在這文件夾下有pig.mp3文件,雙擊該文件,就可以聽到mp3了C,#sy/usr/pig.mp3,這樣也可以mp34.paramlinux_cmd_lineroot=dev/nfs,PCnfs/usr下加入自己喜歡的歌曲,用以上方法。1.在使用sy命令mp3時,后面緊跟的mp3文件一定帶有絕對路徑軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat 這部分驅動程序就是常說的設備驅動程序,是在主機環(huán)境中為用戶應用程序提供一個對USB外設的特定。PC圖 USB4.8.7USBUSBlinux/drivers/usb/usb-ohci-s3c2410.c打開電源,啟動實驗平臺上的Linux操作系統(tǒng)。系統(tǒng)啟動完后,在超級終端中按下“Ctrl+C圖 #mount/dev/scsi/host0/bus0/target0/lun0/part1/tmp#cd/tmp#卸載Uumount/tmp在卸載uUU
CS8900以太網控制硬件:THGMU,PC軟件:PC機操作系統(tǒng):windows+ADS+Multi-ICE和RedHat DMA網路設備的基本功能就是數據發(fā)送和接收,因此發(fā)送函數是整個網絡設備的主體。它與置。然需要了解如何通知網卡把數據發(fā)送到線。在硬件無法接收數據包時需要設置mark_bh(INET_BH)通知上一層。sk_buffnetif_rx(sk_buff)告訴內存數據所在位置。編寫這個函數的重要是過共享內存拷貝、PIO、DMA。一個網絡設備驅動程序絕不止上面幾個函數。Devicetimeout55mA;廣泛的軟件驅動;3V工業(yè)級溫度范圍;全雙工通信方式;可編程發(fā)送功能;數據碰撞自動重發(fā);自動打包及生成CRC;可編程接收功能;CPUDMARAM;提前產生中斷便于數據幀預處理;自動阻斷錯誤包;EEPROM啟動編程支持無盤系統(tǒng);邊沿掃描和回環(huán)測試;LED待機和睡眠模式;100-PINTQFP,始化配置情況,通知主機CS8900A收到了數據幀,最后用某種傳輸模式傳到主機的區(qū)中。圖 圖 IIIIIO16IREFRESHMEMW,IOR,IOW,DMACK0,DMACK1DMACK2II/OII/OII/O16OI/OI系統(tǒng)總線使能信號,低電平有OODMAIDMAIIEEPROMIEEPROMIEEPROMIOEEPROMOOI附加單元接口引腳OAUIIAUIIAUI輸入,差分輸入管腳通用引腳I硬件輸入信號,低電平有效,內部上OOOII4.99-1%kΩIIII存器和幀緩沖區(qū)映射到主機內存中連續(xù)的4KB的塊中,主機可以通過這個塊直接CS8900A初始化函數staticintinitinit_cs8900a_s3c2410(void)structnet_local*lp;intret=0;dev_cs89x0.irq=irq;dev_cs89x0.base_addr=io;dev_cs89x0.init=cs89x0_probe;dev_cs89x0.priv=kmalloc(sizeof(structnet_local),GFP_KERNEL);if(dev_cs89x0.priv==0){printk(KERN_ERR"cs89x0.c:Outofmemory.\n");return-ENOMEM;}memset(dev_cs89x0.priv,0,sizeof(structnet_local));lp=(structnet_local*)dev_cs89x0.priv;request_region(dev_cs89x0.base_addr,NETCARD_IO_EXTENT,"cs8900a");/*boy,they'dbettergettheseright*/if(!strcmp(media,"rj45")) f= F_MEDIA_10B_T| elseif(!strcmp(media,"aui")) f elseif(!strcmp(media, f= F_MEDIA_10B_2| f= F_MEDIA_10B_T| if(duplex==-1) f=if(io==0)printk(KERN_ERR"cs89x0.c:Moduleautoprobingnotallowed.\n");printk(KERN_ERR"cs89x0.c:Appendio=0xNNN\n");ret=-goto}if(register_netdev(&dev_cs89x0)!=0)printk(KERN_ERR"cs89x0.c:Nocardfoundat0x%x\n",io);ret=-ENXIO;goto}
if(ret)k(dev_cs89x0.priv);returnret;#ifdefMODULEstaticstructnet_devicedev_cs89x0={0,0,0,0,0,0,0,NULL,NULLstaticintio=0xd staticintirq=IRQ_LAN;staticcharmedia[8];staticintduplex=0;cs89x0_probe函數監(jiān)測網路物理設備是否存在,不過設備初始化是cs89x0_probe和 = =net_close;dev->tx_timeout=net_timeout;dev->watchdog_timeo=3*HZ; =net_send_packet; =net_get_stats;dev->set_multicast_list=set_multicast_list; =set_mac_address;完成上一步驟以后,通過register_netdev(structnet_device*dev)函數進行intregister_netdev(structnet_device{interr;if(strchr(dev->name,{err=dev_alloc_name(dev,dev->name);if(err<0)goto}if(dev->name[0]==0||dev->name[0]=='{err=dev_alloc_name(dev,"eth%d");if(err<0)goto}errregister_netdevice(dev);//分配設備名return}initstaticvoidexitcleanup_cs8900a_s3c2410(void){if(dev_cs89x0.priv!=NULL){/*uptheprivatestructure,orleakmemory:-) outw(PP_ChipID,dev_cs89x0.base_addr+ADD_PORT);k(dev_cs89x0.priv);dev_cs89x0.priv=NULL;/*getsre-allocatedbycs89x0_probe1/*Ifwedon'tdothis,wecan'tre-insmoditlater.*/release_region(dev_cs89x0.base_addr,}}取消網絡設備的函數是/net/core/dev.c文件中定義的unregister_netdevice函數,unregister_netdev打開函數opendownup。staticintnet_open(structnet_device{structnet_local*lp=(structnet_local*)dev->priv;intret;/*Preventthecrystalchipfromgeneratinginterrupts*/writereg(dev,PP_BusCTL,readreg(dev,PP_BusCTL)&~ENABLE_IRQ);ret=request_irq(dev->irq,&net_interrupt,SA_SHIRQ,"cs89x0",dev);if(ret){printk("%s:request_irq(%d)failed\n",dev->name,dev->irq);gotobad_out;}/*SetuptheIRQ-Apparentlymagic*/if(lp->chip_type==CS8900)writereg(dev,PP_CS8900_ISAINT,writereg(dev,PP_CS8920_ISAINT,/*whilewe'retestingtheinterface,leaveinterruptsdisabled*/writereg(dev,PP_BusCTL,MEMORY_ON);/*SettheLineCTLquintuplet*/lp->linectl=0;/*Turnonbothreceiveandtransmitoperations*/writereg(dev,PP_LineCTL,readreg(dev,PP_LineCTL)|SERIAL_RX_ON|/*Receiveonlyerrorpacketsa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 三農養(yǎng)殖業(yè)生產技術手冊
- 基于物聯(lián)網的智能醫(yī)療設備研發(fā)與應用推廣
- 開發(fā)項目委托獨家代理銷售合同
- 農村電商營銷推廣實戰(zhàn)方案及操作手冊指南
- 醫(yī)院感染防控與醫(yī)療垃圾處理指南
- 網絡故障排查與優(yōu)化手冊
- 游戲行業(yè)游戲服務器性能優(yōu)化與管理方案
- 青島2025年山東青島西海岸新區(qū)公立醫(yī)院校園招聘104人筆試歷年參考題庫附帶答案詳解
- 湖州浙江湖州長興縣機關公務用車服務中心招聘編外駕駛員筆試歷年參考題庫附帶答案詳解
- 2025年二級建造師考試《建設工程法規(guī)及相關知識》強化提分卷
- 2025年兼職銷售代表合同樣本
- 中醫(yī)養(yǎng)生知識培訓課件
- DeepSeek從入門到精通進階科普
- 2025年多旋翼無人機超視距駕駛員執(zhí)照參考試題庫500題(附答案)
- 2025年湖南高速鐵路職業(yè)技術學院單招職業(yè)技能測試題庫含答案
- 2024年資格考試-良好農業(yè)規(guī)范認證檢查員考試近5年真題集錦(頻考類試題)帶答案
- 湖北省武漢市基層診所醫(yī)療機構衛(wèi)生院社區(qū)衛(wèi)生服務中心村衛(wèi)生室地址信息
- 新員工入職健康聲明
- 小學 二年級 心理健康《你的感受我知道》心理課教案
- 半導體設備零部件公司質量檢驗
- 鋼結構工程監(jiān)理規(guī)劃(整理)
評論
0/150
提交評論