當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件

簡(jiǎn)單的介紹
打今天起菜鳥的ARM筆記算是開張了,也算給我的這些筆記找個(gè)存的地方。

為什么要發(fā)布出來(lái)?也許是大家感興趣的,其實(shí)這些筆記之所以叫筆記而不是文章,是因?yàn)樗鼈兺耆潜救藗€(gè)人學(xué)習(xí)經(jīng)驗(yàn)的總結(jié),而這些經(jīng)驗(yàn)都來(lái)自于其他前輩的無(wú)私奉獻(xiàn),在這里對(duì)這些樂(lè)于發(fā)表自己經(jīng)驗(yàn)的前輩致以由衷的感謝!現(xiàn)在我把這些前輩的文章經(jīng)過(guò)自己的理解寫出來(lái)一方面是對(duì)于他們的尊重,另一方面也希望覺(jué)得本人的筆記有參考意義的朋友把這種精神繼續(xù)傳下去。

再次聲明,本人確實(shí)是個(gè)菜鳥,現(xiàn)在手頭的板子是自己畫的,以RT&ZQ的板子為底版,對(duì)部分電路進(jìn)行了改動(dòng)。比如加入了SD卡,IIC總線鍵盤,觸摸屏,GPS,GPRS等等。并對(duì)LCD接口進(jìn)行改造,使之完全適合手頭的SHARP液晶。把網(wǎng)絡(luò),串口,USB這些調(diào)試用接口都外擴(kuò)了,目的是使主板盡量小(目前第一版為了調(diào)試方便,主板特意畫的比較大)。但是存儲(chǔ)部分(RAM ROM)沒(méi)有做任何變動(dòng),在這里對(duì)RT&ZQ致謝!

這塊板子是本人第二個(gè)板子(第一塊是個(gè)接口板,30根線。)所以走線,設(shè)計(jì)都經(jīng)不起推敲,但是同樣非常希望大家能夠指點(diǎn)!

板子基本元件清單說(shuō)一下吧,方便其他人參考

CPU:44B0

RAM:HY57V641620

ROM:AM29LV160

NET:8019

USB:D12

KEY:ZLG7290

LCD:SHARP LM7M632

目前為止本人做的工作
1 板子的硬件調(diào)試是跟著軟件來(lái)的

2 ADS AXD調(diào)試環(huán)境搭建

3 FLSH燒寫筆記

4 UBOOT移植筆記

5 UCLINUX編譯下載簡(jiǎn)單筆記

6 字符設(shè)備驅(qū)動(dòng)開發(fā)

C工程模板使用說(shuō)明

本模板用于使44B0運(yùn)行C程序
一般說(shuō)來(lái)匯編用來(lái)初始化 之后跳到C入口MAIN函數(shù)處

一、關(guān)于工程文件

1、本目錄下建工程文件(.MCP)
2、工程文件至少包含3個(gè)文件44binit.s 44blib_a.s *.c(自己的c文件)
3、44binit.s中開頭部分INCLUDE兩個(gè)文件MEMCFG.S Option.s用于基本設(shè)置
注意這兩個(gè)文件的存放目錄,即讓INCLUDE找到它們
4、以上文件除自己的c文件之外均為三星公版,不需修改

二、關(guān)于CodeWarrior設(shè)置
1、DebugRel Setting里一般設(shè)置幾項(xiàng)
1)Target Setting->Linker里選ARMLinker
用于設(shè)置連接
2)Target Setting->Post-Linker選ARM fromELF
用于生成FLASH燒錄代碼(只在RAM里運(yùn)行 而不燒錄則不用)
3)ARM Linker->RO BASE里添地址
根據(jù)板子來(lái),這板子上RAM接的NSCS6,地址0XC000000-0XC7FFFFF;
FLASH接的NSCS0,地址0X00000-0XFFFFF
地址分配原理見(jiàn)44B0數(shù)據(jù)手冊(cè)內(nèi)存管理那章的內(nèi)存分配圖

想在RAM里調(diào)試就添0XC000000(比如0XC008000)的地址
但是注意的是地址不要添過(guò)界,比如想在RAM里調(diào)試卻添0X00000000 程序可以 進(jìn)入C代碼 但沒(méi)法運(yùn)行

再有
想生成用于燒寫得FLASH代碼 RO地址就需要設(shè)置為0X0000000開始的 而且LAYOUT中也必須設(shè)置44BINIT.O為初始加載文件
以上FLASH測(cè)試結(jié)論經(jīng)FLASHPGM測(cè)試
而且FLASHPGM不支持BIN文件 只支持INTEL得HEX文件
4)RW可以添 可以不添 一般RO解釋為數(shù)據(jù)段,RW解釋為數(shù)據(jù)段
有時(shí)高興了就添上0XC100000(RAM調(diào)試時(shí))
5)ARM Linker->OPTION->Image entry point選擇0xc000000(RAM調(diào)試時(shí))
6)ARM Linker->Layout->Object/Symbol里可以添工程起始程序44BINIT.O 注意是.O不是.S和.0(零)
也可以不添

三、AXD設(shè)置
1)按照BANYANGT或者ARM7正確設(shè)置調(diào)試代理
BANYANGT、ARM7、H-JTAG都是代理,裝哪個(gè)無(wú)所謂,一般認(rèn)為BANYANGT好,但無(wú)論哪個(gè)調(diào)試之前必須運(yùn)行代理
2)在option->configure interface里 在session file 選擇 44b0.ini 這個(gè)文件是初始化44b0寄存器的,必須運(yùn)行
3)Options->Configue Target里本來(lái)有兩項(xiàng),上面上是硬件調(diào)試,下面是軟件仿真(在電腦上仿真)
用ARM7就改第一項(xiàng)(按照ARM7說(shuō)明改),用BANYANGT就按照BANYANGT說(shuō)明在下面再加個(gè)BANYANGT的驅(qū)動(dòng)
4)在general標(biāo)簽頁(yè)選擇attach,然后確定,最后在file->save session,關(guān)閉AXD(在CodeWarrior里一DEBUG就自動(dòng)打開)

四、關(guān)于JTAG
1)JTAG一般有幾種 SDT和WIGGLER 我的是WIGGLER的,兩者區(qū)別主要在并口25針定義不一樣(不算復(fù)位腳),與板子上JTAG相連的腳不是區(qū)分JTAG類型的標(biāo)志
只要和44B0對(duì)上就行
2)JTAG小板上與44B0大板上JTAH跳線RAM調(diào)試時(shí)都不用接 燒FLASH才用到
3)網(wǎng)上流傳的JTAG小板上也有不用RST信號(hào)的版本,無(wú)所謂,RST信號(hào)不是標(biāo)準(zhǔn)的

五、另外
開始的時(shí)候犯了低級(jí)錯(cuò)誤,沒(méi)設(shè)置OM1 2 3跳線 導(dǎo)致晶體不陣~~~

其他的看萬(wàn)龍的ARM開發(fā)板使用手冊(cè),寫的還不錯(cuò)
模板:user94/mamajinco/upload/825806664.rar


這部分可能過(guò)于簡(jiǎn)單,很少有人寫,但是對(duì)于不了解ARM開發(fā)過(guò)程的人真的簡(jiǎn)單嗎?我是菜鳥,在這卡了3天:)
一般說(shuō)來(lái)有幾種方法,
1)板子原來(lái)的BOOTLOADER程序或者為燒寫而編寫的專用ADS程序
比較高級(jí)而快速的方法,很多現(xiàn)成的開發(fā)板都用這種方法(相對(duì)來(lái)說(shuō)有實(shí)力的公司),此狀態(tài)下CPU是運(yùn)行的,所以速度快。
比如ZLG的,但是對(duì)于初學(xué)或者不準(zhǔn)備細(xì)研究硬件的人來(lái)說(shuō)就比較麻煩,因?yàn)橐帉懀ǜ膶懀〢DS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時(shí)并不運(yùn)行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個(gè)軟件,原因比較簡(jiǎn)單,麻煩+速度慢。
因?yàn)樾枰帉懀ǜ膶懀﹥蓚€(gè)配置文件,而且是字符界面。倒是有人說(shuō)這個(gè)軟件只能在WIN98下用的說(shuō)法好象不對(duì)(現(xiàn)在有可以讓2000和XP下用的方法)
喜歡的朋友可以用用
3)FLASHPGM(推薦)
很簡(jiǎn)單的程序,GUI界面,速度尚好。
設(shè)置很簡(jiǎn)單,在CPU里選對(duì)型號(hào),當(dāng)然是3星的44B0。在FLASH里也一樣,39LV160,29LV160都有。
確定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上)
選完了以后讀一下FLASH的ID(左下腳的按鈕吧)能讀出廠家的ID就行。
然后是燒寫了,PROGRAME按鈕,注意的是FLASHPGM不支持BIN格式,按照下面方法處理。
再有就是盡量在寫之前擦一下,PROGRAME菜單里有個(gè)選項(xiàng),打個(gè)鉤就OK。
具體燒寫方法可以看我總結(jié)的另一篇文檔,在這里只說(shuō)說(shuō)UBOOT相關(guān)的。
前面說(shuō)過(guò)UBOOT編譯以后產(chǎn)生3個(gè)文件
u-boot——ELF格式的文件,可以被大多數(shù)Debug程序識(shí)別;
u-boot.bin——二進(jìn)制bin文件,純粹的U-BOOT二進(jìn)制執(zhí)行代碼,不保存ELF格式和調(diào)試信息。這個(gè)文件一般用于燒錄到用戶開發(fā)板中;
u-boot.srec——Motorola S-Record格式,可以通過(guò)串行口下載到開發(fā)板中。
FLASHPGM不支持BIN格式的,可以燒寫u-boot——ELF格式的文件,別看它沒(méi)擴(kuò)展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現(xiàn)成的BIN文件來(lái)燒,F(xiàn)LASHPGM還提供了一個(gè)BINTOS19的程序,就在它的安裝目錄下。具體用法運(yùn)行它,它自己就告訴你了。

注意:有時(shí)(尤其是FLASH里已經(jīng)有程序的時(shí)候)0XC000000會(huì)莫名奇妙的提示內(nèi)存不可以寫,有幾個(gè)方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點(diǎn)EREASE擦除芯片,擦除一般說(shuō)來(lái)是不成功的,最后無(wú)論如何都下不去,沒(méi)關(guān)系,這時(shí)候關(guān)閉擦除對(duì)話框,然后0x10000000地址不變,燒FLASH,我一般是燒寫一個(gè)我自己寫的LED測(cè)試小程序把內(nèi)存占上:)?;貋?lái)這時(shí)候再把0X1000000換成0XC000000再按照正常操作,一般可以正常。
這現(xiàn)象的原因就是過(guò)去下的程序(多數(shù)是不正確的程序)正在運(yùn)行 占用了RAM與ROM,下個(gè)LED測(cè)試小程序就是把這幾個(gè)部分清除掉。
如果以上方法還不正常,可以用另一個(gè)程序叫FLASHP就差2個(gè)字母:)很好!在這里對(duì)這個(gè)程序的作者致敬??!
用這個(gè)軟件擦FLASH,然后再用FLASHPGM燒,原因是FLASHP擦厲害,但寫好象有些問(wèn)題~~

UBOOT 移植操作(1)
[0]目錄結(jié)構(gòu)
◆ board:和一些已有開發(fā)板有關(guān)的文件,比如Makefile和u-boot.lds等都和具體開發(fā)板的硬件和地址分配有關(guān)。
◆ common:與體系結(jié)構(gòu)無(wú)關(guān)的文件,實(shí)現(xiàn)各種命令的C文件。
◆ cpu:CPU相關(guān)文件,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個(gè)特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設(shè)置指令Cache和數(shù)據(jù)Cache等;interrupt.c設(shè)置系統(tǒng)的各種中斷和異常,比如快速中斷、開關(guān)中斷、時(shí)鐘中斷、軟件中斷、預(yù)取中止和未定義指令等;start.S是U-BOOT啟動(dòng)時(shí)執(zhí)行的第一個(gè)文件,它主要是設(shè)置系統(tǒng)堆棧和工作方式,為進(jìn)入C程序奠定基礎(chǔ)。
◆ disk:disk驅(qū)動(dòng)的分區(qū)處理代碼。
◆ doc:文檔。
◆ drivers:通用設(shè)備驅(qū)動(dòng)程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。
◆fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:頭文件,還有對(duì)各種硬件平臺(tái)支持的匯編文件,系統(tǒng)的配置文件和對(duì)文件系統(tǒng)支持的文件。
◆ net:與網(wǎng)絡(luò)有關(guān)的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實(shí)現(xiàn)。
◆ lib_arm:與ARM體系結(jié)構(gòu)相關(guān)的代碼。
◆ tools:創(chuàng)建S-Record格式文件 和U-BOOT images的工具。

==========================================================================================
[1]u-boot.1.1.2目錄下有Makefile
1)設(shè)置編譯器
可以看到這一項(xiàng):
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-

也就是說(shuō)這里所用的交叉編譯器是arm-linux-gcc,u-boot默認(rèn)是用這個(gè)的,也有用arm-elf-gcc的,arm-elf-tools-20030314.sh,用它來(lái)編譯,沒(méi)有問(wèn)題。如果最后MAKE的時(shí)候提示找不到arm-linux-gcc就是這錯(cuò)了,改一下。

arm-elf-gcc是用來(lái)編譯uClinux內(nèi)核的工具,arm-linux-gcc用來(lái)編譯LINUX
2)加進(jìn)自己板子的項(xiàng)目
搜索B2的這部分文件
B2_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 B2 dave

后面加上這部分:
TT_config : unconfig
@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
切記在@./mkconfig $(@:_config=) arm s3c44b0 TT T2T
前面的是Tab來(lái)的,TT_config : unconfig也是一樣,不能用空格代替,因?yàn)樗强窟@個(gè)來(lái)識(shí)別命令的

==========================================================================================

[2]在宿主機(jī)(PC機(jī))上建立arm-elf-gcc交叉編譯環(huán)境

1)建立arm-linux-gcc編譯環(huán)境
在RedHat Linux系統(tǒng)下以root用戶登錄,
將cross-2.95.3.tar.bz2文件復(fù)制到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個(gè)命令會(huì)在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯程序,
然后在PATH變量中添加一項(xiàng):/usr/local/arm/2.95.3/bin.
[root@localhost root]# export PATH=$PATH:/usr/local/arm/2.95.3/bin


把PATH=:$PATH:/usr/local/arm/2.95.3/bin添加到/ETC/bash_profile文件中

或者
在/etc/bashrc文件中添加一項(xiàng):
export PATH=:$PATH:/usr/local/arm/2.95.3/bin
之后可以測(cè)試一下 echo $PATH

注意:PATH大小寫不一樣,另外LINUX下大小寫是不同的,以后不特別聲明。

注意:命令中的參數(shù)之間都由單個(gè)空格或者TAB隔開,命令前有的有# 代表命令行符,不用輸入。

注意:不可在WINDOWS下用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種文件,會(huì)少文件,去LINUX下,另外解壓的時(shí)候也不用非點(diǎn)用命令行操作,LINUX現(xiàn)在對(duì)GUI已經(jīng)支持的非常好了,比如解壓只要右鍵點(diǎn)文件,選解壓到當(dāng)前文件夾就可以,執(zhí)行的時(shí)候只要雙擊再選“執(zhí)行”

注意:我用的VMWARE(虛擬機(jī))裝的LINUX,要在LINUX和WIN中間傳遞文件用VM-》SETTING里的SHARE FOLDER
該功能是把WIN 下的一個(gè)文件夾共享給LINUX。
這個(gè)功能必須裝VMWARE TOOLS才能用,
裝VMWARE TOOLS方法:首先在VM-》SETTING里CDROM項(xiàng)里把光驅(qū)設(shè)置為裝入VMWARE安裝文件夾下的LINUX工具的.ISO,LUINUX下就出現(xiàn)CDROM了 拷貝 解壓 安裝不在話下。必須注意的是VMWARE TOOLS在每次重起LINUX之后還必須也重起一下,TMD,誰(shuí)搞定不用重起告訴我一聲
重起的方法:/etc/init.d/vmware-tools restart
就有消息出來(lái)了

注意:另外郁悶的是我的WIN與LINUX之間復(fù)制文字似乎也不順暢,干脆在SHARE FOLDER里建立一個(gè)TXT,兩個(gè)系統(tǒng)搗文字玩~~

測(cè)試:
把終端關(guān)閉,重新打開后執(zhí)行如下命令:

# arm-linux-gcc –v

建立好交叉編譯環(huán)境后可以試著編譯u-boot了
2)也可以建立arm-elf-gcc
與上面類似,用周立功的編譯包直接安裝
會(huì)在/usr/local/bin下產(chǎn)生arm-elf-gcc只類的文件
然后設(shè)置路徑
[root@localhost root]# export PATH=$PATH:/usr/local/arm-elf/bin
======================================================================================================
[3] 測(cè)試交叉編譯器搞好沒(méi)有
編譯個(gè)44B0例子 在UBOOT包目錄下執(zhí)行一下命令,以下是編譯的包自帶的DAVE公司板子B2(名)
1) Make distclean (清除以前編譯的痕跡)
2) Make B2_config(B2代表B2板子的,前面見(jiàn)到過(guò))
3) Make
沒(méi)問(wèn)題就可以進(jìn)行下面了
注意:B2默認(rèn)用arm-linux-gcc編譯,要是前面安的arm-elf-gcc的話此時(shí)會(huì)報(bào)錯(cuò) 把UBOOT目錄下的MAKEFILE按照前面說(shuō)的改一下
注意:一般說(shuō)來(lái)還會(huì)有個(gè)問(wèn)題,懷疑是編譯器的問(wèn)題 提示什么abi=apcs-gnu只類的找不到吧~~記不住了
改UBOOT目錄下config.mk (好象)
文件里改成如下
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
原來(lái)的行少了$(call cc-option,-mabi=apcs-gnu,) 具體在哪行忘了 CTRL+F搜索一下
其他應(yīng)該沒(méi)問(wèn)題,有問(wèn)題GOOGLE搜一下,不是通病就是自己安裝的問(wèn)題了
注意:
MAKE之后會(huì)生成三個(gè)文件:
u-boot——ELF格式的文件,可以被大多數(shù)Debug程序識(shí)別;
u-boot.bin——二進(jìn)制bin文件,純粹的U-BOOT二進(jìn)制執(zhí)行代碼,不保存ELF格式和調(diào)試信息。這個(gè)文件一般用于燒錄到用戶開發(fā)板中;
u-boot.srec——Motorola S-Record格式,可以通過(guò)串行口下載到開發(fā)板中。

[4]開始配置U BOOT
1)給自己板子個(gè)公司起個(gè)名,我的公司叫T2T 板子叫TT,剛才那個(gè)例子公司名DAVE板子名B2
以B2板子的程序做為模板來(lái)做,省很多工作
#cd u-boot-1.1.2//進(jìn)U BOOT目錄
#cd board //進(jìn)BOARD目錄,該目錄下存放各種公司的開發(fā)板,但44B0的好象只有一種B2
#cp -R dave T2T (復(fù)制 并且改名)
#cd T2T
#mv B2 TT (復(fù)制 并且改名)
#cd TT
# mv B2.c TT.c
修改TT里面的Makefile, 把B2改成TT,編譯時(shí)如果報(bào)的其它類似找不到B2的錯(cuò)誤也是把相應(yīng)的B2改成TT來(lái)處理。
修改T2T/TT/config.mk
  TEXT_BASE = 0x0c1000000
修改T2T/TT/Makefile
  將所有的B2改為TT
2)/include/configs
cp B2.h TT.h依舊是把B2的改個(gè)名
注意:DAVE的板子是用44B0的,但還有其他板子用嗎?怎么確定只有它用?用以下命令

到board目錄查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
結(jié)果是:
./dave/B2/B2.c
B2網(wǎng)站是: http://www.dave-tech.it

3)以下文件修改記錄

----------------------------------------------------------------------------------------------------
-----------------------------------/include/configs/TT.h-------------------------------------------
----------------------------------------------------------------------------------------------------
#define CONFIG_INIT_CRITICAL 1 這個(gè)在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中調(diào)試而是固化到flash中運(yùn)行的話,這個(gè)必不可少。

找到 #define CONFIG_B2 1 改成CONFIG_TT

找到 #define CONFIG_S3C44B0_CLOCK_SPEED 75 主頻改成60

找到Size of malloc() pool這部分設(shè)置,改成這樣。

#define CFG_MONITOR_LEN (256 * 1024) /* Reserve 256 kB for Monitor */

#define CFG_ENV_SIZE (64*1024) /* 1024 bytes may be used for env vars*/

#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128*1024 )

#define CFG_GBL_DATA_SIZE 128 /* size in bytes reserved for initial data */

#define CFG_ENV_IS_IN_FLASH 1 這個(gè)必不可少,如果你想把你的參數(shù)保存到flash的話
#define CFG_ENV_ADDR (PHYS_FLASH_1+0x40000) 這個(gè)就是你的參數(shù)保存在flash里的起始地址了

#define CFG_ENV_OFFSET 0x40000 這個(gè)我后來(lái)看它源程序發(fā)現(xiàn)如果你上一步?jīng)]有設(shè)置它的起始地址的話就會(huì)用它來(lái)作默認(rèn)地址的了

#define CONFIG_AUTO_COMPLETE

其它地方?jīng)]有深究哦,有些好像不要也行,你就試試吧。

找到Hardware drivers部分,這應(yīng)該是網(wǎng)絡(luò)芯片設(shè)置吧,參考一下這個(gè)吧(要看芯片的):

#define CONFIG_DRIVER_RTL8019 這個(gè)就要看你的板上用的是什么網(wǎng)卡了(這個(gè)是臺(tái)灣出的,有10M)

#define RTL8019_BASE 0x06000300 這個(gè)是網(wǎng)卡相就寄存器的起始地址,有的掛在BANK4上了地址自然是0X08000300

以下部分我試過(guò)不要也行,你試下吧

#define RTL8019_BUS32 0

#define CONFIG_SMC_USE_16_BIT

#undef CONFIG_SHOW_ACTIVITY

#define CONFIG_NET_RETRY_COUNT 10 應(yīng)該是重試的次數(shù)吧


#define CONFIG_SERIAL 1

#define CONFIG_BAUDRATE 115200 設(shè)置波特率


#define CONFIG_COMMANDS ( CONFIG_CMD_DFL | \

CFG_CMD_DATE | \

CFG_CMD_ELF | \

CFG_CMD_NET | \

CFG_CMD_EEPROM | \

CFG_CMD_I2C | \

CFG_CMD_FAT | \

CFG_CMD_JFFS2)

把CFG_CMD_EEPROM改成CFG_CMD_FLASH吧,雖然不改也是可以的,具體沒(méi)考究。


以下是板上env參數(shù)設(shè)置,看一下吧,其實(shí)我覺(jué)得了解一下就行的了,只是一些初始設(shè)置值,以后可以用命令setenv saveenv來(lái)修改的。

#define CONFIG_BOOTDELAY 3 這個(gè)就是運(yùn)行bootcmd之前的等待時(shí)間

#define CONFIG_BOOTARGS "devfs=mount root=ramfs console=ttyS0,115200" 引導(dǎo)uClinux的時(shí)候傳遞的參數(shù),不會(huì)就先不用管它也行。

#define CONFIG_ETHADDR 00:50:c2:1e:af:fb 網(wǎng)卡的物理地址MAC

#define CONFIG_NETMASK 255.255.255.0 掩碼地址,設(shè)置過(guò)ip的人都應(yīng)該知道吧

#define CONFIG_IPADDR 192.168.0.30 這是你板上網(wǎng)卡8019的ip地址

#define CONFIG_SERVERIP 192.168.0.10 這是你宿主機(jī)的ip地址,以后用tftp下載的時(shí)候用到,一定要跟你的宿主機(jī)一致才行。

#define CONFIG_BOOTFILE "u-boot.bin" 這個(gè)就是你要下載文件的默認(rèn)名字,注意的是不是UBOOT編譯的文件 而是UBOOT下載以后在這個(gè)地址執(zhí)行這個(gè)文件,比如這個(gè)文件在下LINUX后就常被改成UCLINUC.BIN了

#define CONFIG_BOOTCOMMAND "bootm 0x50000" 這是bootdelay后運(yùn)行的命令


Miscellaneous configurable options部分,參考一下吧:

#define CFG_LONGHELP /* undef to save memory */

#define CFG_PROMPT "TENWAY=>" 這是進(jìn)入命令模式下的提示符,改個(gè)帥一點(diǎn)的吧

#define CFG_CBSIZE 256 /* Console I/O Buffer Size */

#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /* Print Buffer Size */

#define CFG_MAXARGS 100 /* max number of command args */

#define CFG_BARGSIZE CFG_CBSIZE /* Boot Argument Buffer Size */


#define CFG_MEMTEST_START 0x0C400000 /* memtest works on */

#define CFG_MEMTEST_END 0x0C800000 /* 4 ... 8 MB in DRAM */

#undef CFG_CLKS_IN_HZ /* everything, incl board info, in Hz */

#define CFG_LOAD_ADDR 0x0c008000 默認(rèn)的下載地址

#define CFG_HZ 1000 /* 1 kHz */

#define CFG_BAUDRATE_TABLE { 9600, 19200, 38400, 57600, 115200 } 可供選擇的波特率

Physical Memory Map部分,比較重要,修改你的sdram和flash的地址和容量。

#define CONFIG_NR_DRAM_BANKS 1 我們只占用了一個(gè)Bank用來(lái)映射sdram

#define PHYS_SDRAM_1 0x0c000000 sdram的起始地址

#define PHYS_SDRAM_1_SIZE 0x00800000 sdram的容量(8M)

#define PHYS_FLASH_1 0x00000000 flash的起始地址

#define PHYS_FLASH_SIZE 0x00200000 flash的容量(2M)

#define CFG_FLASH_BASE PHYS_FLASH_1 定義多個(gè)名字而已,其它地方會(huì)用到

注意:
存儲(chǔ)容量的計(jì)算方法
2M=0x00200000-----------------16進(jìn)制轉(zhuǎn)換成10進(jìn)制(用WINDOWS自帶的計(jì)算機(jī)就行)-------------------》2097152
2097152=1024*1024*2

FLASH organization部分,看注釋應(yīng)該知道了吧,參考一下:
/*-----------------------------------------------------------------------
* FLASH organization
*/
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 256 /* 最大支持的SECTOR數(shù)量,另外SAM FEI的補(bǔ)丁這里設(shè)置了32個(gè) 是錯(cuò)誤的*/
//#define CFG_MAIN_SECT_SIZE 0x10000 /* main size of sectors on one chip */

#define CFG_FLASH_ERASE_TOUT 4120000 /* Timeout for Flash Erase (in ms) 在前面加個(gè)4讓它長(zhǎng)點(diǎn) */
#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
其他地方還沒(méi)動(dòng) 以后動(dòng)的再補(bǔ)上

UBOOT 移植操作(3)

----------------------------------------------------------------------------------------------------
-----------------------------------board/myboard/common/flash.c-----------------------------------
----------------------------------------------------------------------------------------------------
找到這個(gè)函數(shù):write_buff

里面有這句話,一共有6處吧?全改了:#ifdef CONFIG_B2

把CONFIG_B2改成上面TT.H文件里面起的名,我的叫CONFIG_TT

關(guān)于FLASH的一點(diǎn)疑問(wèn):
一直懷疑29LV160和39LV160在U BOOT下是否兼容的問(wèn)題
看了這段程序后似乎U BOOT是可以自動(dòng)檢測(cè)的

----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/memsetup.S-----------------------------------
-----------------------------------也叫board/T2T/TT/lowlevel_init.S-----------------------------------
----------------------------------------------------------------------------------------------------
按照如下改

* Bank 0 parameter */
.equ B0_Tacs, 0x3 /* 0clk */
.equ B0_Tcos, 0x3 /* 0clk */
.equ B0_Tacc, 0x7 /* 14clk */
.equ B0_Tcoh, 0x3 /* 0clk */
.equ B0_Tah, 0x3 /* 0clk */
.equ B0_Tacp, 0x1 /* 0clk */
.equ B0_PMC, 0x0 /* normal(1data) */
/* Bank 1 parameter */
.equ B1_Tacs, 0x0 /* 4clk */
.equ B1_Tcos, 0x1 /* 4clk */
.equ B1_Tacc, 0x2 /* 14clkv */
.equ B1_Tcoh, 0x1 /* 4clk */
.equ B1_Tah, 0x0 /* 4clk */
.equ B1_Tacp, 0x0 /* 6clk */
.equ B1_PMC, 0x0 /* normal(1data) */

/* Bank 2 parameter - */
.equ B2_Tacs, 0x0 /* 4clk */
.equ B2_Tcos, 0x2 /* 4clk */
.equ B2_Tacc, 0x4 /* 14clk */
.equ B2_Tcoh, 0x2 /* 4clk */
.equ B2_Tah, 0x3 /* 4clk */
.equ B2_Tacp, 0x3 /* 6clk */
.equ B2_PMC, 0x0 /* normal(1data) */

/* Bank 3 parameter */
.equ B3_Tacs, 0x3 /* 4clk */
.equ B3_Tcos, 0x3 /* 4clk */
.equ B3_Tacc, 0x7 /* 14clk */
.equ B3_Tcoh, 0x3 /* 4clk */
.equ B3_Tah, 0x3 /* 4clk */
.equ B3_Tacp, 0x3 /* 6clk */
.equ B3_PMC, 0x0 /* normal(1data) */

/* Bank 4 parameter */
.equ B4_Tacs, 0x3 /* 4clk */
.equ B4_Tcos, 0x3 /* 4clk */
.equ B4_Tacc, 0x7 /* 14clk */
.equ B4_Tcoh, 0x3 /* 4clk */
.equ B4_Tah, 0x3 /* 4clk */
.equ B4_Tacp, 0x3 /* 6clk */
.equ B4_PMC, 0x0 /* normal(1data) */

/* Bank 5 parameter */
.equ B5_Tacs, 0x0 /* 4clk */
.equ B5_Tcos, 0x1 /* 4clk */
.equ B5_Tacc, 0x4 /* 14clk */
.equ B5_Tcoh, 0x1 /* 4clk */
.equ B5_Tah, 0x0 /* 4clk */
.equ B5_Tacp, 0x0 /* 6clk */
.equ B5_PMC, 0x0 /* normal(1data) */

/* Bank 6(if SROM) parameter */
.equ B6_Tacs, 0x3 /* 4clk */
.equ B6_Tcos, 0x3 /* 4clk */
.equ B6_Tacc, 0x7 /* 14clk */
.equ B6_Tcoh, 0x3 /* 4clk */
.equ B6_Tah, 0x3 /* 4clk */
.equ B6_Tacp, 0x3 /* 6clk */
.equ B6_PMC, 0x0 /* normal(1data) */

/* Bank 7(if SROM) parameter */
.equ B7_Tacs, 0x3 /* 4clk */
.equ B7_Tcos, 0x3 /* 4clk */
.equ B7_Tacc, 0x7 /* 14clk */
.equ B7_Tcoh, 0x3 /* 4clk */
.equ B7_Tah, 0x3 /* 4clk */
.equ B7_Tacp, 0x3 /* 6clk */
.equ B7_PMC, 0x0 /* normal(1data) */

/* Bank 6 parameter */
.equ B6_MT, 0x3 /* SDRAM */
.equ B6_Trcd, 0x1 /* 2clk */
.equ B6_SCAN, 0x0 /* 8bit */

.equ B7_MT, 0x3 /* SDRAM */
.equ B7_Trcd, 0x1 /* 2clk */
.equ B7_SCAN, 0x0 /* 8bit */


/* REFRESH parameter */
.equ REFEN, 0x1 /* Refresh enable */
.equ TREFMD, 0x0 /* CBR(CAS before RAS)/Auto *** */
.equ Trp, 0x0 /* 2clk */
.equ Trc, 0x3 /* 0x1=5clk 0x3=11clk*/
.equ Tchr, 0x0 /* 0x2=3clk 0x0=0clks */
.equ REFCNT, 1550

MEMORY_CONFIG:
.long 0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/
.word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) /*GCS0*/
.word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) /*GCS1*/
.word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) /*GCS2*/
.word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) /*GCS3*/
.word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) /*GCS4*/
.word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) /*GCS5*/
.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) /*GCS6*/
.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) /*GCS7*/
.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) /*REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019*/
.word 0x10 /*SCLK power down mode, BANKSIZE 16M/16M*/
.word 0x20 /*MRSR6 CL=2clk*/
.word 0x20 /*MRSR7*/
主要是設(shè)置MEMORY_CONFIG里的內(nèi)容 值得注意的是.long 0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/中設(shè)置了各個(gè)BANK的位寬,要注意。因?yàn)?019有8位的,有16位的,配置錯(cuò)了網(wǎng)絡(luò)不通
其實(shí)就是一些字
有人從地址讀出來(lái)后是下面這樣也可以

MEMORY_CONFIG:
.long 0x11010102
.long 0x600
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x7ffc
.long 0x2610
.long 0x18000
.long 0x18000
.long 0x960459
.long 0x10
.long 0x20
.long 0x20
由于對(duì)armsys硬件不是太了解,沒(méi)有辦法,只得看armsys bootloader程序,但每個(gè)版本又有差別.因此是用AXD調(diào)試看bootlaoder啟動(dòng)后0x1c80000中的值定的.

注意:這個(gè)注意是后補(bǔ)上的,因?yàn)樽约汉团笥言谧龅臅r(shí)候發(fā)現(xiàn)網(wǎng)上對(duì)這部分分析的人特別少,可能因?yàn)槔碚摫容^簡(jiǎn)單,操作起來(lái)又比較麻煩吧。
聽聽菜鳥的方法吧。

首先U BOOT1.1.1和1.1.4版本有個(gè)小差別,就是文件名的差別1.1.1叫memsetup.S,1.1.4叫l(wèi)owlevel_init.S如果把別人用1.1.1編譯的直接拿過(guò)來(lái)也可以,但一定記得在改文件名的同時(shí)還一定要在文件里改函數(shù)名!就是這個(gè)文件最后那部分匯編上面的函數(shù)名。不然后來(lái)會(huì)提示START.S里找不到lowlevel_init。切記

另外,比較重要的這部分究竟代表什么,怎么改。
這個(gè)文件實(shí)際分3部分,這3個(gè)部分實(shí)際又是把44B0初始化那幾個(gè)匯編文件重新組合了,就是ADS在RAM里調(diào)試文檔里說(shuō)的,把44B0當(dāng)單片機(jī)用時(shí)C語(yǔ)言前面的那寫匯編文件,一般說(shuō)來(lái)包括44binit.s MEMCFG.S 44BLIB_A.S Option.s。其中44binit.s MEMCFG.S就包含了內(nèi)存初始化的參數(shù),按照這兩個(gè)文件改吧。

再說(shuō)這3部分
開始是內(nèi)存設(shè)置,在數(shù)據(jù)手冊(cè)(英文)4-14頁(yè),各個(gè)意思就不多說(shuō)了。說(shuō)說(shuō)怎么改,當(dāng)然得根據(jù)你的內(nèi)存具體改(一句廢話)但是有簡(jiǎn)單的方法,前面提到了,看MEMCFG.S這個(gè)文件。

然后是一些移位只類的操作,把各個(gè)BANK設(shè)置好,其實(shí)就是設(shè)置一些預(yù)定義的字,然后在其他的地方利用這些字設(shè)置寄存器。就把這些理解為宏或者就當(dāng)是個(gè)結(jié)構(gòu)體吧(不準(zhǔn)確,就幫助理解)。為什么這么設(shè)置看看數(shù)據(jù)手冊(cè)(英文)4-13頁(yè)
這部分在怎么改的快?找,哪找?44binit.s里面有,一模一樣,不羅嗦了。

最后那部分是這個(gè)文件唯一執(zhí)行的部分
基本不需要改吧(除了有的時(shí)候函數(shù)名:))
看見(jiàn)0X01C80000還不明白嗎?看數(shù)據(jù)手冊(cè)(英文)4-3頁(yè)去吧,有匯編的例子,至于這個(gè)32位寄存器為什么這么設(shè)置。

別看我這裝的明白,就是會(huì)對(duì)付,別跟我較真,我還也在研究中:)

注意:順便在這里說(shuō)說(shuō)個(gè)小問(wèn)題,有朋友問(wèn)“為什么原理圖上地址線從A1開始,而不是A0”看數(shù)據(jù)手冊(cè)(英文)4-4頁(yè),因?yàn)槭?6位地~~~
注意:我的8019是連在BANK3上的 而且是8BIT的 所以MEMORY_CONFIG下面第一項(xiàng)里要做設(shè)置 要不不好使

----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/config.mk-----------------------------------
----------------------------------------------------------------------------------------------------
修改最后的TEXT_BASE為把UBOOT加載到RAM的地址,這里添0XC700000,當(dāng)然添0XC300000也可以 但是如果添0XC300000之前的似乎在下載LINUX的時(shí)候會(huì)死機(jī),因?yàn)榈刂房臻g不夠


-----------------------------------------------------------------
-----------------------------------cpu/s3c44b0/start.S------
-------------------------------------------------------------------

找到
#if CONFIG_S3C44B0_CLOCK_SPEED==60

ldr r0, =0x70081 /* 60MHz (Quartz=10MHz) 具體怎么算的 可以看我寫的計(jì)算方法說(shuō)明*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
ldr r0, =0xac042 /* 75MHz */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
設(shè)置一下主頻

------------------------------------------------------------------------------
--------------cpu/s3c44b0/serial.c-----------------------------------
--------------------------------------------------------------------------------
找到以下幾項(xiàng)
主要是把頻率改一下并把分拼設(shè)置對(duì)
void serial_setbrg (void)
{
DECLARE_GLOBAL_DATA_PTR;

u32 divisor = 0;

/* get correct divisor */
switch(gd->baudrate) {




case 1200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 3124;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 3905;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;

case 9600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 390;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 487;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;

case 19200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 194;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 243;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
break;

case 38400:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 97;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 121;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif break;

case 57600:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 64;
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 80;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif break;

case 115200:
#if CONFIG_S3C44B0_CLOCK_SPEED==60
divisor = 32;/*具體算法和上面主頻算法在一個(gè)文檔里*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
divisor = 40;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
--------------------------------------------------------------------------
---------board/T2T/TT/TT.C-------------------------------
------------------------------------------------------------
這個(gè)沒(méi)什么好說(shuō)的,如果你用的是網(wǎng)上流行的原理圖,改動(dòng)基本沒(méi)有,我的因?yàn)榧恿诵〇|西,所以這個(gè)文件改動(dòng)很多。
但文件里主要就是對(duì)44B0各個(gè)管腳設(shè)置,哪個(gè)是IO哪個(gè)是TXD、RXD。不多說(shuō)了,自己看數(shù)據(jù)手冊(cè)8-6頁(yè),有點(diǎn)耐心。

---------------------------------------------------------------------
------------lib_arm/board.c-----------------------------------
---------------------------------------------------------
好象網(wǎng)卡需要加個(gè)INCLUDE
//待補(bǔ)充
這個(gè)文件不用修改,在網(wǎng)上找的講解,順便提一下

進(jìn)行各種初始化設(shè)置,主要有:
cpu_init CPU相關(guān)的設(shè)置, 具體在./cpu/s3c44b0/cpu.c中.
board_init 板子相關(guān)的設(shè)置, 具體在board/wx/wx20/wx20.c 中
interrupt_init中斷設(shè)置,我們沒(méi)有用,具體在./cpu/s3c44b0/interrupts.c中
env_init 初始化環(huán)境變量, 具體要看用什么介質(zhì)來(lái)存儲(chǔ)環(huán)境變量,如果用flash來(lái)存貯, 程序在common/env_flash.c中.
init_baudrate 設(shè)置baud參數(shù)
serial_init 串口初始化, 具體在cpu/s3c44b0/serial.c.
console_init_f 控制臺(tái)設(shè)置, 具體在./common/console.c

display_banner 顯示標(biāo)題.[這里可以鼓搗一下,讓它輸出些個(gè)性的東西:)]
dram_init 可用內(nèi)存配置, 具體在./board/wx/wx20/wx20.c.
flash_init flash初始化,具體./drivers/cfi_flash.c.

接下來(lái)就是環(huán)境變量初始化, 網(wǎng)絡(luò)初始化,最后到main_loop,可以運(yùn)行各種命令.
====================================
[5]燒寫FLASH
這部分可能過(guò)于簡(jiǎn)單,很少有人寫,但是對(duì)于不了解ARM開發(fā)過(guò)程的人真的簡(jiǎn)單嗎?我是菜鳥,在這卡了3天:)
一般說(shuō)來(lái)有幾種方法,
1)板子原來(lái)的BOOTLOADER程序或者為燒寫而編寫的專用ADS程序
比較高級(jí)而快速的方法,很多現(xiàn)成的開發(fā)板都用這種方法(相對(duì)來(lái)說(shuō)有實(shí)力的公司),此狀態(tài)下CPU是運(yùn)行的,所以速度快。
比如ZLG的,但是對(duì)于初學(xué)或者不準(zhǔn)備細(xì)研究硬件的人來(lái)說(shuō)就比較麻煩,因?yàn)橐帉懀ǜ膶懀〢DS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時(shí)并不運(yùn)行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個(gè)軟件,原因比較簡(jiǎn)單,麻煩+速度慢。
因?yàn)樾枰帉懀ǜ膶懀﹥蓚€(gè)配置文件,而且是字符界面。倒是有人說(shuō)這個(gè)軟件只能在WIN98下用的說(shuō)法好象不對(duì)(現(xiàn)在有可以讓2000和XP下用的方法)
喜歡的朋友可以用用
3)FLASHPGM(推薦)
很簡(jiǎn)單的程序,GUI界面,速度尚好。
設(shè)置很簡(jiǎn)單,在CPU里選對(duì)型號(hào),當(dāng)然是3星的44B0。在FLASH里也一樣,39LV160,29LV160都有。
確定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上)
選完了以后讀一下FLASH的ID(左下腳的按鈕吧)能讀出廠家的ID就行。
然后是燒寫了,PROGRAME按鈕,注意的是FLASHPGM不支持BIN格式,按照下面方法處理。
再有就是盡量在寫之前擦一下,PROGRAME菜單里有個(gè)選項(xiàng),打個(gè)鉤就OK。
具體燒寫方法可以看我總結(jié)的另一篇文檔,在這里只說(shuō)說(shuō)UBOOT相關(guān)的。
前面說(shuō)過(guò)UBOOT編譯以后產(chǎn)生3個(gè)文件
u-boot——ELF格式的文件,可以被大多數(shù)Debug程序識(shí)別;
u-boot.bin——二進(jìn)制bin文件,純粹的U-BOOT二進(jìn)制執(zhí)行代碼,不保存ELF格式和調(diào)試信息。這個(gè)文件一般用于燒錄到用戶開發(fā)板中;
u-boot.srec——Motorola S-Record格式,可以通過(guò)串行口下載到開發(fā)板中。
FLASHPGM不支持BIN格式的,可以燒寫u-boot——ELF格式的文件,別看它沒(méi)擴(kuò)展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現(xiàn)成的BIN文件來(lái)燒,F(xiàn)LASHPGM還提供了一個(gè)BINTOS19的程序,就在它的安裝目錄下。具體用法運(yùn)行它,它自己就告訴你了。

注意:有時(shí)(尤其是FLASH里已經(jīng)有程序的時(shí)候)0XC000000會(huì)莫名奇妙的提示內(nèi)存不可以寫,有幾個(gè)方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點(diǎn)EREASE擦除芯片,擦除一般說(shuō)來(lái)是不成功的,最后無(wú)論如何都下不去,沒(méi)關(guān)系,這時(shí)候關(guān)閉擦除對(duì)話框,然后0x10000000地址不變,燒FLASH,我一般是燒寫一個(gè)我自己寫的LED測(cè)試小程序把內(nèi)存占上:)。回來(lái)這時(shí)候再把0X1000000換成0XC000000再按照正常操作,一般可以正常。
這現(xiàn)象的原因就是過(guò)去下的程序(多數(shù)是不正確的程序)正在運(yùn)行 占用了RAM與ROM,下個(gè)LED測(cè)試小程序就是把這幾個(gè)部分清除掉。
如果以上方法還不正常,可以用另一個(gè)程序叫FLASHP就差2個(gè)字母:)很好!在這里對(duì)這個(gè)程序的作者致敬?。?br />用這個(gè)軟件擦FLASH,然后再用FLASHPGM燒,原因是FLASHP擦厲害,但寫好象有些問(wèn)題~~

細(xì)小的問(wèn)題--patch命令的使用
有的時(shí)候大家收到的別人移植好的UBOOT了UCLINUC了是以patch包發(fā)布的

這里轉(zhuǎn)個(gè)寫的比較好的patch命令的使用方法

文件:isp1161-2.6.12.patch(在/root下)

--- linux-2.6.12/drivers/usb/Makefile 2005-06-17 22:48:29.000000000 +0300
+++ linux-2.6.12-new/drivers/usb/Makefile 2005-07-27 08:11:47.908336540 +0300

......
......

由于patch文件的首行已經(jīng)指明了路徑,所以根據(jù)當(dāng)前所在的目錄,加不同的參數(shù)使用patch命令:

1:如果當(dāng)前的目錄是和linux-2.6.12的同級(jí)目錄:

[root@kcn-110mw]#patch -p0 </root/isp1161-2.6.12.patch

2:如果當(dāng)前的目錄為 linux-2.6.12/:

[root@kcn-110mw]#patch -p1 </root/isp1161-2.6.12.patch

3:如果當(dāng)前的目錄為 linux-2.6.12/drivers/:

[root@kcn-110mw]#patch -p2 </root/isp1161-2.6.12.pathc

0,1,2,是指略去的patch文件中的前幾級(jí)目錄

細(xì)小的問(wèn)題---VMWARE安裝與使用
mamajinco 發(fā)表于 2006-9-6 9:49:00
首先 推薦大家在開發(fā)的過(guò)程中使用VMWARE虛擬機(jī) 安裝LINUX
原因比較簡(jiǎn)單 開發(fā)過(guò)程中會(huì)頻繁的在兩個(gè)系統(tǒng)之間交換 對(duì)于沒(méi)有兩個(gè)計(jì)算機(jī)的朋友來(lái)說(shuō) 過(guò)于麻煩
對(duì)的不說(shuō)了 說(shuō)說(shuō)開發(fā)里遇到問(wèn)題
==================================
一 安裝VMWARE虛擬機(jī)與LINUX
1 分出個(gè)10G左右的地方
我是分個(gè)10G的FAT32格式分區(qū)來(lái)單獨(dú)做LINUX的區(qū)域,推薦分出來(lái)的空間大于9G,因?yàn)閷?duì)于新手來(lái)說(shuō)LIXUN要盡量全部安裝。
分區(qū)盡量是FAT32格式(WINDOWS用的)NTFS聽有的朋友說(shuō)過(guò)好象有問(wèn)題。
推薦計(jì)算機(jī)內(nèi)存大于256M,我用的是512M,開VMWARE再開ACROBAT時(shí)就會(huì)明顯慢。
安裝后的VMWARE虛擬機(jī)基本是3種文件,VMWARE程序文件我安在C盤下了,VMWARE的配置文件(安裝后再添加的,比較小)和VMWARE虛擬出的硬盤文件(選10G,該文件就是10G),所以我單獨(dú)分出個(gè)驅(qū)存他們。
虛擬機(jī)里安裝后的操作系統(tǒng)(一般都是LINUX吧,順便說(shuō)一下,你也可以按WIN了蘋果了操作系統(tǒng))
2 安裝VMWARE虛擬機(jī)
VMWARE虛擬機(jī)對(duì)于WINDOWS來(lái)說(shuō)就是個(gè)軟件,用這個(gè)軟件虛擬出個(gè)計(jì)算機(jī)來(lái)。對(duì)于VMWARE虛擬機(jī)里面安裝的系統(tǒng)來(lái)說(shuō)自己就獨(dú)占了一臺(tái)計(jì)算機(jī)。
安裝沒(méi)有什么特殊的,我用的是VER5.5,選標(biāo)準(zhǔn)安裝,基本一律下一步就搞定。
值得注意的是中間有問(wèn)你分出來(lái)多大硬盤空間,默認(rèn)是8G ,改成10G吧。
之后是建立VMWARE虛擬機(jī)配置文件,根據(jù)自己的要求建立,基本不用改什么,就是整錯(cuò)了也可以在后來(lái)的SETTING里改。
不多說(shuō)了。
3 安裝LINUX
把LINUX安裝盤放光驅(qū)里吧,啟動(dòng)虛擬機(jī),自己就檢測(cè)啟動(dòng)了。
多說(shuō)一句,到這大家都明白了吧?啟動(dòng)虛擬機(jī)就相當(dāng)于啟動(dòng)一個(gè)計(jì)算機(jī),光盤自動(dòng)啟動(dòng)也跟物理上的計(jì)算機(jī)完全一樣。
值得注意的是:如果電腦里安了虛擬光驅(qū)可能影響光盤自動(dòng)啟動(dòng),如果有問(wèn)題就把虛擬光驅(qū)卸了吧。
安裝的時(shí)候同樣沒(méi)什么問(wèn)題,手動(dòng)分驅(qū),按照內(nèi)存大小的2倍分出來(lái)個(gè)SWAP分驅(qū),其余的我分成一個(gè)驅(qū),強(qiáng)制為主分驅(qū),掛載點(diǎn)選“/”根目錄,分驅(qū)格式選EXT3……
多說(shuō)一句,在分驅(qū)里就能看出來(lái)了吧?LINUX完全獨(dú)占了這10G的地方,看不到WINDOWS
二 安裝VMWARE-tools

VMWARE-tools還是安裝比較好,最起碼WIN和LINUX交換文件就方便了
引用別人的文章 加上自己的注釋吧
1、以ROOT身份進(jìn)入LINUX

2、按下 CTRL+ALT組合鍵,進(jìn)入主操作系統(tǒng),點(diǎn)擊VMWARE狀態(tài)欄安裝提示,或者點(diǎn)擊 SETTING菜單下的ENABLE VMWARE TOOLS子菜單。

3、確認(rèn)安裝VMWARE TOOLS。
這時(shí)我們并沒(méi)有真正的安裝上了VMWARE TOOLS軟件包,如果您點(diǎn)擊菜單:DEVICES,您就會(huì)發(fā)現(xiàn)光驅(qū)的菜單文字變?yōu)椋篿de1:0-> Crogram FilesVMwareVMware WorkstationProgramslinux.iso,這表示VMWARE將LINUX的ISO映象文件作為了虛擬機(jī)的光盤

注釋:有的時(shí)候不能自動(dòng)掛載,自己要在菜單里光驅(qū)項(xiàng)目里選掛載VMWARE安裝目錄(不是配置文件存儲(chǔ)目錄,我的在C盤里)里某個(gè)目錄的linux.iso

4、鼠標(biāo)點(diǎn)擊LINUX界面,進(jìn)入LINUX。

5、運(yùn)行如下命令,注意大小寫。

mount -t iso9660 /dev/cdrom /mnt

加載CDROM設(shè)備,這時(shí)如果進(jìn)入 /mnt 目錄下,你將會(huì)發(fā)現(xiàn)多了一個(gè)文件:vmware-linux-tools.tar.gz。這就是WMWARE TOOLS的LINUX軟件包,也就是我們剛才使用WINISO打開LINUX.ISO文件所看到的。

注釋:在新版本里可以不用命令掛載和卸載了,打開 LINUX.ISO后LINUX桌面會(huì)自動(dòng)彈出光驅(qū)標(biāo)志,雙擊打開。

cp /mnt/vmware-linux-tools.tar.gz /tmp

將該軟件包拷貝到LINUX的 TMP目錄下。

umount /dev/cdrom

卸載CDROM。

cd /tmp

進(jìn)入TMP目錄

tar zxf vmware-linux-tools.tar.gz

解壓縮該軟件包,默認(rèn)解壓到vmware-linux-tools目錄下(與文件名同名)。

cd vmware-linux-tools

進(jìn)入解壓后的目錄

./install.pl

運(yùn)行安裝命令。

這時(shí)install提示你是否需要備份以前的配置文件,建議選擇"y"。

等待INSTALL運(yùn)行完成后,這時(shí)鍵入 START 命令,是不是可以看到漂亮的LINUX圖形界面了?

三 使用VMWARE TOOLS
必須注意的是VMWARE TOOLS在每次重起LINUX之后還必須也重起一下,TMD,誰(shuí)搞定不用重起告訴我一聲
重起的方法:/etc/init.d/vmware-tools restart
就有消息出來(lái)了

四 文件共享
我用的VMWARE虛擬機(jī)裝的LINUX,要在LINUX和WIN中間傳遞文件用VM-》SETTING里的SHARE FOLDER
該功能是把WIN 下的一個(gè)文件夾共享給LINUX。
這個(gè)功能必須裝VMWARE TOOLS才能用。
共享以后在LINUX的MNT目錄下就出一個(gè)F什么打頭的文件夾,進(jìn)去就是你共享的文件夾名了

細(xì)小的問(wèn)題---arm-linux-gcc與arm-elf-gcc的區(qū)別
總看見(jiàn)有人問(wèn)

arm-linux-gcc為有MMU的LINUX準(zhǔn)備的比如2410上的LINUX

arm-elf-gcc為沒(méi)有MMU的UCLINUX準(zhǔn)備的比如44B0上的UCLINUX

就這么簡(jiǎn)單

閑聊ARM的入門(1)
我的筆記剛公布就有很多朋友來(lái)找我,把我當(dāng)高手,問(wèn)我“ARM怎么入門”。我不是高手,仍然是菜鳥。

但是回想起自己當(dāng)時(shí)的迷茫,特意寫了這篇東西,當(dāng)作給和我一樣的兄弟姐妹的幫助吧。問(wèn)這個(gè)問(wèn)題的人多半不是已經(jīng)工作的工程師,而是和我一樣是學(xué)生,所以這篇筆記就把看家當(dāng)成我一樣的菜鳥,高手勿怪。

首先聲明:本人還沒(méi)有找工作,事實(shí)上處于研究生剛畢業(yè),還沒(méi)開始找工作的空閑時(shí)間,44B0只是興趣所在,打發(fā)時(shí)間。
所有看法完全是自己的感受,不代表任何他人。錯(cuò)了的觀點(diǎn)各位幫我糾正。

再次補(bǔ)充:很多朋友看了上面的話就問(wèn)我為什么研究生畢業(yè)了還不找工作:)說(shuō)是打發(fā)時(shí)間,其實(shí)是因?yàn)檠芯可臅r(shí)候帶了一個(gè)項(xiàng)目,申請(qǐng)?zhí)崆爱厴I(yè)以后項(xiàng)目還有塊尾巴,答應(yīng)導(dǎo)師把項(xiàng)目做完再走:)就這么簡(jiǎn)單。男人總點(diǎn)負(fù)點(diǎn)責(zé),呵呵

以下問(wèn)題常被問(wèn)到,我就想到哪說(shuō)到哪吧。

一 首先說(shuō)說(shuō)ARM的發(fā)展
可以用一片大好來(lái)形容,翻開各個(gè)公司的網(wǎng)站,招聘里面嵌入式占據(jù)了大半工程師職位。
廣義的嵌入式無(wú)非幾種:傳統(tǒng)的什么51、AVR、PIC稱做嵌入式微控制器;ARM是嵌入式微處理器;DSP;FPGA。
客觀的講,工作需求量上DSP的需求比ARM要多,而ARM和FPGA差不多。
DSP因?yàn)閿?shù)字處理與通信領(lǐng)域的空前發(fā)展而火暴,小到MP3 射象頭,大到我們軍品里的控制器,應(yīng)用面很廣。
FPGA的兄弟一般做ANSIC(特殊芯片設(shè)計(jì),好象是這么翻譯的)。
而ARM單純說(shuō)來(lái)并不比一個(gè)單片機(jī)強(qiáng)多少,但是它的獨(dú)特就在于不斷下降的價(jià)格和提升的性能。這完全依靠于ARM公司的戰(zhàn)略,厲害??!很佩服他們的戰(zhàn)略眼光!!
值得注意的是:在找工作中,企業(yè)(著名的,小的不算)對(duì)單純的ARM硬件開發(fā)工程師并不比單片機(jī)重視,很少有大企業(yè)的職位里寫“從事過(guò)ARM開發(fā)優(yōu)先”。
寫的多的是什么?“嵌入式LINUX”
到這相信大家看出來(lái)了吧,需要的是硬件中的軟件。

二 ARM是硬件還是軟件
很難說(shuō),ARM是硬件,LINUX是軟件。
ARM的硬件多半已經(jīng)模塊化了,像我這樣把板子改成這樣的就算動(dòng)的多的了,這同樣是ARM公司的戰(zhàn)略,再次佩服。
實(shí)際中的LINUX的開發(fā)工作更多,更耗時(shí)。從這方面說(shuō)ARM應(yīng)該算是軟件了。
在找工作中更是這樣,舉個(gè)例子,聯(lián)想里和ARM最接近的是“BIOS工程師”是軟件,MOTO里接近的是嵌入式LINUX工程師是軟件。而其他很多公司把嵌入式產(chǎn)品開發(fā)歸為硬件。
所以,不要討論這個(gè),好好玩轉(zhuǎn)自己的板子才是關(guān)鍵。實(shí)在不爽你就把自己叫“嵌入式開發(fā)工程師”

三 要不要買開發(fā)板 買哪家
我的答案是“在你個(gè)人的學(xué)習(xí)方法”,但是如果看家是需要看這騙筆記的水平,個(gè)人推薦還是買現(xiàn)成的。
1 買
買板子可以把注意力集中在軟件開發(fā)上,軟件開發(fā)(尤其是驅(qū)動(dòng))可以不必?fù)?dān)心自己硬件上的問(wèn)題,我就是以便調(diào)試一邊寫驅(qū)動(dòng)和程序,每次寫驅(qū)動(dòng)前就要先確認(rèn)硬件沒(méi)問(wèn)題。
另外,買板子更省錢和時(shí)間,我自己做的板子,原理圖PCB花了2周以上!制版又15天,回來(lái)以后焊接44B0 160個(gè)腳!那叫一個(gè)麻煩~~花了多少錢呢?2層板,制版費(fèi)就300塊!當(dāng)然 我把接口都外引了,還做了個(gè)20X18的LCD背板,板子比較大。
總體下來(lái) 元件+LCD屏+PCB=11XX塊!夠2410的了。
再有就是買的資料相對(duì)來(lái)說(shuō)比較全,但是不要指望有技術(shù)支持!都是騙人的,賣你之后就不會(huì)理你。

2 做
自己做可以更了解底層硬件,可以按照自己的要求加?xùn)|西,比如我就加了GPS模塊、 GPRS模塊 、SD卡模塊,擴(kuò)了個(gè)IIC的35個(gè)鍵子的鍵盤、把LCD接口按照買的LCD改裝了,可以用FPC線直接連接。做的很爽的。玩一把嗎。

當(dāng)然,你可以有策略的做,比如像我一樣,把RAM和ROM,網(wǎng)絡(luò)都保持和某現(xiàn)成的板子一樣,這樣他們的資料你就可以拿過(guò)來(lái)直接用,給自己留個(gè)退路。其他的如SD了 什么的自己做。都達(dá)到了~~就是費(fèi)錢,費(fèi)時(shí)間。
再有就是給做的朋友幾點(diǎn)建議:盡量拿到現(xiàn)成的板子,盡量多搜集其他板子的全套資料,一定要拿到一張沒(méi)問(wèn)題的原理圖。
網(wǎng)上流傳的原理圖多數(shù)是龔俊03年畫的,再這里對(duì)龔俊表達(dá)一下我的敬意?。∨H?!
但是那個(gè)圖有個(gè)小BUG,我指的是03版的,后來(lái)的沒(méi)這問(wèn)題了。8019那地址線和地址有問(wèn)題。還有人仿照他的PDF圖畫的SCH,更是漏洞百出!譴責(zé)!順便譴責(zé)把龔俊板子偷賣的人。

3 買哪家
個(gè)人感覺(jué)分3類吧
1)首先是ZLG的,資料非常的全,感覺(jué)他是真正想教你怎么開發(fā)ARM,而不是像有的公司自己技術(shù)都沒(méi)做好就做個(gè)板子出來(lái)賣錢。但是最大的不利就是價(jià)格太貴!而且主要是PHILIP的,貨源比較麻煩~~可能有人說(shuō)21XX系列的不貴啊,那是總線不外擴(kuò)的,只能跑UCOS,不能跑UCLINUX。但是說(shuō)是話,21XX系列才是ARM7的價(jià)格性能結(jié)合點(diǎn)。ARM7最適合做工業(yè)控制,ARM普及,銷量都是怎么來(lái)的?都是ARM7來(lái)的,而44B0是典型的商業(yè)片子。但是,這里如果你看中的是為工作做準(zhǔn)備,還是選能跑UCLINUX的吧。
但是仍然作為第一個(gè)推薦,因?yàn)椴锁B時(shí)期,合適的資料太重要了??!在這里被ZLG的務(wù)實(shí)精神感動(dòng)!你看人家那代碼寫的。
2)感覺(jué)立宇泰的44B0不錯(cuò)
硬件沒(méi)別的,就是資料比較全的說(shuō),不像有些家,原理圖直接拿人家的,還錯(cuò)的~~
3)找個(gè)最便宜的
好象最便宜的有賣350的吧?也是沒(méi)別的,就是即省了錢 還省時(shí)間搜集資料,至于資料全不全,別計(jì)較了~~硬件肯定好使就行吧。

四 要不要有51 AVR等單片機(jī)基礎(chǔ)
有更好,但沒(méi)有也無(wú)所謂。
兩個(gè)月以前,我只是看別人做,耳濡目染~~,本科學(xué)過(guò)單片機(jī),從來(lái)沒(méi)做過(guò)。我們這的技術(shù)主干做AVR和51,我就跟他們調(diào)過(guò)C語(yǔ)言程序。你看出來(lái)了?我是個(gè)不折不扣的菜鳥吧?
但是做這個(gè)之前我特意找了ZLG的兩本書,看了里面的例子和原理圖,這很重要。例程里有匯編有C,都看懂了就OK,不用自己現(xiàn)寫

五 開發(fā)都需要學(xué)習(xí)哪些軟件
總結(jié)起來(lái)最主要的有以下幾個(gè)吧
1 ADS調(diào)試用
確切的說(shuō)是ADS+AXD。ADS里包含AXD。原來(lái)都用SDT后來(lái)ARM公司停止對(duì)SDT支持了,改支持ADS了,還是用ADS吧。
有的人的程序發(fā)布的仍然是SDT版本的,但基本都可以找到相應(yīng)ADS的,新人在這里不要發(fā)蒙。ADS是編譯器,AXD是調(diào)試器。便宜成AXF以后再在ARM的RAM里調(diào)試。

2 PLASHPGM
FLASH燒寫的軟件。AXD在RAM里調(diào)試,掉電就沒(méi)有了,方便程序修改。調(diào)試好的程序再下到FLASH里,上電直接運(yùn)行。
同類的軟件還有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人還問(wèn)FLASH不支持BIN格式文件的問(wèn)題就要看我寫的PLASHPGM使用了。

3 BANYANT調(diào)試代理(不知道名對(duì)不,起這么個(gè)難記的,我一般都叫它“半羊”因?yàn)橹浪菐?/p>

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉