freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于mini2440的mp3播放器畢業(yè)設(shè)計(jì)(編輯修改稿)

2024-10-03 18:52 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 LINUX 系統(tǒng)移植及按鍵驅(qū)動(dòng)開(kāi)發(fā) Linux 系統(tǒng)移植 獲取 Linux 內(nèi)核源代碼 從 linux 官方網(wǎng)站下載 Linux 內(nèi)核代碼。 指定交叉編譯變量 我們移植目的是讓 可以在 mini2440 上運(yùn)行。 修改總目錄下面的 Makefile,改為: export KBUILD_BUILDHOST :=$(SUBARCH) ARCH ?= arm CROSS_COMPILE ?= armlinux 其中, ARCH 是指定目標(biāo)平臺(tái)為 arm, CROSS_COMPILE 是指定交叉編譯器,這里指定的是系統(tǒng)默認(rèn)的交叉編譯器。 內(nèi)核配置菜單中的 MINI2440 選項(xiàng) 輸入命令 make menuconfig 出現(xiàn)內(nèi)核配置菜單如圖 41: 第四章 LINUX 系統(tǒng)移植及按鍵驅(qū)動(dòng)開(kāi)發(fā) 10 圖 41 按上下鍵移動(dòng)到 System Type,按回車(chē)進(jìn)入該子菜單,如圖 42: 圖 42 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 11 再找到 S3C2440 Machines,按回車(chē)進(jìn)入該子菜單,選擇 mini2440 development 即可。 為內(nèi)核打上 yaffs2 補(bǔ)丁 進(jìn)入 yaffs2 目錄執(zhí)行: cd yaffs2 ./ /opt/FriendlyARM/mini2440/ Yaffs2 補(bǔ)丁成功打上。 配置和編譯帶 YAFFS2支持的內(nèi)核 在 lunux 內(nèi)核源代碼根目錄運(yùn)行: make menuconfig,移動(dòng)上下鍵找到 File System,如圖 43,按回車(chē)進(jìn)入該子菜單 圖 43 第四章 LINUX 系統(tǒng)移植及按鍵驅(qū)動(dòng)開(kāi)發(fā) 12 再找到“ Miscellaneous filesystem”菜單欄,按回車(chē)進(jìn)入該子菜單,如圖 44: 圖 44 出現(xiàn)如圖 45,找到“ YAFFS2 file system support”,并按空格選中它,這樣我們就在內(nèi)核中添加了 YAFFS2 文件系統(tǒng)的支持。 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 13 圖 45 在命令行輸入 make zImage 按鍵驅(qū)動(dòng)開(kāi)發(fā) 按鍵驅(qū)動(dòng)原理 Mini2440 具有 6 個(gè)用戶測(cè)試用按鍵,它們都是連接到 CPU的中斷引腳。 6個(gè)用戶按鍵分 別對(duì)應(yīng)如下表 41: 表 41 按鍵 對(duì)應(yīng)的端口寄存器 對(duì)應(yīng)的中斷 對(duì)應(yīng)的復(fù)用功能 K1 GPG0 EINT8 僅有 GPIO 和中斷功能 K2 GPG3 EINT11 nSS1 K3 GPG5 EINT13 SPISIMO K4 GPG6 EINT14 SPISIMI K5 GPG7 EINT15 SPICLK K6 GPG11 EINT19 TCLK 第四章 LINUX 系統(tǒng)移植及按鍵驅(qū)動(dòng)開(kāi)發(fā) 14 按鍵驅(qū)動(dòng)設(shè)計(jì)思路 ( 1)整體思路 按鍵的捕獲, Mini2440 是用的中斷方式,所以要對(duì)每個(gè)按鍵進(jìn)行結(jié)構(gòu)體定義,然后使用中斷服務(wù) 程序?qū)χ袛噙M(jìn)行捕獲。 ( 2) 中斷模式 Mini2440 一共有 7 種工作模式,中斷模式是其中一種,是特權(quán)模式,也是異常模式。 中斷的控制寄存器比較多,其實(shí)總開(kāi)關(guān)就在 CPSR 種的 I位和 F 位,一個(gè)是中斷允許,一個(gè)是快中斷允許。 當(dāng)一個(gè)異常模式發(fā)生時(shí)候(這里關(guān)心中斷模式), ARM core 會(huì)自動(dòng)地完成許多事情: LR 寄存器種保存上一個(gè)模式的的下一條,即將執(zhí)行的指令的地址 CPSR 值復(fù)制到異常模式的 SPSR CPSR 設(shè)置為異常模式的數(shù)值 PC的數(shù)值等于異常模式在異常向量表中的地址,即跳轉(zhuǎn)執(zhí)行 異常向量表中的指令 當(dāng)退出異常模式的時(shí)候,由軟件完成下列事情: LR的數(shù)值減去適當(dāng)?shù)臄?shù)值,賦給 PC寄存器 SPSR 復(fù)制給 CPSR 使用中斷的步驟如下: ,并且要中斷核心的程序 ISR,最后清除中斷 ,出中斷需要保存運(yùn)行環(huán)境 ,設(shè)置外設(shè) , FIQ 還是 IRQ ,設(shè)置 INTMSK 寄存器, FIQ 不受 INTMSK 影響 CPSR 中的總中斷位 IF 位 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 15 ( 3) 驅(qū)動(dòng) 程序的分析和編寫(xiě) 按鍵是利用中斷的方式進(jìn)行操作的,所以要定義一個(gè)結(jié)構(gòu)體來(lái)存放按鍵的中斷號(hào), GPIO 端口,定義鍵值,用來(lái)傳遞給應(yīng)用層讓客戶可以在寫(xiě)程序時(shí)候用到,實(shí)際代碼如下: struct button_irq_desc { int irq。 //按鍵對(duì)應(yīng)的中斷號(hào) int pin。 //按鍵所對(duì)應(yīng)的 GPIO 端口 int pin_setting。 //按鍵對(duì)應(yīng)的引腳描述,實(shí)際并未用到,保留 int number。 //定義鍵值,以傳遞給應(yīng)用層 /用戶態(tài) char *name。 //每個(gè)按鍵的名稱(chēng) }。 /*結(jié)構(gòu)體實(shí)體定義 */ static struct button_irq_desc button_irqs [] = { {IRQ_EINT8 , S3C2410_GPG(0) , S3C2410_GPG0_EINT8 , 0, KEY0}, {IRQ_EINT11, S3C2410_GPG(3) , S3C2410_GPG3_EINT11 , 1, KEY1}, {IRQ_EINT13, S3C2410_GPG(5) , S3C2410_GPG5_EINT13 , 2, KEY2}, {IRQ_EINT14, S3C2410_GPG(6) , S3C2410_GPG6_EINT14 , 3, KEY3}, }。 因?yàn)楸掘?qū)動(dòng)是基于中斷方式的,所以要?jiǎng)?chuàng)建一個(gè)等待隊(duì)列,以配合中斷函數(shù)使用;當(dāng)有按鍵按下并讀取到鍵值時(shí),將會(huì)喚醒此隊(duì)列,并設(shè)置中斷標(biāo)志,以便能通過(guò) read 函數(shù)判斷和讀取鍵值傳遞到用戶態(tài);當(dāng)沒(méi)有按鍵按下時(shí),系統(tǒng)并不會(huì)輪詢按鍵狀態(tài),以節(jié)省時(shí)鐘資源。具體實(shí)現(xiàn)代碼如下: static DECLARE_WAIT_QUEUE_HEAD(button_waitq)。 /*中斷標(biāo)識(shí)變量,配合上面的隊(duì)列使用,中斷服務(wù)程序會(huì)把它設(shè)置為 1, read 函數(shù)會(huì)把它清零 */ static volatile int ev_press = 0。 static irqreturn_t buttons_interrupt(int irq, void *dev_id) { struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id。 int down。 udelay(0)。 第四章 LINUX 系統(tǒng)移植及 按鍵驅(qū)動(dòng)開(kāi)發(fā) 16 down = !s3c2410_gpio_getpin(button_irqspin)。 if (down != (key_values[button_irqsnumber] amp。 1)) { // Changed key_values[button_irqsnumber] = 39。039。 + down。 ev_press = 1。 wake_up_interruptible(amp。button_waitq)。 } return IRQ_RETVAL(IRQ_HANDLED)。 } 在應(yīng)用程序執(zhí)行 open(“ /dev/buttons” ,? )時(shí)會(huì)調(diào)用到此函數(shù),在這里,它的作用主要是注冊(cè)按鍵的中斷。 所用的中斷類(lèi)型是 IRQ_TYPE_EDGE_BOTH,也就是雙沿觸發(fā),在上升沿和下降沿均會(huì)產(chǎn)生中斷,這樣做是為了更加有效地判斷按鍵狀態(tài)具體實(shí)現(xiàn)代碼如下: static int s3c24xx_buttons_open(struct inode *inode, struct file *file) { int i。 int err = 0。 for (i = 0。 i sizeof(button_irqs)/sizeof(button_irqs[0])。 i++) { if (button_irqs[i].irq 0) { continue。 } err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH, button_irqs[i].name, (void *)amp。button_irqs[i])。 if (err) break。 if (err) { i。 for (。 i = 0。 i) { if (button_irqs[i].irq 0) { continue。 } disable_irq(button_irqs[i].irq)。 free_irq(button_irqs[i].irq, (void *)amp。button_irqs[i])。 return EBUSY。 ev_press = 1。 return 0。 南京工業(yè)大學(xué)本科生畢業(yè)設(shè)計(jì)(論文) 17 下面這段 close(fd)函數(shù)對(duì)應(yīng)用程序的系統(tǒng)調(diào)用,在此,它的主要作用是當(dāng)關(guān)閉設(shè)備時(shí)釋放按鍵的中斷: static int s3c24xx_buttons_close(struct inode *inode, struct file *file) { int i。 for (i = 0。 i sizeof(button_irqs)/sizeof(button_irqs[0])。 i++) { if (button_irqs[i].irq 0) { continue。 } free_irq(button_irqs[i].irq, (void *)amp。button_irqs[i])。 return 0。 通過(guò)下面這段函數(shù)實(shí)現(xiàn)對(duì)按鍵的讀取,以及返回給用戶空間,是用戶空間可以對(duì)按鍵進(jìn)行使用: static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp) { unsigned long err。
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1