久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

嵌入式論文關于觸摸屏設計

時間:2019-05-12 00:48:33下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《嵌入式論文關于觸摸屏設計》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《嵌入式論文關于觸摸屏設計》。

第一篇:嵌入式論文關于觸摸屏設計

嵌入式實驗課程設計

目 基于嵌入式的觸摸屏控制實驗

電子工程系

信息工程

20092309022

楊 金 磊

指導教師

董立軍

二O一二 年 六 月 八 日

目 錄

1.要求.............................................................2 1.1設計目的......................................................1 1.2 設計意義......................................................2 1.3 設計內容......................................................2 1.4 主要任務......................................................2 2.正文.............................................................3 2.1觸摸屏工作原理(觸摸屏接口工作模式)..........................3 2.2、設計總體方案.................................................4 2.3、設計所需工具.................................................5 2.4、平臺構建過程.................................................5

2.4.1、硬件平臺搭建.............................................5 2.4.2根文件系統的制作...........................................7(1)根文件系統.................................................7 3.程序............................................................11 3.1.程序流程圖:.................................................11 3.2.分析驅動.....................................................11 3.2.1、觸摸屏設備驅動中數據結構................................11 3.2.2、觸摸屏驅動模塊加載和卸載函數............................13 3.2.3、觸摸屏設備驅動的讀函數..................................15 3.2.4、觸摸屏設備驅動的輪詢與異步通知..........................15 3.2.5源程序觸摸屏驅動代碼:....................................16 3.2.6、實驗結果顯示:..........................................27 4.心得............................................................28 4.1 課程設計心得體會:...........................................28 5.參考文獻........................................................28

5.1【參考文獻】..................................錯誤!未定義書簽。

第一章 要求

1.1 設計目的

(1)基于WINDOWS操作系統,以及實驗箱,利用觸摸屏返回觸點坐標值及動作信息。

(2)坐標及動作的具體顯示:觸摸筆動作,觸點X坐標值,觸點Y坐標值。

1.2 設計意義

(1)熟悉嵌入式系統開發平臺

(2)掌握ARM嵌入式操作系統下的各個指令的使用方法(3)了解觸摸屏的原理

1.3 設計內容

(1)系統的正確移植和使用(2)根文件系統的正確移植和使用(3)驅動程序的編譯與裝載

(4)嵌入式系統下應用程序的交叉編譯及下載與調試

1.4 主要任務

(1)熟悉實驗的流程(2)理解驅動程序源代碼

(3)調用驅動程序的某些函數,編譯與調試應用程序

第二章 正文

2.1觸摸屏工作原理(觸摸屏接口工作模式)

(1)普通轉換模式

普通轉換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉換。這個模式可以通過設置ADCCON和ADCTSC來進行對AD轉換的初始化;而后讀取ADCDAT0(ADC數據寄存器0)的XPDATA域(普通ADC轉換)的值來完成轉換。(2)分離的X/Y軸坐標轉換模式:X軸坐標轉換和Y軸坐標轉換。

X軸坐標轉換(AUTO_PST=0且XY_PST=1)將X軸坐標轉換數值寫入到ADCDAT0寄存器的XPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。

Y軸坐標轉換(AUTO_PST=0且XY_PST=2)將X軸坐標轉換數值寫入到ADCDAT1寄存器的YPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。

(3)自動(連續)X/Y軸坐標轉換模式。

自動(連續)X/Y軸坐標轉換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作:

觸摸屏控制器將自動地切換X軸坐標和Y軸坐標并讀取兩個坐標軸方向上的坐標。觸摸屏控制器自動將測量得到的X軸數據寫入到ADCDAT0寄存器的XPDATA域,然后將測量到的Y軸數據到ADCDAT1的YPDATA域。自動(連續)轉換之后,觸摸屏控制器產生中斷源(INT_ADC)到中斷控制器。(4)等待中斷模式

當觸摸屏控制器處于等待中斷模式下時,它實際上是在等待觸摸筆的點擊。在觸摸筆點擊到觸摸屏上時,控制器產生中斷信號(INC_TC)。中斷產生后,就可以通過設置適當的轉換模式(分離的X/Y軸坐標轉換模式或自動X/Y軸

坐標轉換模式)來讀取X和Y的位置。(5)靜態(Standby)模式

當ADCCON寄存器的STDBM位被設為1時,Standby模式被激活。在該模式下,A/D轉換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉換所得的值。

2.2、設計總體方案

2.2.1 軟件

(1)Embest Online Flash Programmer For ARM: Embest Flash在線編程器(2)HYPER TERMINAL(超級終端):傳送vivi.nand;

傳送vivi.nand

vivi> load flash kernel x <回車> 燒寫更新內核,傳送zImage文件;等待傳送內核:

vivi>load flash root j <回車> 燒寫更新文件系統;燒寫新的文件系統 load flash root j

(3)EmbestIDE Pro for ARM: 應用于嵌入式軟件開發的新一代集成開發環境,是一個高度集成的圖形界面操作環境,包含編輯器、編譯匯編鏈接器、調試器、工程管理、Flash 編程等工具;支持的開發語言包括標準C和匯編語言。(4)cygwin: 4

一個在windows平臺上運行的unix模擬環境,它對于學習unix/linux操作環境,或者從unix到windows的應用程序移植,或者進行某些特殊的開發工作,尤其是使用gnu工具集在windows上進行嵌入式系統開發,把gcc,gdb,gas等開發工具進行了改進,能夠生成并解釋win32的目標文件。2.2.2 硬件

S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨立的16KB指令Cache和16KB數據Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2個USB主機,1個USB設備,SD主機和MMC接口,2路SPI。S3C2410處理器最高可運行在203MHz。

2.3、設計所需工具

2.3.1 軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級終端),EmbestIDE Pro for ARM,cygwin 2.3.2 硬件:s3c2410開發板,Embest實驗箱

2.4、平臺構建過程

2.4.1、硬件平臺搭建

硬件流程圖:

(1)Vivi燒寫過程

1)首先把SW104斷開,Flash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁中選擇要燒寫的文件vivi.bon&load.bin。點擊按鈕 Progarm 開始燒寫,直到燒寫成功

2)連接串口線到 PC 機 COM1,運行光盤中提供的 Windows 超級終端Hyper Terminal.ht 把開發板重新加電,程序運行后,在超級終端上可以看到串口輸出Wating,表示正在等待用戶從超級終端下載文件。這時,請點擊超級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點擊 OK 后等待下載燒寫結束即可。(2)內核zImage燒寫

1)首先SW104設為短接(從Nand Flash啟動),并確定已經燒寫vivi.nand,加電。)在vivi啟動等待中,敲入空格鍵進入vivi界面環境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內核約1分鐘即可燒寫完畢)點擊超級終端菜單中的“傳送”,選“發送文件”zImage” 并選擇xModem方式傳送)燒寫結束,重起實驗板,觀測超級終端窗口提示信息就可以啟動linux內核,(3)新文件系統的燒寫

1)首先SW104設為短接(從Nand Flash啟動),確定已經成功燒寫vivi.nand,加電運行可以看到vivi啟動信息,輸入空格進入命令狀態;

2)雙擊運行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動Embest IDE環境),點擊連接Remote connect,程序應該正在運行(命令按鈕STOP為紅色);在串口輸入help,看看有沒有反應,如果沒反應,點擊IDE 按鈕:Reset->Start(F5);再輸入help測試,直到有反應為止;

3)如果可以輸出一些信息,再點擊IDE中的Stop,配置Debug的Download地 6

址為0x30000000,并點擊IDE菜單Project選擇Settings項,在Download頁下拉Category到Download項,在Download File選擇root.cramfs文件,點擊確定后:

點擊IDE菜單DEBUG選擇Download下載文件系統映象? 下載完畢后,點擊Start(F5)然后在超級終端里輸入: load flash root j(燒寫更新文件系統)?

注意:只能在“vivi的燒寫”操作完成后,才可以按以上方法正確燒寫root映象到Nand Flash。

重起實驗板,觀測超級終端窗口提示信息,引導整個系統啟動到linux行命令輸入狀態。

2.4.2根文件系統的制作(1)根文件系統

根文件系統是Linux系統的核心部分,包含系統使用的軟件和庫,以及所有用來為用戶提供支持架構和用戶使用的應用軟件,并作為儲存數據讀寫結果的區域。在Linux系統啟動時,首先完成內核安裝及環境初始化,最后會尋找一個文件系統作為根文件系統被加載。Linux系統中使用“/”來唯一表示根文件系統的安裝路徑。嵌入式系統中通??梢詰抑母募到y有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統。

(2)cramfs文件系統

Cramfs是Linux創始人Linux torvalds開發的一個適用于嵌入式系統的小文件系統。Cramfs是一個只讀文件系統,采用zlib壓縮,壓縮比一般可以達到1:2,但仍可以做到高效的隨機讀取。Linux系統中,通常把需要修改的目錄壓縮存放,并在系統引導的時候再將壓縮文件解開。因為cramfs不會影響系統讀取文件的速度,而且是一個高度壓縮的文件系統,因此非常廣泛應用于嵌入式系統中。

(3)cygwin簡介

Cygwin是一個在windows平臺上運行的unix/Linux模擬環境,是cygnus solutions公司開發的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安裝目錄。我們常用的set_env_linux.sh中定義的目錄有:

SOURCEDIR:/tmp/edukit-2410存儲了vivi、linux、fs等源代碼和例程 WORKDIR:/usr/local/src/edukit-2410工作區。

一般情況下都要把已經規劃好的目錄結構轉換成一個映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統映象文件 root.cramfs,再固化到開發系統 FLASH 上運行。

(4)常用的Linux行命令

1)、cd 改變當前目錄(文件夾)。例如下,cd/ 返回到根目錄 cd..退回到上級目錄

cd/tmp/edukit-2410/進入/tmp/edukit-2410/文件夾 2)、ls 列出當前目錄中的內容。Ls 簡單格式列表 ls–l 使用詳細格式列表。3)、pwd 顯示當前所在的目錄。

(5)tar工具命令

tar 程序用于儲存或展開 tar 存檔文件。命令格式:

tar [-參數] [文件名][路徑]-x :extract |--get 從存檔展開文件-v :--verbose 詳細顯示處理的文件-j :--有 bz2 屬性的必須包含

-f :--file [HOSTNAME:]F 指定存檔或設備(缺省為 /dev/rmt0)

(6)解壓原文件系統(命令+解壓目錄的存放)

1)先將 root.cramfs.tar.bz2文件放在C:cygwin目錄中 2)解壓文件系統

運行cygwin,執行以下命令解壓安裝:

$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環境變量設置 $> cd /

$> tar-xvjf root.cramfs.tar.bz2 $> ls ? root ?

root文件夾中就是我們想要的cramfs文件系統 3)如果在根目錄中產生root文件夾,解壓成功 4)在root目錄中新建xx文件夾,用于存放應用程序

進入該目錄后執行以下命令編譯鏈接測試程序: $> cd root $>mkdir xx

(7)編譯應用程序 ts.c(命令+生成文件格式+存放位置): 將編寫好的ts.c程序放在C:cygwin目錄中 進入該目錄后執行以下命令編譯鏈接測試程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以編寫Makefile來編譯)

生成文件: ts 如下圖所示

將ts文件放入root 下的xx文件夾中

(8)新文件系統的制作: 把剛才編譯輸出的ts文件拷貝到文件系統所在的工作目錄root目錄下,執行以下命令生成新的文件系統映象:

$> cd /

$> mkcramfs root root.new

剛剛編譯生成的文件系統映象 root.new 中已經包含測試程序即生成文件。解壓文件系統在root目錄中新建xx文件夾,用于存放應用 將編寫好的ts.c程序放在C:cygwin目錄中 生成文件: ts 如下圖所示

新文件系統的制作

生成文件:

第三章 程序

3.1.程序流程圖:

3.2.分析驅動

觸摸屏驅動在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、觸摸屏設備驅動中數據結構

(1)觸摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//異步通知

#endif poll: s3c2410_ts_poll,//輪詢 };(2)觸摸屏設備結構體的成員與按鍵設備結構體的成員類似,也包含一個緩沖區,同時包括自旋鎖、等待隊列和fasync_struct指針 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(環形緩沖區)*/ unsigned int head, tail;/* head and tail for queued events(環形緩沖區的頭尾)*/ wait_queue_head_t wq;//* 等待隊列數據結構 spinlock_t lock;//* 自旋鎖

#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂專有的,我后面的代碼刪除了這段 #endif } TS_DEV;

(3)觸摸屏結構體中包含的TS_RET值的類型定義,包含X、Y坐標和狀態(PEN_DOWN、PEN_UP)等信息,這個信息會在用戶讀取觸摸信息時復制到用戶空 間

typedef struct { 12

unsigned short pressure;//* 壓力,這里可定義為筆按下,筆抬起,筆拖曳

unsigned short x;//* 橫坐標的采樣值 unsigned short y;//* 縱坐標的采樣值 unsigned short pad;//* 填充位 } TS_RET;

(4)在觸摸屏設備驅動中,將實現open()、release()、read()、fasync()和poll()函數,因此,其文件操作結構體定義

觸摸屏驅動文件操作結構體:static struct file_operations s3c2410fops={} _3.2.2、觸摸屏驅動模塊加載和卸載函數

(1)在觸摸屏設備驅動的模塊加載函數中,要完成申請設備號、添加cdev、申請中斷、設置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項工作 觸摸屏設備驅動的模塊加載函數

static int __init s3c2410_ts_init(void)觸摸屏設備驅動模塊卸載函數

static void __exit s3c2410_ts_exit(void)(2)可知觸摸屏驅動中會產生兩類中斷,一類是觸點中斷(INT-TC),一類是X/Y位置轉換中斷(INT-ADC)。在前一類中斷發生后,若之前處于PEN_UP狀態,則應該啟動X/Y位置轉換。另外,將抬起中斷也放在INT-TC處理程序中,它會調用tsEvent()完成等待隊列和信號的釋放 觸摸屏設備驅動的觸點/抬起中斷處理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

當X/Y位置轉換中斷發生后,應讀取X、Y的坐標值,填入緩沖區 觸摸屏設備驅動X/Y位置轉換中斷處理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)觸摸屏設備驅動中獲得X、Y坐標

static inline void s3c2410_get_XY(void)(3)tsEvent最終為tsEvent_raw(),這個函數很關鍵,當處于PEN_DOWN狀態時調用該函數,它會完成緩沖區的填充、等待隊列的喚醒以及異步通知信號的釋放;否則(處于PEN_UP狀態),將緩沖區頭清0,也喚醒等待隊列并釋放信號

觸摸屏設備驅動的tsEvent_raw()函數 static void tsEvent_raw(void)(4)在包含了對拖動軌跡支持的情況下,定時器會被啟用,周期為10ms,在每次定時器處理函數被引發時,調用start_ts_adc()開始X/Y位置轉換過程

觸摸屏設備驅動的定時器處理函數

static void tstimerhandler(unsigned long data)(5)在觸摸屏設備驅動的打開函數中,應初始化緩沖區、penStatus和定期器、等待隊列及tsEvent時間處理函數指針 觸摸屏設備驅動的打開函數

static int s3c2410tsopen(struct inode *inode, struct file *filp)

_

_

_

_ 14

(6)觸摸屏設備驅動的釋放函數非常簡單,刪除為用于拖動軌跡所使用的定時器即可

觸摸屏設備驅動的釋放函數

static int s3c2410tsrelease(struct inode *inode, struct file *filp)

_

_3.2.3、觸摸屏設備驅動的讀函數

觸摸屏設備驅動的讀函數實現緩沖區中信息向用戶空間的復制,當緩沖區有內容時,直接復制;否則,如果用戶阻塞訪問觸摸屏,則進程在等待隊列上睡眠,否則,立即返回-EAGAIN 觸摸屏設備驅動的讀函數

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, sizet count, lofft *ppos)_

_3.2.4、觸摸屏設備驅動的輪詢與異步通知

在觸摸屏設備驅動中,通過s3c2410_ts_poll()函數實現了輪詢接口,這個函數的實現非常簡單。它將等待隊列添加到poll_table,當緩沖區有數據時,返回資源可讀取標志,否則返回0 觸摸屏設備驅動的poll()函數

static unsigned int s3c2410_ts_poll(struct file *filp, struct polltablestruct *wait)而為了實現觸摸屏設備驅動對應用程序的異步通知,設備驅動中要實現s3c2410_ts_fasync()函數 觸摸屏設備驅動的fasync()函數 __

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序觸摸屏代碼:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details.* * History: * * 2002-05-27: Janghoon Lyu *PM.* */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))

static int tsMajor = 0;

static void(*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |

XP_AIN | XM_HIZ | YP_AIN | YM_GND |

XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}

static int adc_state = 0;static int x, y;/* touch screen coorinates */

static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.pressure = PEN_UP;}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if(tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }

static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);}

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;

retry: if(tsdev.head!= tsdev.tail){

int count;

count = tsRead(&ts_ret);

if(count)copy_to_user(buffer,(char *)&ts_ret, count);

return count;} else {

if(filp->f_flags & O_NONBLOCK)

return-EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if(signal_pending(current))

return-ERESTARTSYS;

goto retry;}

return sizeof(TS_RET);}

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}

static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}

static inline void s3c2410_get_XY(void){ if(adc_state == 0){

adc_state = 1;

disable_ts_adc();

y =(ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y();} else if(adc_state == 1){

adc_state = 0;

disable_ts_adc();

x =(ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);

wait_up_int();

tsEvent();} }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();

} spin_unlock_irq(&(tsdev.lock));}

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){

start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp){ tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;#endif tsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq));

MOD_INC_USE_COUNT;return 0;}

static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;} return 0;} #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(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);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);

return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}

static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}

module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);觸摸屏應用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 觸摸筆抬筆,即觸摸屏不被壓下 */ #define PEN_DOWN 1 /* 觸摸筆下筆,即觸摸屏被壓下 */ #define PEN_FLEETING 2 /* 觸摸筆拖動 */

typedef struct { unsigned short pressure;/* 觸摸筆動作 */ unsigned short x;

/* 觸點x座標值 */ unsigned short y;

/* 觸點y座標值 */ unsigned short pad;}TS_RET;

int main(){ int fd,ret,i;

unsigned char suba;TS_RET tsret;

fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打開設備 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}

while(1){

ret = read(fd,(char *)&tsret, sizeof(TS_RET));

if(ret!= sizeof(TS_RET))

{

printf(“read touch screen error!”);

close(fd);

exit(-1);

}

else

{

printf(“pressure is: %dn”, tsret.pressure);

printf(“x is: %dn”, tsret.x);

printf(“y is: %dn”, tsret.y);

} }

close(fd);return 0;} 3.3.應用程序的調試

使用s3c2410_ts.c觸摸屏驅動編寫應用程序,讀取觸摸屏的觸點坐標值及動作信息(觸點x坐標值,y坐標及是否有壓力值press),并在串口中斷打印出來

對觸摸屏設別的操作有打開設備,關閉設備,讀操作等。編寫應用程序讀取觸摸屏的觸點坐標值及動作信息時,只需利用觸摸屏驅動程序便可實現,先打開觸摸屏設備,然后調用讀函數即可。

其中,觸摸筆動作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 觸摸筆抬筆,即觸摸屏不被壓下 */ /* 觸摸筆下筆,即觸摸屏被壓下 */

#define PEN_FLEETING 2 結構體定義如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打開應用程序:

/* 觸摸筆拖動 */

/* 觸摸筆動作 */ /* 觸點x座標值 */ /* 觸點y座標值 */

3.2.6、實驗結果顯示:

第四部分 感想

第四章 心得

4.1 課程設計心得體會:

經過個人的努力和老師以及同學們的幫助和指導,我順利的完成了本次《嵌入式系統原理》課程設計。本次課程設計為我提供了一個理論與實踐相結合的機會,既鍛煉了我的動手能力,又加深理解了在課堂所學習的理論知識。通過本次課程設計,將課本上的理論知識和實際應用有機結合起來,培養了我又動腦,又動手,獨立思考分析問題的能力,提高了我運用所學知識解決實際問題的綜合素質。通過本次課程設計我明白了只有不斷的努力,不斷的學習,才能在將來遇到的問題中能夠游刃有余,才能夠不會捉襟見肘。

參考文獻 程昌南,方強等.《ARM Linux入門與實踐 》【M】.北京:北京航空航天大學出版社,2008.10 2 張曉林等.《嵌入式系統設計與實踐》【M】.北京:北京航空航天大學出版社,2006.1 3 李俊等.《嵌入式Linux設備驅動開發詳解》【M】.北京:北京人民郵電出版社,2008.3 4 黃智偉,鄧月明,王彥.《ARM9嵌入式系統設計基礎教程》.北京:北京航空航天大學出版社,2008.8

第二篇:嵌入式課程設計之觸摸屏程序設計

嵌入式課程設計

設計題目:觸摸屏驅動程序設計 班級: 學號: 姓名: 指導老師:

設計時間:2010年12月25日--12月28日

目錄

第一部分 要求................................................................................................................................1 1.1設計目的.................................................................................................................................1 1.2 設計意義................................................................................................................................1 1.3 設計內容................................................................................................................................1 1.4 主要任務................................................................................................................................1 第二部分 正文................................................................................................................................2 2.1觸摸屏工作原理(觸摸屏接口工作模式).........................................................................2 2.2、設計總體方案......................................................................................................................3 2.3、設計所需工具......................................................................................................................6 2.4、平臺構建過程......................................................................................................................6 2.4.1、硬件平臺搭建...............................................................................................................6 2.4.2根文件系統的制作..........................................................................................................8(1)根文件系統.....................................................................................................................8 第三章 程序..................................................................................................................................13 3.1.程序流程圖:.......................................................................................................................13 3.2.分析驅動...............................................................................................................................13 3.2.1、觸摸屏設備驅動中數據結構.....................................................................................13 3.2.2、觸摸屏驅動模塊加載和卸載函數.............................................................................15 3.2.3、觸摸屏設備驅動的讀函數.........................................................................................17 3.2.4、觸摸屏設備驅動的輪詢與異步通知.........................................................................17 3.2.5源程序觸摸屏驅動代碼:............................................................................................18 3.2.6、實驗結果顯示:.........................................................................................................29 第四部分 心得..............................................................................................................................30 4.1 課程設計心得體會:..........................................................................................................30 第五部分 參考文獻......................................................................................................................32 5.1【參考文獻】........................................................................................................................32

第一部分 要求

1.1 設計目的

1.基于Linux操作系統,以及Emest III實驗箱,利用觸摸屏返回觸點坐標值及動作信息。

2.坐標及動作的具體顯示:觸摸筆動作,觸點X坐標值,觸點Y坐標值。

1.2 設計意義

1.熟悉嵌入式系統開發平臺

2.掌握ARM嵌入式Linux操作系統下的各個指令的使用方法 3.了解觸摸屏的原理

1.3 設計內容

1.Linux系統的正確移植和使用 2.根文件系統的正確移植和使用 3.驅動程序的編譯與裝載

4.嵌入式系統下應用程序的交叉編譯及下載與調試

1.4 主要任務

1.熟悉實驗的流程

2.vivi,linux內核的燒寫

3.cramfs文件系統(燒寫前需編譯)的燒寫 4.理解驅動程序源代碼

5.調用驅動程序的某些函數,編譯與調試應用程序

第二部分 正文

2.1觸摸屏工作原理(觸摸屏接口工作模式)

(1)普通轉換模式

普通轉換模式(AUTO_PST = 0,XY_PST = 0)是用作一般目的下的ADC轉換。這個模式可以通過設置ADCCON和ADCTSC來進行對AD轉換的初始化;而后讀取ADCDAT0(ADC數據寄存器0)的XPDATA域(普通ADC轉換)的值來完成轉換。(2)分離的X/Y軸坐標轉換模式:X軸坐標轉換和Y軸坐標轉換。

X軸坐標轉換(AUTO_PST=0且XY_PST=1)將X軸坐標轉換數值寫入到ADCDAT0寄存器的XPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。

Y軸坐標轉換(AUTO_PST=0且XY_PST=2)將X軸坐標轉換數值寫入到ADCDAT1寄存器的YPDATA域。轉換后,觸摸屏接口將產生中斷源(INT_ADC)到中斷控制器。

(3)自動(連續)X/Y軸坐標轉換模式。

自動(連續)X/Y軸坐標轉換模式(AUTO_PST=1且XY_PST= 0)以下面的步驟工作:

觸摸屏控制器將自動地切換X軸坐標和Y軸坐標并讀取兩個坐標軸方向上的坐標。觸摸屏控制器自動將測量得到的X軸數據寫入到ADCDAT0寄存器的XPDATA域,然后將測量到的Y軸數據到ADCDAT1的YPDATA域。自動(連續)轉換之后,觸摸屏控制器產生中斷源(INT_ADC)到中斷控制器。(4)等待中斷模式

當觸摸屏控制器處于等待中斷模式下時,它實際上是在等待觸摸筆的點擊。在觸摸筆點擊到觸摸屏上時,控制器產生中斷信號(INC_TC)。中斷產生 2

后,就可以通過設置適當的轉換模式(分離的X/Y軸坐標轉換模式或自動X/Y軸坐標轉換模式)來讀取X和Y的位置。(5)靜態(Standby)模式

當ADCCON寄存器的STDBM位被設為1時,Standby模式被激活。在該模式下,A/D轉換操作停止,ADCDAT0寄存器的XPDATA域和ADCDAT1寄存器的YPDATA(正常ADC)域保持著先前轉換所得的值。

2.2、設計總體方案

1、軟件

(1)Embest Online Flash Programmer For ARM: Embest Flash在線編程器(2)HYPER TERMINAL(超級終端):傳送vivi.nand;

傳送vivi.nand

vivi> load flash kernel x <回車> 燒寫更新內核,傳送zImage文件;等待傳送內核文件

傳送內核:

vivi>load flash root j <回車> 燒寫更新文件系統;燒寫新的文件系統 load flash root j

(3)EmbestIDE Pro for ARM: 應用于嵌入式軟件開發的新一代集成開發環境,是一個高度集成的圖形界面操作環境,包含編輯器、編譯匯編鏈接器、調試器、工程管理、Flash 編程等工具;支持的開發語言包括標準C和匯編語言。(4)cygwin: 一個在windows平臺上運行的unix模擬環境,它對于學習unix/linux操作環境,或者從unix到windows的應用程序移植,或者進行某些特殊的開發工作,尤其是使用gnu工具集在windows上進行嵌 5

入式系統開發,把gcc,gdb,gas等開發工具進行了改進,能夠生成并解釋win32的目標文件。

2、硬件

S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,32位微控制器。該處理器擁有:獨立的16KB指令Cache和16KB數據Cache,MMU,支持TFT的LCD控制器,NAND閃存控制器,3路UART,4路DMA,4路帶PWM的Timer,I/O口,RTC,8路10位ADC,Touch Screen接口,IIC-BUS 接口,IIS-BUS 接口,2個USB主機,1個USB設備,SD主機和MMC接口,2路SPI。S3C2410處理器最高可運行在203MHz。

2.3、設計所需工具

1.軟件: Embest Online Flash Programmer For ARM,HYPER TERMINAL(超級終端),EmbestIDE Pro for ARM,cygwin 1.硬件:s3c2410開發板,Embest實驗箱

2.4、平臺構建過程

2.4.1、硬件平臺搭建

硬件流程圖:

(1)Vivi燒寫過程

1)首先把SW104斷開,Flash Programmer的Program,在File選擇Open打開要燒寫的配置文件S3C2410&NandFLash_vivi.cfg,在Flash Programmer的Program頁中選擇要燒寫的文件vivi.bon&load.bin。點擊按鈕 Progarm 開始燒寫,直到燒寫成功

2)連接串口線到 PC 機 COM1,運行光盤中提供的 Windows 超級終端Hyper Terminal.ht 把開發板重新加電,程序運行后,在超級終端上可以看到串口輸出Wating,表示正在等待用戶從超級終端下載文件。這時,請點擊超級終端菜單“傳送”選擇 Xmodem 方式下載 vivi.nand 文件,點擊 OK 后等待下載燒寫結束即可。(2)內核zImage燒寫

1)首先SW104設為短接(從Nand Flash啟動),并確定已經燒寫vivi.nand,加電。)在vivi啟動等待中,敲入空格鍵進入vivi界面環境,并輸入以下命令:vivi> load flash kernel x <回車> 燒寫更新內核約1分鐘即可燒寫完畢 3)點擊超級終端菜單中的“傳送”,選“發送文件”zImage” 并選擇xModem方式傳送)燒寫結束,重起實驗板,觀測超級終端窗口提示信息就可以啟動linux內核,(3)新文件系統的燒寫

1)首先SW104設為短接(從Nand Flash啟動),確定已經成功燒寫vivi.nand,加電運行可以看到vivi啟動信息,輸入空格進入命令狀態;

2)雙擊運行Download.pjf(該文件在/tmp/edukit-2410/image/中)工程(將啟動Embest IDE環境),點擊連接Remote connect,程序應該正在運行(命令按鈕STOP為紅色);在串口輸入help,看看有沒有反應,如果沒反應,點擊IDE 按鈕:Reset->Start(F5);再輸入help測試,直到有反應為止;

3)如果可以輸出一些信息,再點擊IDE中的Stop,配置Debug的Download地址為0x30000000,并點擊IDE菜單Project選擇Settings項,在Download頁下拉Category到Download項,在Download File選擇root.cramfs文件,點擊確定后:

點擊IDE菜單DEBUG選擇Download下載文件系統映象?約1分鐘

下載完畢后,點擊Start(F5)然后在超級終端里輸入: load flash root j(燒寫更新文件系統)?約1分鐘即可燒寫完畢

注意:只能在“vivi的燒寫”操作完成后,才可以按以上方法正確燒寫root映象到Nand Flash。

重起實驗板,觀測超級終端窗口提示信息,引導整個系統啟動到linux行命令輸入狀態。

2.4.2根文件系統的制作(1)根文件系統

根文件系統是Linux系統的核心部分,包含系統使用的軟件和庫,以及所有用來為用戶提供支持架構和用戶使用的應用軟件,并作為儲存數據讀寫結果的區域。在Linux系統啟動時,首先完成內核安裝及環境初始化,最后會尋找一個文件系統作為根文件系統被加載。Linux系統中使用“/”來唯一表示根文件系統的安裝路徑。嵌入式系統中通??梢詰抑母募到y有:Romfs、CRAMFS、RAMFS、JFFS2、EXT2等,甚至還可以使用NFS作為根文件系統。

(2)cramfs文件系統

Cramfs是Linux創始人Linux torvalds開發的一個適用于嵌入式系統的小文件系統。Cramfs是一個只讀文件系統,采用zlib壓縮,壓縮比一般可以達到1:2,但仍可以做到高效的隨機讀取。Linux系統中,通常把需要修改的目錄壓縮存放,并在系統引導的時候再將壓縮文件解開。因為cramfs不會影響系統讀取文件的速度,而且是一個高度壓縮的文件系統,因此非常廣泛應用于嵌入式系統中。

(3)cygwin簡介

Cygwin是一個在windows平臺上運行的unix/Linux模擬環境,是cygnus solutions公司開發的自由軟件。Cygwin中,“/”表示根目錄,即cygwin的安 8

裝目錄。我們常用的set_env_linux.sh中定義的目錄有:

SOURCEDIR:/tmp/edukit-2410存儲了vivi、linux、fs等源代碼和例程 WORKDIR:/usr/local/src/edukit-2410工作區。

一般情況下都要把已經規劃好的目錄結構轉換成一個映象文件,即使用命令工具 mkcramfs(cygwin下為 mkcramfs.exe),把相應的 cramfs 目錄樹壓縮為單一的映象文件。其命令格式為:

mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile 可以使用我們提供的 mkcramfs.exe 在 cygwin 下編譯生成文件系統映象文件 root.cramfs,再固化到開發系統 FLASH 上運行。

(4)常用的Linux行命令

1)、cd 改變當前目錄(文件夾)。例如下,cd/ 返回到根目錄 cd..退回到上級目錄

cd/tmp/edukit-2410/進入/tmp/edukit-2410/文件夾 2)、ls 列出當前目錄中的內容。Ls 簡單格式列表 ls–l 使用詳細格式列表。3)、pwd 顯示當前所在的目錄。

(5)tar工具命令

tar 程序用于儲存或展開 tar 存檔文件。命令格式:

tar [-參數] [文件名][路徑]-x :extract |--get 從存檔展開文件-v :--verbose 詳細顯示處理的文件-j :--有 bz2 屬性的必須包含

-f :--file [HOSTNAME:]F 指定存檔或設備(缺省為 /dev/rmt0)

(6)解壓原文件系統(命令+解壓目錄的存放)

1)先將 root.cramfs.tar.bz2文件放在C:cygwin目錄中

2)解壓文件系統

運行cygwin,執行以下命令解壓安裝:

$> source /tmp/edukit-2410/set_env_linux.sh? Linux編譯環境變量設置 $> cd /

$> tar-xvjf root.cramfs.tar.bz2 $> ls ? root ?

root文件夾中就是我們想要的cramfs文件系統 3)如果在根目錄中產生root文件夾,解壓成功 4)在root目錄中新建xx文件夾,用于存放應用程序

進入該目錄后執行以下命令編譯鏈接測試程序: $> cd root $>mkdir xx

(7)編譯應用程序 ts.c(命令+生成文件格式+存放位置): 將編寫好的ts.c程序放在C:cygwin目錄中 進入該目錄后執行以下命令編譯鏈接測試程序: $> cd / $> arm-linux-gcc-o ts ts.c(也可以編寫Makefile來編譯)

生成文件: ts 如下圖所示

將ts文件放入root 下的xx文件夾中

(8)新文件系統的制作: 把剛才編譯輸出的ts文件拷貝到文件系統所在的工作目錄root目錄下,執行以下命令生成新的文件系統映象: $> cd /

$> mkcramfs root root.new

剛剛編譯生成的文件系統映象 root.new 中已經包含測試程序即生成文件。解壓文件系統

解壓成功如下

在root目錄中新建xx文件夾,用于存放應用程序

將編寫好的ts.c程序放在C:cygwin目錄中

生成文件: ts 如下圖所示

新文件系統的制作

生成文件:

第三章 程序

3.1.程序流程圖:

3.2.分析驅動

觸摸屏驅動在/kernel/drivers/char/s3c2410-ts.c 文件中。

3.2.1、觸摸屏設備驅動中數據結構

(1)觸摸屏的file_operations static struct file_operations s3c2410_fops={ owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release, #ifdef USE_ASYNC fasync: s3c2410_ts_fasync,//異步通知

#endif poll: s3c2410_ts_poll,//輪詢 };(2)觸摸屏設備結構體的成員與按鍵設備結構體的成員類似,也包含一個緩沖區,同時包括自旋鎖、等待隊列和fasync_struct指針 typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun(環形緩沖區)*/ unsigned int head, tail;/* head and tail for queued events(環形緩沖區的頭尾)*/ wait_queue_head_t wq;//* 等待隊列數據結構 spinlock_t lock;//* 自旋鎖

#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;//友善之臂專有的,我后面的代碼刪除了這段 #endif } TS_DEV;

(3)觸摸屏結構體中包含的TS_RET值的類型定義,包含X、Y坐標和狀態(PEN_DOWN、PEN_UP)等信息,這個信息會在用戶讀取觸摸信息時復制到用戶空 間

typedef struct { 14

unsigned short pressure;//* 壓力,這里可定義為筆按下,筆抬起,筆拖曳

unsigned short x;//* 橫坐標的采樣值 unsigned short y;//* 縱坐標的采樣值 unsigned short pad;//* 填充位 } TS_RET;

(4)在觸摸屏設備驅動中,將實現open()、release()、read()、fasync()和poll()函數,因此,其文件操作結構體定義

觸摸屏驅動文件操作結構體:static struct file_operations s3c2410_fops={} 3.2.2、觸摸屏驅動模塊加載和卸載函數

(1)在觸摸屏設備驅動的模塊加載函數中,要完成申請設備號、添加cdev、申請中斷、設置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項工作 觸摸屏設備驅動的模塊加載函數

static int __init s3c2410_ts_init(void)觸摸屏設備驅動模塊卸載函數

static void __exit s3c2410_ts_exit(void)(2)可知觸摸屏驅動中會產生兩類中斷,一類是觸點中斷(INT-TC),一類是X/Y位置轉換中斷(INT-ADC)。在前一類中斷發生后,若之前處于PEN_UP狀態,則應該啟動X/Y位置轉換。另外,將抬起中斷也放在INT-TC處理程序中,它會調用tsEvent()完成等待隊列和信號的釋放 觸摸屏設備驅動的觸點/抬起中斷處理程序

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)

當X/Y位置轉換中斷發生后,應讀取X、Y的坐標值,填入緩沖區 觸摸屏設備驅動X/Y位置轉換中斷處理程序

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)觸摸屏設備驅動中獲得X、Y坐標

static inline void s3c2410_get_XY(void)(3)tsEvent最終為tsEvent_raw(),這個函數很關鍵,當處于PEN_DOWN狀態時調用該函數,它會完成緩沖區的填充、等待隊列的喚醒以及異步通知信號的釋放;否則(處于PEN_UP狀態),將緩沖區頭清0,也喚醒等待隊列并釋放信號

觸摸屏設備驅動的tsEvent_raw()函數 static void tsEvent_raw(void)(4)在包含了對拖動軌跡支持的情況下,定時器會被啟用,周期為10ms,在每次定時器處理函數被引發時,調用start_ts_adc()開始X/Y位置轉換過程

觸摸屏設備驅動的定時器處理函數

static void ts_timer_handler(unsigned long data)(5)在觸摸屏設備驅動的打開函數中,應初始化緩沖區、penStatus和定期器、等待隊列及tsEvent時間處理函數指針 觸摸屏設備驅動的打開函數

static int s3c2410_ts_open(struct inode *inode, struct file *filp)16

(6)觸摸屏設備驅動的釋放函數非常簡單,刪除為用于拖動軌跡所使用的定時器即可

觸摸屏設備驅動的釋放函數

static int s3c2410_ts_release(struct inode *inode, struct file *filp)3.2.3、觸摸屏設備驅動的讀函數

觸摸屏設備驅動的讀函數實現緩沖區中信息向用戶空間的復制,當緩沖區有內容時,直接復制;否則,如果用戶阻塞訪問觸摸屏,則進程在等待隊列上睡眠,否則,立即返回-EAGAIN 觸摸屏設備驅動的讀函數

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)3.2.4、觸摸屏設備驅動的輪詢與異步通知

在觸摸屏設備驅動中,通過s3c2410_ts_poll()函數實現了輪詢接口,這個函數的實現非常簡單。它將等待隊列添加到poll_table,當緩沖區有數據時,返回資源可讀取標志,否則返回0 觸摸屏設備驅動的poll()函數

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait)而為了實現觸摸屏設備驅動對應用程序的異步通知,設備驅動中要實現s3c2410_ts_fasync()函數 觸摸屏設備驅動的fasync()函數

static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)3.2.5源程序觸摸屏驅動代碼:

/* * s3c2410-ts.c * * touchScreen driver for SAMSUNG S3C2410 * * Author: Janghoon Lyu * Date : $Date: 2002/06/04 07:11:00 $ * * $Revision: 1.1.2.6 $ * * Based on pt036001b-ts.c * * This file is subject to the terms and conditions of the GNU General Public * License.See the file COPYING in the main directory of this archive * for more details.* * History: * * 2002-05-27: Janghoon Lyu *PM 內靛啊 甸絹啊 樂變 竅瘤父 拋膠飄 登瘤 臼疽瀾.* */

#include #include #include #include

#include #include #include #include #include #include #include

#include

#ifdef CONFIG_PM #include #endif

/* debug macros */ #undef DEBUG #ifdef DEBUG #define DPRINTK(x...)printk(“s3c2410-ts: ” ##x)#else #define DPRINTK(x...)#endif

#define PEN_UP 0

#define PEN_DOWN 1 #define PEN_FLEETING 2 #define MAX_TS_BUF 16 /* how many do we want to buffer */

#undef USE_ASYNC 1 #define DEVICE_NAME “s3c2410-ts” #define TSRAW_MINOR 1

typedef struct { unsigned int penStatus;/* PEN_UP, PEN_DOWN, PEN_SAMPLE */ TS_RET buf[MAX_TS_BUF];/* protect against overrun */ unsigned int head, tail;/* head and tail for queued events */ wait_queue_head_t wq;spinlock_t lock;#ifdef USE_ASYNC struct fasync_struct *aq;#endif #ifdef CONFIG_PM struct pm_dev *pm_dev;#endif } TS_DEV;

static TS_DEV tsdev;

#define BUF_HEAD(tsdev.buf[tsdev.head])#define BUF_TAIL(tsdev.buf[tsdev.tail])#define INCBUF(x,mod)((++(x))&((mod)-1))

static int tsMajor = 0;

static void(*tsEvent)(void);

#define HOOK_FOR_DRAG #ifdef HOOK_FOR_DRAG #define TS_TIMER_DELAY(HZ/100)/* 10 ms */ static struct timer_list ts_timer;#endif

#define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |

XP_AIN | XM_HIZ | YP_AIN | YM_GND |

XP_PST(WAIT_INT_MODE);} #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN | XM_HIZ |

YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE);} #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE);} #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | YM_HIZ |

XP_PULL_UP_DIS | XP_PST(NOP_MODE);} #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT | YM_GND |

XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE);} #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN5)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT0;} #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49)|

ADC_INPUT(ADC_IN7)| ADC_START_BY_RD_EN |

ADC_NORMAL_MODE;

ADCDAT1;} #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START);}

static int adc_state = 0;static int x, y;/* touch screen coorinates */

static void tsEvent_raw(void){ if(tsdev.penStatus == PEN_DOWN){

BUF_HEAD.x = x;

BUF_HEAD.y = y;

BUF_HEAD.pressure = PEN_DOWN;

#ifdef HOOK_FOR_DRAG

ts_timer.expires = jiffies + TS_TIMER_DELAY;

add_timer(&ts_timer);#endif } else { #ifdef HOOK_FOR_DRAG

del_timer(&ts_timer);#endif

BUF_HEAD.x = 0;

BUF_HEAD.y = 0;

BUF_HEAD.pressure = PEN_UP;}

tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);wake_up_interruptible(&(tsdev.wq));

#ifdef USE_ASYNC if(tsdev.aq)

kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);#endif

#ifdef CONFIG_PM pm_access(tsdev.pm_dev);#endif }

static int tsRead(TS_RET * ts_ret){ spin_lock_irq(&(tsdev.lock));ts_ret->x = BUF_TAIL.x;ts_ret->y = BUF_TAIL.y;ts_ret->pressure = BUF_TAIL.pressure;tsdev.tail = INCBUF(tsdev.tail, MAX_TS_BUF);spin_unlock_irq(&(tsdev.lock));

return sizeof(TS_RET);}

static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count, loff_t *ppos){ TS_RET ts_ret;

retry: if(tsdev.head!= tsdev.tail){

int count;

count = tsRead(&ts_ret);

if(count)copy_to_user(buffer,(char *)&ts_ret, count);

return count;} else {

if(filp->f_flags & O_NONBLOCK)

return-EAGAIN;

interruptible_sleep_on(&(tsdev.wq));

if(signal_pending(current))

return-ERESTARTSYS;

goto retry;}

return sizeof(TS_RET);}

#ifdef USE_ASYNC static int s3c2410_ts_fasync(int fd, struct file *filp, int mode){ return fasync_helper(fd, filp, mode, &(tsdev.aq));} #endif

static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait){ poll_wait(filp, &(tsdev.wq), wait);return(tsdev.head == tsdev.tail)? 0 :(POLLIN | POLLRDNORM);}

static inline void start_ts_adc(void){ adc_state = 0;mode_x_axis();start_adc_x();}

static inline void s3c2410_get_XY(void){ if(adc_state == 0){

adc_state = 1;

disable_ts_adc();

y =(ADCDAT0 & 0x3ff);

mode_y_axis();

start_adc_y();} else if(adc_state == 1){

adc_state = 0;

disable_ts_adc();

x =(ADCDAT1 & 0x3ff);

tsdev.penStatus = PEN_DOWN;

DPRINTK(“PEN DOWN: x: %08d, y: %08dn”, x, y);

wait_up_int();

tsEvent();} }

static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP)s3c2410_get_XY();#ifdef HOOK_FOR_DRAG else s3c2410_get_XY();#endif spin_unlock_irq(&(tsdev.lock));}

static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg){ #if 0 DPRINTK(“Occured Touch Screen Interruptn”);DPRINTK(“SUBSRCPND = 0x%08lxn”, SUBSRCPND);#endif spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_UP){ start_ts_adc();} else { tsdev.penStatus = PEN_UP;DPRINTK(“PEN UP: x: %08d, y: %08dn”, x, y);wait_down_int();tsEvent();

} spin_unlock_irq(&(tsdev.lock));}

#ifdef HOOK_FOR_DRAG static void ts_timer_handler(unsigned long data){ spin_lock_irq(&(tsdev.lock));if(tsdev.penStatus == PEN_DOWN){

start_ts_adc();} spin_unlock_irq(&(tsdev.lock));} #endif

static int s3c2410_ts_open(struct inode *inode, struct file *filp){ tsdev.head = tsdev.tail = 0;tsdev.penStatus = PEN_UP;#ifdef HOOK_FOR_DRAG init_timer(&ts_timer);ts_timer.function = ts_timer_handler;#endif tsEvent = tsEvent_raw;init_waitqueue_head(&(tsdev.wq));

MOD_INC_USE_COUNT;return 0;}

static int s3c2410_ts_release(struct inode *inode, struct file *filp){ #ifdef HOOK_FOR_DRAG del_timer(&ts_timer);#endif MOD_DEC_USE_COUNT;return 0;}

static struct file_operations s3c2410_fops = { owner: THIS_MODULE, open: s3c2410_ts_open, read: s3c2410_ts_read,release: s3c2410_ts_release,#ifdef USE_ASYNC fasync: s3c2410_ts_fasync, #endif poll: s3c2410_ts_poll, };

void tsEvent_dummy(void){} #ifdef CONFIG_PM static int s3c2410_ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req,void *data){ switch(req){

case PM_SUSPEND:

tsEvent = tsEvent_dummy;

break;

case PM_RESUME:

tsEvent = tsEvent_raw;

wait_down_int();

break;} return 0;} #endif

#ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_ts_dir, devfs_tsraw;#endif static int __init s3c2410_ts_init(void){ int ret;

tsEvent = tsEvent_dummy;

ret = register_chrdev(0, DEVICE_NAME, &s3c2410_fops);if(ret < 0){ printk(DEVICE_NAME “ can't get major numbern”);return ret;} tsMajor = ret;

/* set gpio to XP, YM, YP and YM */ #if 0 set_GPIO_mode(GPIO106_nYPON_MD);

set_GPIO_mode(GPIO105_YMON_MD);set_GPIO_mode(GPIO104_nXPON_MD);set_GPIO_mode(GPIO103_XMON_MD);

GPUP(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);#else set_gpio_ctrl(GPIO_YPON);set_gpio_ctrl(GPIO_YMON);set_gpio_ctrl(GPIO_XPON);set_gpio_ctrl(GPIO_XMON);#endif

/* Enable touch interrupt */ ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_adc);if(ret)goto adc_failed;ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,DEVICE_NAME, s3c2410_isr_tc);if(ret)goto tc_failed;

/* Wait for touch screen interrupts */ wait_down_int();

#ifdef CONFIG_DEVFS_FS devfs_ts_dir = devfs_mk_dir(NULL, “touchscreen”, NULL);devfs_tsraw = devfs_register(devfs_ts_dir, “0raw”, DEVFS_FL_DEFAULT,tsMajor, TSRAW_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&s3c2410_fops, NULL);#endif

#ifdef CONFIG_PM #if 0 tsdev.pm_dev = pm_register(PM_GP_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif tsdev.pm_dev = pm_register(PM_DEBUG_DEV, PM_USER_INPUT,s3c2410_ts_pm_callback);#endif printk(DEVICE_NAME “ initializedn”);

return 0;tc_failed: free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);adc_failed: return ret;}

static void __exit s3c2410_ts_exit(void){ #ifdef CONFIG_DEVFS_FS

devfs_unregister(devfs_tsraw);devfs_unregister(devfs_ts_dir);#endif unregister_chrdev(tsMajor, DEVICE_NAME);#ifdef CONFIG_PM pm_unregister(tsdev.pm_dev);#endif free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);free_irq(IRQ_TC, s3c2410_isr_tc);}

module_init(s3c2410_ts_init);module_exit(s3c2410_ts_exit);觸摸屏應用程序

#include #include #include /* 文件操作 */

#define PEN_UP 0 /* 觸摸筆抬筆,即觸摸屏不被壓下 */ #define PEN_DOWN 1 /* 觸摸筆下筆,即觸摸屏被壓下 */ #define PEN_FLEETING 2 /* 觸摸筆拖動 */

typedef struct { unsigned short pressure;/* 觸摸筆動作 */ unsigned short x;

/* 觸點x座標值 */ unsigned short y;

/* 觸點y座標值 */ unsigned short pad;}TS_RET;

int main(){ int fd,ret,i;

unsigned char suba;TS_RET tsret;

fd = open(“/dev/touchscreen/0raw”, O_RDWR);/* 打開設備 */ if(fd ==-1){ printf(“nCan't open I2C device!n”);exit(-1);}

while(1){

ret = read(fd,(char *)&tsret, sizeof(TS_RET));

if(ret!= sizeof(TS_RET))

{

printf(“read touch screen error!”);

close(fd);

exit(-1);

}

else

{

printf(“pressure is: %dn”, tsret.pressure);

printf(“x is: %dn”, tsret.x);

printf(“y is: %dn”, tsret.y);

} }

close(fd);return 0;} 3.3.應用程序的調試

使用s3c2410_ts.c觸摸屏驅動編寫應用程序,讀取觸摸屏的觸點坐標值及動作信息(觸點x坐標值,y坐標及是否有壓力值press),并在串口中斷打印出來

對觸摸屏設別的操作有打開設備,關閉設備,讀操作等。編寫應用程序讀取觸摸屏的觸點坐標值及動作信息時,只需利用觸摸屏驅動程序便可實現,先打開觸摸屏設備,然后調用讀函數即可。

其中,觸摸筆動作取值如下: #define PEN_UP 0 #define PEN_DOWN

/* 觸摸筆抬筆,即觸摸屏不被壓下 */ /* 觸摸筆下筆,即觸摸屏被壓下 */

#define PEN_FLEETING 2 結構體定義如下: typedef struct { unsigned short pressure;unsigned short x;unsigned short y;unsigned short pad;}TS_RET 打開應用程序:

/* 觸摸筆拖動 */

/* 觸摸筆動作 */ /* 觸點x座標值 */ /* 觸點y座標值 */

3.2.6、實驗結果顯示:

第四部分 感想

第四部分 心得

4.1 課程設計心得體會:

為期幾天的課程設計結束了,再次期間我積極親自實驗,用的目標板是s3c2410核心子板,用JTAG仿真器,用Cygwin模擬軟件來學習觸摸板的設計。我學會了很多,學會了很多。

首先我捫主要了解整個設計過程,以及實驗環境的建立,這次用的是交叉編譯環境,通過這次課設我更清楚搭建嵌入式系統的開發平臺,我們用的目標板是s3c2410核心子板,用JTAG仿真器,用Cygwin模擬軟件,課設的這幾天我學會了熟練的使用Cygwin軟件,掌握了一些常用的命令,加上研究生學長給我們的指導,知道了如何學習,如何思考,知道了運linux操作系統開發嵌入式與wince操作系統開發嵌入式的區別。

其次是學會vivi,內核,根文件系統的編譯與移植(燒寫),通過這個過程我熟悉了怎么把軟件固化到硬件上,知道了軟件怎么控制硬件,這個步驟很重要,要燒寫不成功,目標板系統就運行不起來,實驗就失敗了,這個過程我們練習了好多變呢,大家都很累哦!

再次我們就開始寫我們的應用程序,通過以上步驟實驗系統搭建好了,只要調試好應用程序,然后再運行成功就行了,為此我又把課本上講得觸摸屏原理那章認真看了,又看了實驗指導書,查資料,上網搜索,終于編出應用程序,經過不斷的調試才編譯成功,這個過程太辛苦了,加上實驗板不太好,真是對我們的挑戰,不過看到運行的 30

結果,大家都很高興,也很有成就感啊!還看懂了一些s3c2410的驅動程序的源代碼,了解了s3c2410一些控制器的使用,以及s3c2410A的一些接口原理與應用。

我明白了只有不斷的努力,不斷的學習,才能在將來遇到的問題中能夠游刃有余,才能夠不會捉襟見肘。

第五部分 參考文獻

5.1【參考文獻】 程昌南,方強等.《ARM Linux入門與實踐 》【M】.北京:北京航空航天大學出版社,2008.10 2 張曉林等.《嵌入式系統設計與實踐》【M】.北京:北京航空航天大學出版社,2006.1 3 李俊等.《嵌入式Linux設備驅動開發詳解》【M】.北京:北京人民郵電出版社,2008.3 4 黃智偉,鄧月明,王彥.《ARM9嵌入式系統設計基礎教程》.北京:北京航空航天大學出版社,2008.8 5 [美]Wayne Wolf.嵌入式計算系統設計原理.孫玉芳, 梁彬 羅保國 等譯.北京: 機械工業出版社, 2002 李劍, 趙鵬程, 湯建彬.32位ARM嵌入式處理器的調試技術.電子技術應用, 2003,(3)鐘漢如, 王創生.嵌入式Linux的中斷處理與實時調度的實現機制.計算機工程, 2002, 28(10)Arnold Berger.嵌入式系統設計.呂駿 譯.北京: 電子工業出版社, 2002

第三篇:嵌入式論文

信息工程學院

課程設計報告書

專 業: 電子信息科學與技術 班 級: 0312412 學 號: 031241217 學生姓名: 肖文洲 指導教師: 劉三軍

計算機專業嵌入式系統課程的研究與實踐

【摘 要】隨著電子技術的發展,嵌入式技術成為當今信息技術發展的主流技術。嵌入式技術作為高校計算機專業的一個新方向已被許多學校采用。本文通過對嵌入式技術的分析,提出了嵌入式系統課程體系建設的基本方法,包括專業培養計劃、嵌入式系統教學實踐平臺建設以及嵌入式系統教學模式與教學方法創新等。【關鍵詞】嵌入式技術;研究與實踐;計算機專業

隨著電子技術和信息技術的快速發展及嵌入式硬件技術與軟件技術的不斷成熟,嵌入式系統的應用越來越廣泛,如智能家電、手機、汽車電子、網絡通信及電子娛樂產品等,隨之而來的是社會對嵌入式產品開發人才的需求也越來越多。因此,許多高校都開設了嵌入式系統開發方面的系列課程。由于嵌入式系統課程涉及的知識面寬、實踐性強,對實驗教學的要求較高,包括實驗教師、硬件配置、實驗項目的設置等。因此,作為對新技術研究和探索最活躍的群體,高等院校如何接受嵌入式技術帶來的挑戰,盡快開設嵌入式系統的相關理論與實驗課程,并逐漸形成較規范的教學體系已成為一個重要的研究課題。

一、嵌入式系統教學的特點

設置嵌入式系統課程的目的是讓未來的軟硬件開發人員了解和掌握必要的嵌入式系統設計方法的概念、方法和工具。同時由于嵌入式系統對其他學科領域的滲透,其他相關專業的學生也有學習該課程的需求與必要。如其他電子、自動化專業都可開設相應的選修課程,在某種程度上可以提升畢業學生的競爭力、就業率。嵌入式系統課程的教學內容應包括嵌入式系統體系結構、硬件構架、軟件編程及外圍設備接口和驅動等,注重培養學生的設計能力和軟件開發能力;盡量反映該領域近年來最新的理論與技術,使學生了解學科的最新發展。嵌入式系統課程的特點是涉及知識面廣、綜合性強、實踐性強,并且學科發展快,因而學習難度大,難以形成一個簡單明確的知識體系。同時該課程講授難度很大,它要求教師不僅具備一般的計算機系統的軟硬件知識,而且需要真正從事過嵌入式系統的開發實踐,才能對嵌入式系統中的實時性等抽象概念和系統調試過程有感性認識。嵌入式系統教學主要有以下三個特點:(1)基礎性。嵌入式系統技術涉及多個專業,如計算機工程、軟件工程、工業自動控制、機電工程、精密儀器和電子工程等,嵌入式技術與各個專業相互滲透融合,將逐漸形成新的學科研究方向,因此,嵌入式系統可作為上述各專業的基礎平臺課,以強化專業基礎知識。(2)綜合性。嵌入式系統是軟件和硬件設計的完美結合。它涉及電子信息、計算機、自動控制等諸多專業相關課程的內容,如語言、微機原理、單片機設計和操作系統等課程,有很強的綜合性,因此,可以有效地對學生進行綜合能力的培養。(3)實踐性。嵌入式系統是理論與實踐結合密切的課程。實驗是嵌入式系統課程的重要組成部分,缺乏實驗的嵌入式系統課程學習是紙上談兵,因此,學生必須通過大量的實驗和實踐環節,來加深對嵌入式系統理論知識的理解。

二、適合計算機專業的嵌入式系統課程體系

嵌入式系統涉及電子、計算機、自動控制等諸多專業知識,專業性強,包括了操作系統、微機原理、編程語言程序設計、計算機網絡和接口設計等內容,是軟件、硬件的完美結合。因此,嵌入式系統的設計原理與技術不是一門課程所能講授的,需要建立一個課程體系。

嵌入式系統本身就是計算機系統。從廣義上講,目前計算機科學與技術專業的課程體系中所設置的許多專業基礎課,比如數字邏輯、C/C++程序設計、計算機網絡等,對嵌入式系統設計的學習者來說同樣重要。在此,只從狹義的角度探討嵌入式系統的課程體系設置。

由于嵌入式系統涉及的知識面廣、應用層面廣,所以應針對嵌入式系統設計與應用的不同層面的需求,設置不同層面的課程體系。從狹義上劃分,嵌入式系統課程體系可以有以下三個不同的層面: 第一層面:針對將來只是應用嵌入式系統硬件、軟件平臺來進行二次開發的學生而言,應側重培養其基于某個嵌入式系統平臺上(包括硬件平臺和軟件平臺)進行應用系統設計和開發的能力。因此,針對這一層面的學生應開設以下幾門主要課程: 《嵌入式實時操作系統》:選取一個具體的操作系統比如uCLinux為例,講授嵌入式操作系統的原理及應用,重點介紹如何進行任務劃分、如何編寫I/ O驅動程序等?!肚度胧较到y設計》:重點介紹嵌入式系統設計步驟、方法,重點介紹嵌入式應用軟件的開發技術,以及嵌入式系統的測試技術及軟件優化技術?!肚度胧骄W絡技術》:重點介紹基于嵌入式環境下的網絡通信技術及應用,比如I2C總線技術、USB接口技術、嵌入式Web技術等,掌握相關的通信技術及接口編程。

第二層面:針對將來從事嵌入式系統平臺設計及合作開發的學生而言,除需要學習上述三門課程外,還必須開設《嵌入式系統結構》課程。該課程重點介紹某個具有代表性的嵌入式CPU(如ARM系列)的系統結構、匯編指令系統、中斷管理機制、常用外圍接口,使學生掌握嵌入式平臺設計的基礎知識。前提是學生具備數字邏輯方面的相關基礎知識。對于與第一個層面相同的課程,其授課中重點也不完全一樣。比如,《嵌入式操作系統》課程可以嵌入式Linux為主,重點介紹進程調度、進程間通信、內存管理和I/O驅動機制等,使學生具備進行操作系統的裁剪、移植的基本能力。

第三層面:針對將來從事SOC(systemonChip)系統設計及開發的學生而言。主要課程有數字邏輯設計與應用、電子電路原理與PCB技術、EDA技術(FPGA設計及應用)、嵌入式系統結構、嵌入式操作系統等,偏重于底層的設計。

通過以上分析可以看出,第一層至第三層分別是嵌入式系統中由軟到硬、由高層至底層的三個不同應用層次,對應不同的知識結構需求。第一層偏軟,對底層的系統結構及接口等要求較低,是在當前比較容易實現的一個培養方向。在計算機本科專業中,軟件方向比較適合開展第一個層面的嵌入式系統教學,應用方向比較適合開展第二個層面的嵌入式系統的教學。根據以上分析,可以提出在計算機本科專業開設嵌入式系統方向需要參照的課程體 系:(1)專業基礎課:嵌入式系統概論、嵌入式系統原理與接口技術。(2)專業必修課:嵌入式操作系統、嵌入式系統應用設計。

(3)專業選修課:嵌入式網絡技術、嵌入式系統測試技術、嵌入式工程應用(即行業領域,如移動通信技術與應用、數字家庭網關技術等)、分布式嵌入式系統原理與設計等。

作為課程體系的一部分,實踐教學是嵌入式系統教學的關鍵。實踐教學設置的總體指導思想是:以培養創新動手能力為核心,建立“系統的多級課程實踐”的實驗體系,包含課程基礎實驗、課程設計、綜合項目設計;同時,以“項目為中心”設計多層次的集中實踐題目,各層次的題目難度不等,以適合不同層次的學生[4]。

(1)每門課保證至少30%以上的上機或實驗學時,完成基礎實驗項目。(2)至少有兩門課的課程設計(約兩周),如ARM匯編程序設計、操作系統移植實驗、LCD/觸摸屏等接口實驗等等。(3)至少完成一個綜合課程設計(課余時間+綜合實訓時間共約40學時),類似于一個簡單的工程項目,有設計、編程調試、性能測試等完整的步驟如手機游戲、校園導航、電子詞典、嵌入式WEB服務器等。

(4)校企合作,建立實習基地,聯合完成項目設計。

三、嵌入式系統課程體系在計算機專業的實踐

我們在分析了企業對嵌入式人才需求的基礎上,提出了“在計算機本科專業培養嵌入式系統人才”的具體實施方案,并在2007級、2008級本科生中進行了實踐。

該課程定位為實驗研究型。目標是通過嵌入式實驗平臺學習構建一個嵌入式系統的一般方法,熟悉一些常用的微處理器、存儲器、外設接口并學習軟硬件設計方法。掌握嵌入式操作系統,定制內核,編譯下載調試,編寫驅動程序和應用程序等,最后要求實現或部分實現一個具體嵌入式應用的解決方案,并在硬件平臺上實現出來。

課程的主要內容包括:(1)典型嵌入式系統的基本配置?硬/軟件綜合設計方法和流程?應用范例?(2)硬件環境微處理器?存儲器?I/O 口?外設接口和驅動?電源轉換和管理?總線?硬件調試?(3)嵌入式操作系統?操作系統內核?Linux 和uCLinux?任務和任務調度?實時 OS? GUI?API?文件系統等?(4)嵌入式網絡通過和計算機網絡結合, 開發基于網絡接的應用?(5)軟件開發過程?交叉編譯?鏈接調試?下載?板級支持包?(6)驅動程序?設備驅動機制?按鍵和觸摸屏驅動?網口驅動?紅外?USB 驅動?

實驗是嵌入式系統教學的一個比較重要的環節,實驗大綱的制定是保證課程教學大綱目標實現的一個重要環節,制定出符合學生實際的實驗大綱對計算機科學與技術專業培養目標的實現至關重要。按難易程度的不同,實驗內容分為兩個層次:基本實驗與綜合應用實驗?;緦嶒災康氖亲寣W生了解嵌入式軟件和硬件的一般開發環境與流程,進行基本的嵌入式程序開發。綜合應用實驗目的是讓學生綜合運用前面所學到的知識,按照指定的題目,自行設計開發嵌入式應用程序?;緦嶒灠ㄇ度胧杰浖_發基礎實驗、人機接口實驗、通信與音頻接口實驗、簡單驅動程序實驗和嵌入式操作系統移植實驗等。對于綜合應用實驗,給出多個題目,選擇其一,學生也可以自選題目。設備選 擇 了 北 京 博 創 公 司 所 開 發 的PXA270教學實驗平臺,由于 PXA270 性能好,實驗開發板的外圍設備又很豐富,使得實驗選題更加靈活。

課程設計及畢業設計中對所學知識的運用與提高在理論學習結束后,學生對嵌入式系統開發的各個環節有了較深入的理解與掌握。我們的方法是在課程設計和畢業設計中深化學習。課程設計中,結合實驗用開發平臺,選擇了如MP3模擬控制系統等在實際中真正是嵌入式大行其道的應用領域。在畢業設計中,我們布置了諸如“嵌入式智能控制器”,“嵌入式音頻控制器”,“內核裁減”設計等工作,這些設計要求學生從軟硬件協同設計到軟硬件的測試方法等有深刻的掌握。還有組織學生參加大學生嵌入式設計競賽等教學活動。

四、結束語

隨著嵌入式應用的迅猛發展,企業對嵌入式人才需求的缺口越來越大,越來越多的高校開始加強嵌入式系統的教學和科研,培養更多的適應社會需求嵌入式系統人才。本文所設置的針對計算機本科專業的嵌入式系統課程體系,融合了企業的需求和計算機專業的特點,符合實際應用。針對兩年實踐中存在的問題,在以后的教學中將不斷完善。

參考文獻:

[1]田澤.嵌入式系統開發與應用教程[M].北京:北京航空航天大學出版社,2005.[2]符意德.嵌入式系統教學及實驗內容的探討[J].軍工高

[3]賈志平.嵌入式系統原理與接口技術[M].北京:清華大學出版社,2004.[4]柳翔.嵌入式軟件工程人才培養的探索與實踐[J].計算機教育,2005,5.

第四篇:嵌入式課程論文

研究生課程論文

論文題目: 無線傳感網絡中的定位算法綜述

學 院: 信息科學技術學院 專 業: 儀器儀表工程

班 級: 81430 學 號: 8143035 學生姓名:

沈天穎

二○一五 年 一 月 十 日

無線傳感器網絡(WSN)是一個多學科的研究領域,具有很廣泛的應用前景,其中,WSN的定位是非常重要的研究方向。本課程論主要對WSN定位研究進行了歸納和總結。將每種定位算法按照需不需要測距分為兩大類,而且在具體算法中討論了其以下幾個特征,包括:需要/不需要錨節點、集中式/分布式、固定/移動等。

質心定位算法

DV-Hop算法

MDS-MAP算法

分簇算法

改進的無線傳感器網絡節點定位算法

第五篇:嵌入式論文總結

嵌入式論文總結

所謂嵌入式系統(Embedded Systems).實際上是“嵌入式計算機系統”的簡稱,它是相對于通用計算機系統而言的。在有些系統里也有計算機,但是計算機是作為某個專用系統中的一個部件而存在的。像這樣“嵌入”到更大、專用的系統中的計算機系統,稱之為“嵌入式計算機”、“嵌入式計算機系統”或“嵌入式系統”。

在日常生活中,早已存在許多嵌入式系統的應用,如天天必用的移動電話、帶在手腕上的電子表、烹調用的微波爐、辦公室里的打印機、汽車里的供油噴射控制系統和防抱死剎車系統(ABS).以及現在流行的個人數字助理(PDA)、數碼相機、數碼攝像機等等,它們內部都有一個中央處理器CPU。

嵌入式系統無處不在,從家庭中的洗衣機、電冰箱、小汽車,到辦公室中的遠程會議系統等,都屬于可以使用嵌入式技術進行開發和改造的產品。嵌入式系統本身是一個相對模糊的定義,一個手持的MP3和一個P(:104的微型工業控制計算機都可以認為是嵌入式系統。根據英國電氣工程師協會(IEE)的定義:嵌入式系統是用來控制或監視機器、裝置或工廠等大規模系統的設備??梢钥闯龃硕x是扶應用上考慮的,嵌入式系統是軟件和硬件的綜合體,還可以涵蓋機電等附屬裝置。國內對嵌入式系統的一般定義是:以應用為中心.以計算機技術為基礎,軟硬件可裁剪,從而能夠適應實際應用中對功能、可靠性、成本、體積、功耗等嚴格要求的專用計算機系統。

嵌入式系統在應用數量上遠遠超過了各種通用計算機。一臺通用計算機的外部設備中就包含了5~10個嵌入式微處理器,鍵盤、硬盤、顯示器、Modem、網卡、聲卡、打印機、掃描儀、數碼相機、集線器等均是由嵌入式處理器進行控制的。在制造工業、過程控制、通信、儀器、儀表、汽車、船舶、航空、航天、軍事裝備、消費類產品等方面,嵌入式系統都有用武之地。在大型嵌入式應用系統中,為了使嵌入式開發更方便、快捷,需要具備一種穩定、安全的軟件模塊集合,用來管理存儲器分配、中斷處理、任務間通信和定時器響應,以及提供多任務處理等,這樣的軟件模塊集合就是嵌入式操作系統。嵌入式操作系統的引入大大擴展了嵌入式系的功能,方便了應用軟件的設計,但同時也占用了嵌入式系統的寶貴資源。一般在比較大型或多任務的應用場合.才考慮使用嵌入式操作系統。

早期的嵌入式系統幾乎都用于控制,或多或少都有些實時要求,所以從前“嵌入式操作系統”實際上是“實時操作系統”的代名詞。近年來,由于手持式計算機和掌上電腦等設備的出現,也有了許多不帶實時要求的嵌入式系統。另一方面,由于C:PU速度的提高,一些原先被認為是“實時”的反應速度現在已經很普遍了,以前需要在“實時操作系統”上才能實現的應用,現在己不難在常規的操作系統上實現。在這樣的背景下,“嵌入式操作系統”和“實時操作系統”就成了不同的概念和名詞

嵌入式系統是應用于特定環境下、面對專業領域的應用系統,不同于通用計算機系統的多樣化和適用性。它與通用計算機系統相比具有以下特點:

(l)嵌入式系統通常是面向特定應用的,一般都有實時要求。嵌入式處理器大多工作在為特定用戶群所設計的系統中,通常具有功耗低、體積小、集成度高、成本低等特點,從而使嵌入式系統的設計趨于小型化、專業化,同時移動能力大大增強,與網絡的耦合也越來越緊密。

(2)嵌入式系統是將先進的計算機技術、半導體工藝、電子技術和通信網絡技術與各領域的具體應用相結合的產物。這一特點決定了它必然是一個技術密集、資金密集、高度分散、不斷創新的知識集成系統。

(3)嵌入式系統與具體應用有機地結合在一起,其升級換代也與具體產品同步進行。因此,嵌入式系統產品一旦進入市場,一般具有較長的生命周期。

(4)嵌入式系統的硬件和軟件都必須高效率地設計,在保證穩定、安全、可靠的基礎上,量體裁衣,去除冗余,力爭在同樣的硅片面積上實現更高的性能。這樣,才能最大限度地降低應用成本。在縣體應用中,對處理器的選擇決定了產品的市場競爭力。(5)嵌入式系統常常還有減小功耗的要求。這一方面是為了省電,因為嵌入式系統往往以電池供電;另一方面是要減少發熱量,因為嵌入式系統中常常沒有風扇等排熱手段。

(6)可靠性與穩定性對于嵌入式系統有著特別重要的意義,所以即使邏輯上的系統結構相同,在物理組成上也會有所不同。由于對所用元器件(包括接插件、電源等等)的質量和可靠性要求都比較高,所以元器件的平均無故障時間MTBF-(Mean Time Between F-ailure)成為關鍵性的參數。此外,環境溫度也是需要重點考慮的參數。

嵌入式系統以應用為中心,強調體積和功能的可裁剪性,是以完成控制、監視等功能為目標的專用系統。在嵌入式應用系統中.執行任務的軟硬件都嵌入在實際的設備環境中,通過專門的I/()接口和外界交換信息。它們執行的任務程序一般不由用戶編制。

嵌入式系統主要用于各種信號處理與控制,目前己在國防、國民經濟及社會生活各領域普遍應用操作系統OS(Operation Systems)是一組計算機程序的集合,用來有效地控制和管理計算機的硬件和軟件資源,即合理地對資源進行調度,并為用戶提供方便的應用接口。它為應用ARM9嵌入式系統設支持軟件提供運行環境,即為程序開發者提供功能強、使用方便的開發環境。

從資源管理的角度,操作系統主要包含如下功能。1.處理器管理

對處理器進行分配,并對其運行進行有效的控制和管理。在多任務環境下,合理分配由任務共享的處理器,使CPU能滿足各程序運行的需要,提高處理器的利用率,并能在恰當的時候收回分配給某任務的處理器。處理器的分配和運行都是以進程為基本單位進行的,因此對處理器的管理可以歸結為對進程的管理,包括進程控制、進程同步、進程通信、作業調度和進程調度等。2.存儲器管理

存儲器管理的主要任務,是為多道程序的運行提供良好的環境,包括內存分配、內存保護、地址映射、內存擴充等。例如,為每道程序分配必要的內存空間,使它們各得其所,且不致因互相重疊而丟失信息;不因某道程序出現異常情況而破壞其他程序的運行;方便用戶使用存儲器;提高存儲器的利用率;能從邏輯上來擴充內存等。3.設備管理

完成用戶提出的設備請求,為用戶分配l/()設備;提高C.PU和l/()的利用率;提高l/()速度.方便用戶使用l/()設備。設備管理包括緩沖管理、設備分配、設備處理、形成虛擬邏輯設備等。4.文件管理

在計算機中,大量的程序和毅據是以文件的形式存放的。文件管理的主要任務就是對系統文件和用戶文件進行管理,方便用戶的使用,保證文件的安全性。文件管理包括對文件存儲空間的管理、目錄管理、文件的讀/寫管理以及文件的共享與保護等。

5.用戶接口

用戶與操作系統的接口是用戶能方便地使用操作系統的關鍵所在。用戶通常只需以命令形式和系統調用即程序接口形式與系統打交道。使用圖形用戶接口(GUI).可以將文字、圖形和圖像集成在一起,用非常容易識別的圖標將系統的各種功能、應用程序和文件直觀地表示出來,用戶可以通過鼠標來獲取操作系統的服務。

隨著l_inux的迅速發展,嵌入式Linux現在已經有許多版本,包括強實時的嵌入式Linux(如新墨西哥工學院的RT-I_inux和堪薩斯大學的KURT-I_inux)和一般的嵌入式Linux(如riClinux和Pocket I。lnux等)。其中.RT-Iinux通過把通常的Iinux任務優先級設為最低,而所有的實時任務的優先級都高于它,以達到既兼容通常的I。Inux任務又保證強實時性能的目的。另一種常用的嵌入式Linux是riClinux.它是針對沒有MMU的處理器而設計的。它不能使用處理器的虛擬內存管理技術,對內存的訪問是直接的,所有程序中訪問的地址都是實際的物理地址。它專為嵌入式系統做了許多小型化的工作。

嵌入式系統與通用計算機在以下幾個方面有比較明顯的差別: 1.人機交互界面

嵌入式系統和通用計算機之間的最大區別就在于人機交互界面。嵌入式系統可能根本就不存在鍵盤、顯示器等設備,它所完成的事情也可能只是監視網絡情況或者傳感器的變化情況,并按照事先規定好的過程及時完成相應的處理任務。2.有限的功能

嵌入式系統的功能在設計時已經定制好,在開發完成投入使用之后就不再變化。系統將反復執行這些預定好的任務,而不像通用計算機那樣可以隨時運行新任務。雖然嵌入式操作系統可以添加新的任務,刪除舊的任務,但這樣的變化對嵌入式系統而言是關鍵性變化,有可能會對整個系統行為產生影響。3.時間關鍵性和穩定性

嵌入式系統可能要求實時響應,具有嚴格的時序性。同時,嵌入式系統還要求有非常可靠的穩定性。其工作環境可能非常惡劣,如高溫、高壓、低溫、潮濕等,這就要求在設計時考慮目標系統的工作環境,合理選擇硬件和保護措施。軟件穩定也是一個重要特征。軟件系統需要經過反復測試,達到預先規定的要求才能真正投入使用。

嵌入式軟件的開發與傳統軟件的開發有許多共同點,它繼承了許多傳統軟件的開發習慣。由于嵌入式軟件運行于特定昀目標應用環境,而該目標環境只針對特定的應用領域,所以嵌入式軟件的功能比較專一,只完成預期要完成的功能。出于對系統成本方面的考慮,應用系統的C:PU、存儲器、通信資源都恰到好處。嵌入式軟件的開發具有其自身的特點:

在Iinux的發展歷程中.Unix和Minix扮演著十分重要的角色。1990年,芬蘭人Unus 'ror-valds在赫爾辛基大學接觸到Unix;但是當時上機學習要排隊等候很長時間,所以I。inus購買了自己的PC機,希望安裝一個類似的操作系統。由于Unix的內核代碼不容易得到,所以他安裝了Minix。Minix是一個基于微內核技術的類似于Unix的操作系統,是Andrew Tanebaum教授利用業余時間開發的用于教學的操作系統。當時.Minix并不是完全免費的,而且Andrew Tane-baum教授不允許別人為Minix再加入其他東西,目的是為了教學的簡明扼要。

下載嵌入式論文關于觸摸屏設計word格式文檔
下載嵌入式論文關于觸摸屏設計.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    嵌入式系統設計論文解讀(五篇)

    嵌入式系統設計論文 專業:電子信息工程(信號處理)班級:姓名:指導教師: 評分: 年月 日 【摘要】 當今信息時代,嵌入式系統的應用無處不在,而ARM嵌入式系統應用市場份額約占75%。從嵌......

    linux串口觸摸屏設計總結

    Linux serial touch 設計總結 概述:最近在做嵌入式linux下串口觸摸屏設計,遇到一些問題,經過查找資料和請教同事,總算把問題解決了,事后有把linux相關的內核代碼仔細看了一遍,為了......

    嵌入式瀏覽器論文(合集五篇)

    嵌入式瀏覽器 摘要:近幾年,嵌入式市場迅速崛起,隨著網絡技術的迅猛發展,瀏覽器成為了很多嵌入式系統必不可少的一部分。許多公司都投入到了嵌入式瀏覽器的研究和開發中。本......

    基于觸摸屏的絲網印刷技術的設計應用

    基于MCGS觸摸屏的絲網印刷控制系統 李文鉛,劉鶴 摘要:本課題研究主要是在原有的半自動絲網印刷機的手動控制的基礎上,應用PLC控制技術、變頻控制技術、人機交互技術等設計出以......

    嵌入式系統設計中UML的應用論文(大全)

    摘要:隨著計算機技術的發展,嵌入式系統被廣泛應用到社會生產中。嵌入式計算機系統與普通的個人計算機系統存在很大區別,它具有節約成本、可靠性高等優勢,主要被用于工廠生產設備......

    嵌入式系統設計報告

    嵌入式系統設計實驗報告 班 級:學 號:姓 名:成 績:指導教師: 20090612 2009112107 侯金鐘 武俊鵬、劉書勇 1. 實驗一 1.1 實驗名稱 嵌入式系統硬件開發環境 1.2 實驗目的 1.熟......

    《嵌入式系統設計》教學大綱

    《嵌入式系統設計》課程教學大綱 嵌入式系統設計 (Design of Embedded Systems ) 一、課程教學目的和基本要求 教學目的: 嵌入式系統技術已被廣泛地應用于工業控制系統、信息......

    《嵌入式系統設計》教案

    嵌入式系統設計教案 課程總學時: 32 講課學時: 24 實驗學時: 8 授 課 人: 楊詞慧 南昌航空大學信息工程學院 目錄 1 嵌入式系統概述 ...............................................

主站蜘蛛池模板: 在线岛国片免费观看无码| 婷婷五月综合丁香在线| 欧美乱码卡一卡二卡四卡免费| 麻豆国产97在线 | 欧美| 久久亚洲色一区二区三区| 久久国产乱子伦精品免费女人| 国产成人片一区在线观看| 亚洲色欲色欲www在线看| 午夜无码片在线观看影视| 亚洲成a人v欧美综合天堂麻豆| 亚洲2020天天堂在线观看| 久久中文字幕人妻熟女凤间| 99久久无色码中文字幕人妻| 日韩a∨精品日韩在线观看| 狠狠色丁香婷婷久久综合不卡| 久久中文字幕av一区二区不卡| 国语精品自产拍在线观看网站| 中文字幕人成乱码熟女香港| 亚洲日韩精品欧美一区二区| 亚洲色偷拍另类无码专区| 欧美成人无码a区视频在线观看| 亚洲爆乳无码一区二区三区| 98色精品视频在线| 中文字幕无码一区二区免费| 欧美va亚洲va在线观看日本| 97精品国产一区二区三区四区| 亚洲久久中文字幕www网站| 国产午夜精品久久久久免费视| 亚洲国产精品va在线观看麻豆| 亚洲乱码av中文一区二区| 久久大香伊蕉在人线观看热| 7878成人国产在线观看| 美女扒开大腿让男人桶| 欧美精品人人做人人爱视频| 免费久久99精品国产自在现| 人人爽久久涩噜噜噜丁香| 婷婷色婷婷深深爱播五月| 亚洲精品久久av无码麻| 中字幕视频在线永久在线观看免费| 亚洲熟妇中文字幕日产无码| 亚洲日韩日本中文在线|