基于ARM11的嵌入式Linux NAND FLASH模擬U盤掛載分析與實(shí)現(xiàn)
摘要:介紹了嵌入式Linux操作系統(tǒng)下基于三星微處理器S3C6410的NAND FLASH模擬U盤的原理與實(shí)現(xiàn)方法。操作系統(tǒng)采用Linux 2.6.28版本,平臺(tái)為飛凌OK6410-A開發(fā)板。采用的方案是通過添加一個(gè)512 MB的NAND FLASH分區(qū)空間,配置Linux系統(tǒng)USB Gadget功能,實(shí)現(xiàn)劃分出的512 MB的NAND FLASH空間以U盤存儲(chǔ)系統(tǒng)與PC機(jī)通信。該方案的文獻(xiàn)目前在國(guó)內(nèi)外同等操作系統(tǒng)版本和平臺(tái)上并無先例。通過上述方案成功地實(shí)現(xiàn)了S3C6410開發(fā)板劃分出512 MB的NAND FLASH空間以U盤形式掛載到了PC機(jī)上,實(shí)現(xiàn)與PC機(jī)的信息交換。
關(guān)鍵詞:ARM11;模擬U盤;Linux;S3C6410
0 引言
現(xiàn)階段嵌入式產(chǎn)品作為U盤掛載到PC機(jī)上在各類電子產(chǎn)品中被越來越多的應(yīng)用,Linux操作系統(tǒng)在電子產(chǎn)品中的應(yīng)用也越來越廣泛,但是Linux中模擬U盤掛載到PC機(jī)中,與PC機(jī)上通用Windows的通信還很好的達(dá)到實(shí)現(xiàn)。本文基于ARM11體系結(jié)構(gòu)的處理器,實(shí)現(xiàn)了Linux系統(tǒng)下NAND FLASH模擬U盤掛載到PC機(jī)上與Windows進(jìn)行通信。并在飛凌的OK6410-A板上得到驗(yàn)證,實(shí)現(xiàn)了該功能。
目前國(guó)內(nèi)嵌入式產(chǎn)品多用ARM9體系結(jié)構(gòu),ARM11則用于高端電子產(chǎn)品,NAND FLASH模擬U盤的掛載技術(shù)雖然在電子產(chǎn)品中廣泛應(yīng)用,但是對(duì)于以新起的Linux操作系統(tǒng)的高端電子產(chǎn)品,這項(xiàng)技術(shù)還鮮少以文獻(xiàn)的形式得以系統(tǒng)闡述,國(guó)內(nèi)長(zhǎng)春大學(xué)張偉等人在這方面做過研究,但是他們是基于ARM9體系,本文基于ARM9在ARM11體系結(jié)構(gòu)的處理器上做了新的研究和應(yīng)用。
現(xiàn)階段有3類方式可以實(shí)現(xiàn)模擬U盤的功能,虛擬vfat.ing模擬U盤掛載,SD卡模擬U盤掛載,NAND FLASH模擬U盤掛載。NAND FLASH由于其大容量和高性價(jià)比,往往更加流行。本文是通過NAND FLASH實(shí)現(xiàn)模擬U盤的掛載的。
1 NAND FLASH模擬U盤原理分析
嵌入式產(chǎn)品模擬U盤與PC通信是現(xiàn)代嵌入式產(chǎn)品所廣泛應(yīng)用的一種技術(shù),因此在實(shí)現(xiàn)Linux下NAND FLASH模擬U盤之前先要對(duì)Linux下NAND
FLASH模擬U盤的原理進(jìn)行分析。Linux下對(duì)模擬U盤存儲(chǔ)設(shè)備的支持就是Linux-USB Gadget驅(qū)動(dòng)的加載,該驅(qū)動(dòng)框架實(shí)現(xiàn)了USB協(xié)議定義的設(shè)備端的軟件功能。
1.1 Linux-Gadget框架
Linux系統(tǒng)中Gadget驅(qū)動(dòng)層序框架分為3層:Gadget驅(qū)動(dòng)層;Gadget API層;UDC層。Gadget驅(qū)動(dòng)層實(shí)現(xiàn)實(shí)現(xiàn)不同的USB功能,例如“USB網(wǎng)卡”、“U盤”、“打印機(jī)”等。Gadget API層,為Gadget提供的一套標(biāo)準(zhǔn)API,由底層USB設(shè)備控制器(USB Device Controller,UDC)實(shí)現(xiàn)這套API,Gadget驅(qū)動(dòng)通過調(diào)用這些API實(shí)現(xiàn)與UDC通信。UDC是片上系統(tǒng)(SoC)的一部分,不同的UDC需要不同的驅(qū)動(dòng),同樣的UDC不同板子代碼也不一樣,這一層為平臺(tái)相關(guān)層,直接訪問訪問硬件,并向上層提供與硬件相關(guān)操作的回調(diào)函數(shù)。Gadget驅(qū)動(dòng)框架原理圖如圖1所示。
UDC層中usb_gadget和usb_ep為2個(gè)描述結(jié)構(gòu)體,分別描述UDC和端點(diǎn),Gadget API通過這兩個(gè)結(jié)構(gòu)實(shí)現(xiàn)對(duì)UDC的控制。usb_gadget_ops和usb_ep_ops為函數(shù)集結(jié)構(gòu)體,其主要功能是實(shí)現(xiàn)與硬件的交互并實(shí)現(xiàn)返回給上層Gadget API所需信息的功能。usb_gadget_register_driver和usb_gadget_unregister_driver為Gadget框架提供的標(biāo)準(zhǔn)API,是驅(qū)動(dòng)層序的注冊(cè)函數(shù),由UDC層提供,之所以不是通過Gadget API層實(shí)現(xiàn)的原因是,用于將Gadget驅(qū)動(dòng)程序綁定到UDC。xxx_udc_irq是UDC設(shè)備的中斷處理函數(shù),處理設(shè)備及其端點(diǎn)的中斷請(qǐng)求。
Gadget API層為Gadget定義的一組標(biāo)準(zhǔn)API接口函數(shù),并向上提供編程接口,這一層的存在實(shí)現(xiàn)了將下層UDC驅(qū)動(dòng)和上層Gadget驅(qū)動(dòng)程序的隔離,使得Linux系統(tǒng)中編寫USB設(shè)備側(cè)驅(qū)動(dòng)程序時(shí)能夠把功能的實(shí)現(xiàn)和底層通信分離。
Gadget驅(qū)動(dòng)程序使用usb_gadget_driver結(jié)構(gòu)體描述,實(shí)現(xiàn)將Gadget驅(qū)動(dòng)與下層設(shè)備控制器相關(guān)聯(lián),并開啟設(shè)備功能。
linux相關(guān)文章:linux教程
評(píng)論