日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

arm学习笔记

發(fā)布時(shí)間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 arm学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

簡(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ì)于他們的尊重,另一方面也希望覺得本人的筆記有參考意義的朋友把這種精神繼續(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)沒有做任何變動(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
?地址分配原理見44B0數(shù)據(jù)手冊(cè)內(nèi)存管理那章的內(nèi)存分配圖

?想在RAM里調(diào)試就添0XC000000(比如0XC008000)的地址
?但是注意的是地址不要添過(guò)界,比如想在RAM里調(diào)試卻添0X00000000 程序可以 進(jìn)入C代碼 但沒法運(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ò)誤,沒設(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)橐帉?#xff08;改寫)ADS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時(shí)并不運(yùn)行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個(gè)軟件,原因比較簡(jiǎn)單,麻煩+速度慢。
因?yàn)樾枰帉?#xff08;改寫)兩個(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格式的文件,別看它沒擴(kuò)展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現(xiàn)成的BIN文件來(lái)燒,FLASHPGM還提供了一個(gè)BINTOS19的程序,就在它的安裝目錄下。具體用法運(yùn)行它,它自己就告訴你了。

注意:有時(shí)(尤其是FLASH里已經(jīng)有程序的時(shí)候)0XC000000會(huì)莫名奇妙的提示內(nèi)存不可以寫,有幾個(gè)方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點(diǎn)EREASE擦除芯片,擦除一般說(shuō)來(lái)是不成功的,最后無(wú)論如何都下不去,沒關(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)編譯,沒有問(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è)試交叉編譯器搞好沒有
?編譯個(gè)44B0例子 在UBOOT包目錄下執(zhí)行一下命令,以下是編譯的包自帶的DAVE公司板子B2(名)
1)???? Make distclean (清除以前編譯的痕跡)
2)???? Make B2_config(B2代表B2板子的,前面見到過(guò))
3)???? Make
沒問(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)該沒問(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吧,雖然不改也是可以的,具體沒考究。

?


以下是板上env參數(shù)設(shè)置,看一下吧,其實(shí)我覺得了解一下就行的了,只是一些初始設(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) */
其他地方還沒動(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硬件不是太了解,沒有辦法,只得看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ù)名:))
看見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è)沒什么好說(shuō)的,如果你用的是網(wǎng)上流行的原理圖,改動(dòng)基本沒有,我的因?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è)置,我們沒有用,具體在./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)橐帉?#xff08;改寫)ADS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時(shí)并不運(yùn)行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個(gè)軟件,原因比較簡(jiǎn)單,麻煩+速度慢。
因?yàn)樾枰帉?#xff08;改寫)兩個(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格式的文件,別看它沒擴(kuò)展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現(xiàn)成的BIN文件來(lái)燒,FLASHPGM還提供了一個(gè)BINTOS19的程序,就在它的安裝目錄下。具體用法運(yùn)行它,它自己就告訴你了。

注意:有時(shí)(尤其是FLASH里已經(jīng)有程序的時(shí)候)0XC000000會(huì)莫名奇妙的提示內(nèi)存不可以寫,有幾個(gè)方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點(diǎn)EREASE擦除芯片,擦除一般說(shuō)來(lái)是不成功的,最后無(wú)論如何都下不去,沒關(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)題~~

細(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ì)于沒有兩個(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ī)。
安裝沒有什么特殊的,我用的是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í)候同樣沒什么問(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í)我們并沒有真正的安裝上了VMWARE TOOLS軟件包,如果您點(diǎn)擊菜單:DEVICES,您就會(huì)發(fā)現(xiàn)光驅(qū)的菜單文字變?yōu)?#xff1a;ide1: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ū)別
總看見有人問(wèn)

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

arm-elf-gcc為沒有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)成我一樣的菜鳥,高手勿怪。

首先聲明:本人還沒有找工作,事實(shí)上處于研究生剛畢業(yè),還沒開始找工作的空閑時(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)硬件沒問(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)成的板子,盡量多搜集其他板子的全套資料,一定要拿到一張沒問(wèn)題的原理圖。
網(wǎng)上流傳的原理圖多數(shù)是龔俊03年畫的,再這里對(duì)龔俊表達(dá)一下我的敬意!!牛人!
但是那個(gè)圖有個(gè)小BUG,我指的是03版的,后來(lái)的沒這問(wèn)題了。8019那地址線和地址有問(wèn)題。還有人仿照他的PDF圖畫的SCH,更是漏洞百出!譴責(zé)!順便譴責(zé)把龔俊板子偷賣的人。

3 買哪家
個(gè)人感覺分3類吧
1)首先是ZLG的,資料非常的全,感覺他是真正想教你怎么開發(fā)ARM,而不是像有的公司自己技術(shù)都沒做好就做個(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)感覺立宇泰的44B0不錯(cuò)
硬件沒別的,就是資料比較全的說(shuō),不像有些家,原理圖直接拿人家的,還錯(cuò)的~~
3)找個(gè)最便宜的
好象最便宜的有賣350的吧?也是沒別的,就是即省了錢 還省時(shí)間搜集資料,至于資料全不全,別計(jì)較了~~硬件肯定好使就行吧。

四 要不要有51 AVR等單片機(jī)基礎(chǔ)
有更好,但沒有也無(wú)所謂。
兩個(gè)月以前,我只是看別人做,耳濡目染~~,本科學(xué)過(guò)單片機(jī),從來(lá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)試,掉電就沒有了,方便程序修改。調(diào)試好的程序再下到FLASH里,上電直接運(yùn)行。
同類的軟件還有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人還問(wèn)FLASH不支持BIN格式文件的問(wèn)題就要看我寫的PLASHPGM使用了。

3 BANYANT調(diào)試代理(不知道名對(duì)不,起這么個(gè)難記的,我一般都叫它“半羊”因?yàn)橹浪菐滋靹偝粤丝狙?#xff09;
調(diào)試代理就是用它幫你使用更簡(jiǎn)單的JTAG(便宜啊)來(lái)實(shí)現(xiàn)原本1K才賣的JTAG仿真器的大部分功能。JTAG調(diào)試原理看我另一篇筆記。簡(jiǎn)單的就可以把他理解為你自己做的JTAG的驅(qū)動(dòng)就行了。
調(diào)試代理還有很多種,什么H-JTAG了、ARM7了(不知道具體叫什么,就記得可執(zhí)行文件叫ARM7.EXE)都是,BANYANT比較好。

需要注意的是,沒種調(diào)試代理安裝方法雖然都簡(jiǎn)單 但都不一樣,需要看說(shuō)明。而且AXD調(diào)試之前都要運(yùn)行。省錢了,就別怕麻煩了。

4 ARM-ELF-TOOLS工具鏈
里面是UCLINUX開發(fā)用的工具比如ARM-ELF-GCC只類的。工具鏈就是把很多工具打包在一起發(fā)布的方便你開發(fā)的東西。具體安裝方法看我另一篇筆記。
另外如果你開發(fā)LINUX就要用ARM-LINUX-TOOLS,不一樣,不通用。

5 U-BOOT
大名鼎鼎的BOOTLOADER生成工具,同類的好象還有VIVI(名字很曖昧~~)
生成的BOOTLOADER燒到FLASH里,然后就可以用BOOTLOADER下載 燒寫其他了
有了BOOTLOADER才能下UCLINUX。BOOTLOADER就像電腦上的BIOS。當(dāng)然UCOS的不用這個(gè),用什么我不知道:)
最新版本是1.1.4 具體使用方法看我另一篇筆記吧。

6 UCLINUX包
UCLINUX的源碼包,不用多說(shuō)了吧?建議大家用現(xiàn)成的先體會(huì)一下,然后再自己編譯,裁剪。因?yàn)閱为?dú)UCLINUX的編輯技術(shù)上比較簡(jiǎn)單,但涉及的方面還是比較廣的。

7 VMWARE
老牌的虛擬機(jī)軟件,在一個(gè)機(jī)器上虛擬出一個(gè)機(jī)器裝LINUX(PC上用的),省得你來(lái)回開關(guān)機(jī)了。記得裝VMWARE-TOOLS,安裝方法在我另一篇筆記里。

六 有哪些書推薦
主要推薦ZLG的三本書,有這3本再加網(wǎng)絡(luò)就不用別的書了,其中主要推薦前2本,3是介紹體系結(jié)構(gòu)的,也不錯(cuò)
1 ARM嵌入式LINUX系統(tǒng)構(gòu)建與驅(qū)動(dòng)開發(fā),北航版
驅(qū)動(dòng)寫的很詳細(xì),前期開發(fā)介紹也很好
2 ARM 嵌入式系統(tǒng)實(shí)驗(yàn)教程(二),北航版
有ZLG2200的原理圖,實(shí)驗(yàn)程序和注釋,了解人家是怎么開發(fā)的。
3 ARM嵌入式系統(tǒng)基礎(chǔ)教程
最重要的是體系結(jié)構(gòu),匯編部分介紹,看看吧,增加理論素質(zhì)。
4 44B0數(shù)據(jù)手冊(cè)
寫在這里是強(qiáng)調(diào)它的重要。

不推薦ZLG早期出的紅色皮的ARM什么體系結(jié)構(gòu)~只類的
寫的太多,看煩了。

其他的書沒了幾本,沒看見好的,大家有看過(guò)的推薦吧。
?
閑聊ARM的入門(2)
mamajinco 發(fā)表于 2006-9-7 9:34:00
七 選UCOS?UCLINUX?LINUX?VXWORKS?還是當(dāng)單片機(jī)用
1 搞開發(fā),工程設(shè)計(jì),用UCOS,小巧,多進(jìn)程,簡(jiǎn)單,體現(xiàn)了ARM7的精髓。

2 LINUX 正根的嵌入式系統(tǒng),LINUX消費(fèi)與通信領(lǐng)域用的比較多,但缺點(diǎn)是必須ARM9才能跑,ARM9的板子自己做就不行了,6層板太貴。買開發(fā)板1K達(dá)底吧。但是還是推薦選ARM9+LINUX

3 UCLINUX 算投機(jī)嵌入式系統(tǒng):)ARM7上可以跑,由有LINUX近親,學(xué)好好可以比較方便的轉(zhuǎn)向LINUX,像我一樣的窮鬼用吧,呵呵

4 VXWORKS
學(xué)好后可以找到高薪工作,但工作機(jī)會(huì)本身并不比LINUX好找。

5 當(dāng)單片機(jī)用
不推薦,雖然我景仰的ZLG一直號(hào)召這么干。因?yàn)閷?duì)于學(xué)習(xí)來(lái)說(shuō)多進(jìn)程的系統(tǒng)設(shè)計(jì)才是ARM7的玩頭,至少你也要整個(gè)UCOS啊:)
有朋友問(wèn)我先學(xué)這個(gè)當(dāng)基礎(chǔ)不行嗎?那當(dāng)然可以~~但我當(dāng)時(shí)就用了1周搞定,就是我先的ADS在RAM中調(diào)試的筆記。后來(lái)我清空FLASH用的小段程序還是當(dāng)時(shí)寫的LED閃爍程序呢。另外1周里其中還因?yàn)樽约哼^(guò)于菜,沒把OM設(shè)置好導(dǎo)致晶陣不陣
哈哈。這個(gè)是必須做的,但一帶而過(guò)。目標(biāo)放的遠(yuǎn)一點(diǎn)。

八 學(xué)習(xí)要用多長(zhǎng)時(shí)間
我從菜鳥到現(xiàn)在兩個(gè)多月,中間被打擾數(shù)次。仍然搞定了PCB設(shè)計(jì)與制版,RAM調(diào)試,FLASH下載,UBOOT移植和下載UCLINUX(沒剪裁,用現(xiàn)成的),LCD驅(qū)動(dòng)。
再次坦誠(chéng)的說(shuō):我確實(shí)比較菜,說(shuō)這些不是讓大家羨慕,只是告訴你們“你們應(yīng)該比這個(gè)更好”
我相信良好的態(tài)度+合適的方法+及時(shí)的總結(jié)=成績(jī)

九 ARM都玩什么
就幾點(diǎn)
1 硬件設(shè)計(jì)
2 系統(tǒng)移植
3 驅(qū)動(dòng)開發(fā)
4 應(yīng)用開發(fā)
沒了。其中推薦把注意力放在后兩個(gè)上,3有難度,4比較靈活,最重要的是都是找工作的砝碼。

十 我用的什么板子
很多人問(wèn)我這個(gè)問(wèn)題,我特意寫過(guò)一個(gè)的。再說(shuō)一次吧。
我是自己做的,RAM、ROM、8019等比較麻煩而當(dāng)時(shí)的自己不理解的都按照龔俊的做的。保持其他不便的情況下做了如下改動(dòng)。
1 加了串口通信的GPS模塊、 GPRS模塊
一個(gè)UART0,一個(gè)UART1,當(dāng)與要用超級(jí)終端時(shí)用跳線切換。

2 SD卡,和7843觸摸屏
同時(shí)掛在SPI總線上,因?yàn)镾PI只能掛一個(gè)設(shè)備,同時(shí)還做了I/O模擬的準(zhǔn)備,把兩個(gè)設(shè)備又通過(guò)跳線掛在4個(gè)IO上。

3 擴(kuò)了個(gè)IIC的35個(gè)鍵子的鍵盤
用的ZLG的7290,不占用CPU,最大支持64個(gè)鍵子,只上了35個(gè),其他留接口。

4 把LCD接口按照買的LCD改裝了,可以用FPC線直接連接。
?所以改動(dòng)雖然多,但真正很移植了,初期調(diào)試有關(guān)的并沒動(dòng),就是為了現(xiàn)在不那么菜的時(shí)候做準(zhǔn)備:)

十一 開發(fā)流程
這里是我的開發(fā)流程
1 設(shè)計(jì)原理圖(含WIGGLER的JTAG訪真器)
2 設(shè)計(jì)PCB(含WIGGLER的JTAG訪真器)
3 制版
4 焊接電壓,確定電壓沒問(wèn)題
5 焊接44B0+JTAG電路+WIGGLER的JTAG訪真器+周邊電路,用BANYANT+仿真器連接,BANYANT提示錯(cuò)誤,但可以顯示44B0編號(hào),好象是0X0F0F0F0F只類的,說(shuō)明44B0沒問(wèn)題
6 焊接晶體+RAM+ROM+周邊電路,用BANYANT+仿真器連接,可以顯示正確的44B0了
7 用BANYANT+仿真器連接,開AXD,在命令行窗口操作RAM,看可不可以修改,可以的話(用內(nèi)存窗口看RAM地址)RAM就沒問(wèn)題
可以用這個(gè)命令“setmem 0xc000000,0xffffffff,32”
我的RAM掛在BANK6上 所以地址是0XC000000,你要是改了就也得改。
8 用我寫的《自己寫了個(gè)C工程模板又寫了個(gè)使用說(shuō)明 》里的方法調(diào)試程序吧,寫個(gè)簡(jiǎn)單的,我當(dāng)時(shí)寫個(gè)LED閃爍的??春檬共弧?br /> 9 把程序按照《FLASH燒寫總結(jié) 》里的燒到FLASH里,測(cè)試一下
10 按照《UBOOT 移植操作》移植UBOOT
11 按照《UCLINUX下載簡(jiǎn)單說(shuō)明》下個(gè)UCLINUX
12 看看驅(qū)動(dòng)開發(fā)的方法,自己寫個(gè)驅(qū)動(dòng)看看
13 還有很多事東西著你玩 呵呵

十二 關(guān)于JTAG訪真器
JTAG訪真器現(xiàn)在用的多是簡(jiǎn)板的,一個(gè)244那種,用的沒什么不好。
按照并口定義不同分幾種,建議選WIFFLER定義的,因?yàn)橹С值能浖?。這個(gè)網(wǎng)上多的是,不多說(shuō)了。
值得提的是有的JTAG訪真器原理圖上有跳線用來(lái)使能復(fù)位信號(hào),這個(gè)一般不跳上。就是不用復(fù)位信號(hào),因?yàn)镴TAG協(xié)議里本身也可以控制44B0復(fù)位。
當(dāng)然,板子上的復(fù)位信號(hào)跳線也不用跳。

十三 哪個(gè)公司的ARM
這個(gè)是問(wèn)題比較簡(jiǎn)單。
1 ARM7主要就幾個(gè)公司的
三星,PHILIP,ATMEL的
ATMEL的有比較便宜的AT91SAM7S32 和AT91SAM7S64 專為8位應(yīng)用產(chǎn)品量身定做,價(jià)格很便宜好象《3刀吧。和PHILIP的21XX差不多,資料太少,項(xiàng)目中選還不錯(cuò)。
其他兩家上面說(shuō)了的不多說(shuō)了吧

2 ARM9
這個(gè)玩2410和2440的多吧,現(xiàn)在2440還比較火啊 可以考慮買個(gè)了
但是2410就比較便宜了,作為學(xué)習(xí)來(lái)說(shuō)反到和不錯(cuò),推薦整一個(gè):)
其實(shí)ARM9用的最多的領(lǐng)域應(yīng)該是消費(fèi)電子,比如手機(jī)PDA,而這上面用的多的應(yīng)該是INTEL的和TI的吧。
但是INTEL的TI的入門材料少,價(jià)格高,自己看情況定吧。

UBOOT命令總結(jié)(轉(zhuǎn))
很好的UBOOT命令總結(jié),我在起步時(shí)就是看的這篇東西,熟悉了以后就用“?”看自帶幫助就行:)

Printenv 打印環(huán)境變量。

Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes

Setenv 設(shè)置新的變量

Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes

Saveenv 保存變量

命令將當(dāng)前定義的所有的變量及其值存入flash中。用來(lái)存儲(chǔ)變量及其值的空間只有8k字節(jié),應(yīng)不要超過(guò)。

Loadb 通過(guò)串口Kermit協(xié)議下載二進(jìn)制數(shù)據(jù)。

Tftp 通過(guò)網(wǎng)絡(luò)下載程序,需要先設(shè)置好網(wǎng)絡(luò)配置

Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254???? (tftp服務(wù)器的地址)
下載bin文件到地址0x20000000處。
Uboot> tftp 20000000 application.bin (application.bin應(yīng)位于tftp服務(wù)程序的目錄)

Uboot> tftp 32000000 vmlinux
把server(IP=環(huán)境變量中設(shè)置的serverip)中/tftpdroot/ 下的vmlinux通過(guò)TFTP讀入到物理內(nèi)存32000000處。

Md 顯示內(nèi)存區(qū)的內(nèi)容。

Mm 修改內(nèi)存,地址自動(dòng)遞增。

Nm 修改內(nèi)存,地址不自動(dòng)遞增。

Mw 用模型填充內(nèi)存

mw 32000000 ff 10000(把內(nèi)存0x32000000開始的0x10000字節(jié)設(shè)為0xFF)

Cp 拷貝一塊內(nèi)存到另一塊

Cmp 比較兩塊內(nèi)存區(qū)

這些內(nèi)存操作命令后都可加一個(gè)后綴表示操作數(shù)據(jù)的大小,比如cp.b表示按字節(jié)拷貝。

Protect 寫保護(hù)操作

protect on 1:0-3(就是對(duì)第一塊FLASH的0-3扇區(qū)進(jìn)行保護(hù))
protect off 1:0-3取消寫保護(hù)

Erase 擦除扇區(qū)。

erase: 刪除FLASH的扇區(qū)
erase 1:0-2(就是對(duì)每一塊FLASH的0-2扇區(qū)進(jìn)行刪除)

對(duì)DataFlash的操作

U-Boot在引導(dǎo)時(shí)如果發(fā)現(xiàn)NPCS0和NPCS3上連有DataFlash,就會(huì)分配虛擬的地址給它,具體為 :
0xC0000000---NPCS0
0xD0000000---NPCS3

run 執(zhí)行設(shè)置好的腳本

Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit

bootcmd 保留的環(huán)境變量,也是一種腳本

如果定義了該變量,在autoboot模式下,將會(huì)執(zhí)行該腳本的內(nèi)容。

Go 執(zhí)行內(nèi)存中的二進(jìn)制代碼,一個(gè)簡(jiǎn)單的跳轉(zhuǎn)到指定地址

Bootm 執(zhí)行內(nèi)存中的二進(jìn)制代碼

要求二進(jìn)制代碼為制定格式的。通常為mkimage處理過(guò)的二進(jìn)制文件。
起動(dòng)UBOOT TOOLS制作的壓縮LINUX內(nèi)核, bootm 3200000

Bootp 通過(guò)網(wǎng)絡(luò)啟動(dòng),需要提前設(shè)置好硬件地址。

? 得到所有命令列表

help? help usb, 列出USB功能的使用說(shuō)明

ping? 注:只能開發(fā)板PING別的機(jī)器

usb

usb start:? 起動(dòng)usb 功能
usb info:? 列出設(shè)備
usb scan:? 掃描usb storage(u 盤)設(shè)備

kgo? 起動(dòng)沒有壓縮的linux內(nèi)核

kgo 32000000

fatls 列出DOS FAT文件系統(tǒng)

fatls usb 0列出第一塊U盤中的文件

fatload 讀入FAT中的一個(gè)文件

fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 讀到物理內(nèi)存0x32000000處!

flinfo 列出flash的信息

nfs

nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系統(tǒng))中的NFS文件系統(tǒng)中的aa.txt 讀入內(nèi)存0x32000000處。
?
CPU頻率計(jì)算方法---PLL設(shè)置
看見很多朋友不會(huì)計(jì)算PLL分頻和串口頻率,整理個(gè)筆記發(fā)上來(lái)

cpu時(shí)鐘頻率和串口波特率的計(jì)算公式
S3C44B0的系統(tǒng)時(shí)鐘設(shè)置公式
Fpllo 為系統(tǒng)的主頻,此處為60MHz
Fin 為晶振的頻率,此處為10MHz
一. 通過(guò)PLL輸出時(shí)鐘脈沖頻率的計(jì)算:
a) Fpllo = (m × Fin)/ (p × 2^s)
b) m = (MDIV + 8) , p = (PDIV + 2), s = SDIV
c) 20MHz < Fpllo < 66MHz
d) Fpllo * 2s < 170MHz (s應(yīng)該盡可能的大)
e) 1MHz <= Fin/p < 2MHz (最好是Fin/p = 1MHz)
f) 如果PLL打開則:Fpllo = Fout
g) 這樣計(jì)算出MDIV, PDIV, SDIV的值寫入PLLCON寄存器中就可設(shè)置Fpllo的輸出頻率。
根據(jù) d)知道s=1
根據(jù) e)知道p=10
再根據(jù) a)就知道了m=120,注意2^s代表2的s次方
再根據(jù) b)知道MDIV=112, PDIV=8, SDIV=1
根據(jù)44B0數(shù)據(jù)手冊(cè)5-14頁(yè)算出 PLLCON=0X70081
注意:PLLCON的結(jié)果不為一!比如P可以取8 取7……
注意:PLLCON寄存器是20位的 各個(gè)區(qū)域中間有空的
比如MDIV是寄存器里19-12位,PDIV是9-4位兩個(gè)中間有11,10位空,如果用2進(jìn)制算就添0

不過(guò)做過(guò)硬件的就知道 大可不必只要把MDIV, PDIV, SDIV用WEINDOWS自帶計(jì)算機(jī)直接由2進(jìn)制轉(zhuǎn)換成16進(jìn)制順序?qū)懢托?br /> 比如MDIV=112=0x70, PDIV=8=0x08, SDIV=1=0x1
PLLCON寄存器就是0x70081(看到這 連手冊(cè)都不用翻了吧?:))
還得多說(shuō)一句 不是0x700801,因?yàn)镾DIV=1=0x1不是0X01,跟PDIV=8=0x08不一樣

S3C44B0的UART波特率計(jì)算公式---分頻設(shè)置
S3C44B0的UART波特率計(jì)算公式
MCLK即主頻 此處為60MHz
UBRDIVn(又稱divisor) = ( (int)(MCLK / (bps * 16) + 0.5) – 1 )
MCLK = Fout = Fpllo
Bps = 1200,9600,19200,38400,57600,115200
例如 主頻=60MHz=60000000Hz
串口速度選115200

divisor=取整[60000000/(115200*16)??? +? 0.5]??? -1?? =?? 32
?
MINICOM設(shè)置
最近的朋友很多問(wèn)MINICOM設(shè)置的問(wèn)題
把原來(lái)寫的整理一下 發(fā)一下 現(xiàn)成的還行 有朋友問(wèn)我驅(qū)動(dòng)怎么開發(fā)
這個(gè)就比較麻煩了:)還是等我過(guò)段時(shí)間了也把手頭的幾個(gè)驅(qū)動(dòng)搞定了再說(shuō)

---------正文-------------
MINICOM是LINUX提供的和WEINDOWS超級(jí)終端一樣的工具,一般用做串口與開發(fā)板通信,當(dāng)然有的板子也用USB,但這里只介紹串口的設(shè)置

一 VMWARE虛擬機(jī)添加串口(如果沒用虛擬機(jī)可以跳過(guò)這步)
如果在VMWARE虛擬機(jī)下 一定要記得先確認(rèn)這步 要不不好使 很多朋友的問(wèn)題就在這里!
先關(guān)閉虛擬機(jī)下的LINUX,然后設(shè)置一下虛擬機(jī):在vm-〉settings-〉hardware里添加串口 COM1 COM2都加上吧

二 設(shè)置MINICOM
進(jìn)LINUX系統(tǒng) 開個(gè)控制臺(tái) 字符里輸入minicom 就啟動(dòng)了
這時(shí)一般還要設(shè)置一下
Ctrl+A進(jìn)入控制界面(Esc返回)按Z進(jìn)設(shè)置
一般設(shè)置兩個(gè)
1 按O(注意:是O不是零)設(shè)置第三第四項(xiàng),分別是串口設(shè)置與MODEM設(shè)置
串口設(shè)置:不用說(shuō)了吧 進(jìn)去都看明白了 敲字母 設(shè)置相應(yīng)項(xiàng)目 比如“115200 8-N-1”
MODEM設(shè)置:也要設(shè)置一下 要不有的看不到東西 把上面兩個(gè)選項(xiàng)都清空 就是按那行前面的字母(好象是‘A’和什么)然后光標(biāo)就跳過(guò)去了 刪之
回車 到開始選第三第四項(xiàng)的菜單 選下面的保存(別忘了保存 菜鳥們常犯)
2 回到剛才按O的界面 看一下P 里面的串口設(shè)置對(duì)不對(duì)
對(duì)就不用改了 不對(duì)改之

提醒一下:LINUX設(shè)備的編號(hào)是從0開始的 比如串口1也就是COM1在LINUX里的設(shè)備號(hào)叫ttyS0
串口設(shè)置里面要用到 那里添全部路徑也就是"/dev/ttyS0"
好了 就這么簡(jiǎn)單
?
uclinux編譯文檔
user94/mamajinco/upload/1012638628.rarUCLINUX編譯的過(guò)程是非常折磨人的,我在這整了3天!媽的!把很多公司的都試遍了。第3天的晚上10點(diǎn)搞定了~~

但說(shuō)真的,很難寫下來(lái)整體過(guò)程,因?yàn)楦姹居嘘P(guān),跟各個(gè)板子也有關(guān)系……

所有的移植都是用2.4做的,誰(shuí)讓咱是菜鳥呢,先從簡(jiǎn)單的做。
總結(jié)幾點(diǎn)吧,介紹個(gè)現(xiàn)在主流的立宇泰的板子UCLINUX編譯方法和我自己拿HFRK的板子提供的UCLINUX改的8019和NFS的方法
一 立宇泰(憑回憶,有些地方當(dāng)時(shí)沒記下來(lái))
1下載
arm-elf-tools-20030314.sh//開發(fā)工具
uClinux-dist-20040408.tar.gz//源代碼包
uClinux-20040408-ARMSYS.rar//立宇泰的補(bǔ)丁
configfiledemo.rar//立宇泰的設(shè)置文件

前兩個(gè)UCLINUX的網(wǎng)站有下的,很快。
后兩個(gè)立宇泰公司網(wǎng)站有下的,很小,也很快。

2 安裝
arm-elf-tools-20030314.sh
在LINUX(我用的VMWARE跑的PC4)下雙擊,選運(yùn)行就行,不多說(shuō)了,有人這里出過(guò)問(wèn)題,提示一個(gè)錯(cuò)誤,去21IC搜索一下,把一個(gè)參數(shù)改一下就行。但我的沒這個(gè)問(wèn)題。

uClinux-dist-20040408.tar.gz
考到/usr/src/下,右鍵截壓縮到當(dāng)前目錄,也沒什么說(shuō)的。就是記得硬盤要有足夠的空間,這個(gè)比較大,一般還得有幾個(gè)備份,得2G左右。

uClinux-20040408-ARMSYS.rar
這個(gè)補(bǔ)丁確實(shí)不錯(cuò)!!好商家!還共享了,改了一堆文件。
截壓縮不說(shuō)了,得到PARCH文件,拷貝到剛才UCLINUX源代碼包目錄下,注意,要到uClinux-dist目錄里。不是uClinux-dist-20040408.tar.gz目錄里。

還不能直接補(bǔ)丁,需要改一下uClinux-dist/vector/Samsung/4510B這個(gè)文件夾,直接把名字改成44B0就行了。

打開終端吧,CD到uClinux-dist目錄里輸入以下命令:
patch -p1 < uClinux-20040408-ARMSYS.patch
注意-P1是數(shù)字一不是L字母,命令什么意思就不解釋了,GOOGLE一下,有個(gè)兄弟專門講了。
打包到最后會(huì)有問(wèn)題,因?yàn)閯偛旁蹅儼?510直接改成44B0了嘛,問(wèn)你問(wèn)題的時(shí)候敲的N吧,退出。
把uClinux-dist/vector/Samsung/44B0里Makefile 和 rc打開,對(duì)著uClinux-20040408-ARMSYS.patch改。
具體方法是:雙擊(這里PC機(jī)都默認(rèn)使用GNOME,比KDE方便,比如雙擊打開)查看PATCH文件。對(duì)著改吧。
補(bǔ)充個(gè)語(yǔ)法知識(shí):.patch里面主要有幾種符號(hào)分別是“+++”“---”"+""-""@@""diff"
每個(gè)區(qū)域都是diff --- +++ @@四行開始 之后是+ -或者無(wú)符號(hào)的行,+代表在一個(gè)位置加一行,-代表刪除一行,什么都不帶就什么都不做,用來(lái)定位的。
好了,文件最后可以找到 diff uClinux-dist/vector/Samsung/44B0開始的文件了吧?
對(duì)著把Makefile 和 rc改了吧。

打完補(bǔ)丁,還得做一件事,把/uClinux-dist/Linux-2.4.x/Driver/Block/blkmem.c改了
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
#endif
后加個(gè)
#ifdef CONFIG_BOARD_MBA44
extern char romfs_data[];
extern char romfs_data_end[];
#endif
?
#ifdef CONFIG_BOARD_MBA44
{0, 0xc700000, -1},
#endif
改策成
#ifdef CONFIG_BOARD_MBA44
{0, romfs_data, -1},
#endif

要不編譯后的內(nèi)核運(yùn)行的時(shí)候會(huì)有“Kernel panic: VFS: Unable to mount root fs on XXXXX”錯(cuò)誤

3 設(shè)置
make menuconfig
當(dāng)然 也可以make Xconfig 但不推薦,雖然顯示很好,但速度慢~~
進(jìn)了菜單,基本就幾個(gè)鍵子上 下 左 右 回車 空格。
選什么比較麻煩,建議第一次先用剛才下的configfiledemo立宇泰的設(shè)置文件,解壓以后是三個(gè)文件,分別對(duì)應(yīng)主菜單,內(nèi)核和用戶菜單。
選擇Load an Alternate Configuration File
里面輸入文件的地址與名稱,記得開始的時(shí)候說(shuō)的VMWARE-TOOS共享吧?把這幾個(gè)文件拷貝到合適的目錄下吧,我就放在uClinux-dist-20040408.tar.gz下了。
左右選《EXIT》退出。選保存。

一會(huì)自動(dòng)彈出KERNEL設(shè)置菜單,和上面一樣Load an Alternate Configuration File,選config_kernel文件。
需要注意的是這里的USB好象不對(duì),因?yàn)榘遄由蠜]整USB(以后再整)就把USB的選項(xiàng)直接去掉了(到USB子菜單下把[*]去了)。
要不會(huì)有hcb.c錯(cuò)誤。

System Type里要改一下
(Samsung) ARM system type
[*] Set flash/sdram size and base addr
(00800000) (S)DRAM Size
(00200000) FLASH Size
(S3C44B0X-MBA44) Board Implementation

Block devices也改一下
[*] RAM disk support
(4096)?? Default RAM disk size
(AMD)?? FLASH type
(AUTO)?? FLASH size
(AUTO)?? FLASH bit width

General setup改一下
[*] Timer and CPU usage LEDs
[*]?? Timer LED
[*]?? CPU usage LED

其他沒說(shuō)就是別動(dòng)

左右選《EXIT》退出。選保存

一會(huì)自動(dòng)彈出USER設(shè)置菜單,和上面一樣Load an Alternate Configuration File,選config_user文件。(語(yǔ)法多整齊)
沒有注意了,直接左右選《EXIT》退出。選保存。

說(shuō)實(shí)在的,要是沒有這些CONFIG文件,自己改是件很麻煩的事,本人就嘗試了自己增加NFS和修改8019(我的板子是自己畫的和這個(gè)不一樣)那叫一個(gè)麻煩~~~。建議大家新手還是先把這些順利的做完了再說(shuō)改的。

退出以后就是編譯了。
4 編譯
幾大命令
make dep
make clean
make lib_only
make user_only
make romfs
make
順利的話一次全的執(zhí)行了,但第3步要是自己鼓搗過(guò)在這里就要受苦了,比如后面要講的把驅(qū)動(dòng)編譯進(jìn)內(nèi)核里。
這里要說(shuō)的是,出問(wèn)題不可怕,但一要做好記錄,知道自己改什么,錯(cuò)誤可能出現(xiàn)在什么地方,因?yàn)閳?bào)告的錯(cuò)誤很可能不是出現(xiàn)錯(cuò)誤的位置。二要善于搜索,使用GOOGLE搜索。三 要BBS提問(wèn)的時(shí)候把錯(cuò)誤,操作記錄都說(shuō)清楚了,等待高手給你解答。四就是自己要積累看MAKE錯(cuò)誤的知識(shí)。此外別無(wú)他法!

二 好了
我最后用的是HFRK的包,版本是2005311,不用打補(bǔ)丁。但聽說(shuō)所有2005311的包都不用打了,好消息啊。但編譯的過(guò)程仍然折磨人。
設(shè)置與編譯的過(guò)程仍然和上面一樣,這里共項(xiàng)我的CONFIG文件供大家參考吧。就不多說(shuō)了。
下面說(shuō)我自己改8019驅(qū)動(dòng)的方法。
8019用的是drivers/net/下的ne.c文件改的。
改之前要差幾點(diǎn):8019是8位還是16位,地址線是怎么對(duì)應(yīng)的(8019是ADDR1對(duì)44B0的ADDR幾?),8019掛在44B0的哪個(gè)BANK上,8019使用哪個(gè)中斷,中斷號(hào)多少。

好了,對(duì)應(yīng)的改吧。
先改文件。
drivers/net/ne.c
找到CONFIG_BOARD_MBA44,修改一下中斷號(hào)dev-irq,改成我們電路中使用的EINT1(中斷號(hào)24),掛在BANK3上地址0x06000000
……
#elif defined(CONFIG_BOARD_MBA44)
static int once = 0;
if (once)
return -ENXIO;
dev->base_addr = base_addr = 0x06000000;
dev->irq = 24 ;
once++;
……

注意:一定要知道8019地址線是怎么對(duì)應(yīng)的,我的是0對(duì)0(8位)但有的朋友8019是7對(duì)0,就要改了,但是具體哪個(gè)文件忘了,GOOGLE搜索一下吧:)

進(jìn)make menuconfig里把以下選了
1 General Setup --->
Networking Support

2Networking options --->
?Packet socket
TCP/IP networking

3 進(jìn)Networking device Support---》
4 File system --->
Network device support?

Ethernet (10 or 100Mbit) --->
Other ISA cards
NE2000/NE1000 support
注意:這里通過(guò)[ ]??????? 16Bits mode support選擇8019工作位,我沒選,因?yàn)樽龅氖?位的

4 Network Applications --->
arp
ifconfig
inetd
ping
route
好了,之后就是編譯了,燒寫,然后測(cè)試一下PING宿主機(jī),NFS掛一下看看。
注意:宿主機(jī)的防火墻要關(guān)了,不然PING不通,當(dāng)然NFS也不行。

好了,編譯內(nèi)核就到這里,因?yàn)檫^(guò)于繁瑣,只能分部分來(lái)簡(jiǎn)化寫了~~大家有問(wèn)題再交流吧。

搞定UCLINUX移植以后就開始整個(gè)最小的程序吧,當(dāng)然是HELLOWORLD了:)
一 先寫個(gè)helloworld.c (對(duì)于小代碼我喜歡先在WINDOW下建個(gè)“新建 文本文檔.txt”再在里面寫代碼,然后保存后改名成helloworld.c 注意的是擴(kuò)展名也要從TXT改成C才行,原來(lái)說(shuō)過(guò),不多說(shuō)了)
里面寫下面等號(hào)里的代碼:
==================
#i nclude <stdlib.h>
#i nclude <stdio.h>

int main(void)
{
?printf("hello world ! I got it!\n");
?return 0;
}
==================
不用解釋了吧:)

二 然后編寫個(gè)makefile吧,別總用arm-elf-gcc了。
為以后編寫大規(guī)模程序打個(gè)基礎(chǔ):)
建個(gè)makefile(和前面一樣,先TXT然后改名,沒有擴(kuò)展名)
=====================
EXEC = helloworld
OBJS = helloworld.o

all: $(EXEC)
$(EXEC): $(OBJS)
?$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:
?$(ROMFSINST) /bin/$(EXEC)
clean:
?rm -f $(EXEC) *.elf *.gdb *.o
======================
基本能看明白吧?MAKE的語(yǔ)法比較復(fù)雜,就不多講了,可以看我在前幾篇筆記里推薦的ZLG那本書。但幸運(yùn)的是基本不用自己動(dòng)手了,LINUX源代碼里有很多MAKE 拿來(lái)改改吧:)

三 下面就是有朋友問(wèn)我怎么把程序下到板子里了
一般說(shuō)來(lái)有幾種方法。
1 板子掛載宿主機(jī)的NFS共享目錄,把程序拷貝到/tmp目錄(在RAM里)測(cè)試一下,但缺點(diǎn)是掉電要消失,只適合做調(diào)試時(shí)用。
2 做JFFS之類的日志文件系統(tǒng),和上面一樣NFS掛載拷貝過(guò)來(lái),JFFS文件系統(tǒng)可以保證掉電不消失,類似U盤里拷貝程序(只是結(jié)果類似,原理完全不同)。
3 直接把程序燒寫進(jìn)ROMFS文件系統(tǒng),這里就只介紹這種。原因有兩點(diǎn) 首先 我還沒學(xué)怎么做JFFS,其次 我還沒學(xué)怎么做JFFS。哈哈
好了,那開工。

1)在uClinux-dist/user/下建立目錄hello
把helloworld.c和makefile拷貝到里面,怎么拷貝不用說(shuō)了吧?VMWARE-TOOLS共享文件夾吧。

2)修改uClinux-dist/user/makefile

在適當(dāng)位置 找一行(這句語(yǔ)法扎堆的地方)加
dir_$(CONFIG_USER_HELLO)?????????????? += hello

3)記住CONFIG_USER_HELLO這個(gè)名(自己可以改的 )
在uClinux-dist/config/Configure.help里加(扎堆)下面兩行
CONFIG_USER_HELLO
? Only print hello world
上面是名(和前面必須一致)下面是注釋

4)改uClinux-dist/config/Configure.in里按照扎堆的原則加下面幾行
#############################################################################
mainmenu_option next_comment
comment 'Hello World'
bool 'demo' CONFIG_USER_MYAPP_DEMO
endmenu
#############################################################################
#號(hào)中間加的就是語(yǔ)法了,基本意思就是在Hello World--->下加個(gè)[]demo
編譯過(guò)內(nèi)核的都熟悉吧:)

5)像編譯內(nèi)核一樣編譯了
進(jìn)內(nèi)核源代碼目錄,比如uClinux-dist
make menucinfig
把主菜單選好了,不用說(shuō)了吧?我的編譯內(nèi)核筆記里有,當(dāng)然如果不想修改內(nèi)核就只選上以下這個(gè)
Kernel/Library/Defaults Selection? --->[*] Customize Kernel Settings (NEW)
意思是修改USER程序
EXIT 保存
然后在Customize Kernel Settings菜單里最后會(huì)出現(xiàn)Hello World--->
回車進(jìn)去以后看見[]demo了吧?
選上

EXIT 保存

6)編譯
幾大命令~~~
make dep
make clean
make lib_only
make user_only
make romfs
make
之后在生成uClinux-dist/image下有了uclinux_rom.bin

7)燒寫到板子里
板子里有UBOOT了吧?
順序做下面步驟(我在UBOOT編譯筆記里寫過(guò),再寫一次)
A:loadb 0xc500000
B:發(fā)送(KERMIT協(xié)議)uclinux_rom.bin
C:erase 0x50000 0x1fffff
D:cp 0xc500000 0x50000 文件大小
注意:文件大小就是在傳輸完uclinux_rom.bin后顯示的數(shù)字 0X開頭=什么的那個(gè)0X數(shù)字
比如提示是0X0012a7f1=1222641
就0X0012a7f1/4+2=0x4A9FE命令就是:cp 0xc500000 0x50000 0x4A9FE
E:重起板子 就進(jìn)UCLINUX了


8)板子進(jìn)到/bin下 看是不是有個(gè)helloworld?
執(zhí)行它就看見“hello world ! I got it!”
注意:因?yàn)榘盐募帉懙絻?nèi)核了,所以不是用./helloworld
直接在任何目錄下寫helloworld就行

最簡(jiǎn)單的驅(qū)動(dòng)---讓LED閃一閃-1
user94/mamajinco/upload/1012942565.rar這幾天抽時(shí)間做了幾個(gè)驅(qū)動(dòng),基本都是字符設(shè)備,什么GPS 模塊了GPRS模塊了LCD了
有很多朋友關(guān)心驅(qū)動(dòng),但更菜的菜鳥居多:)總結(jié)了一下 把I/O驅(qū)動(dòng)改成個(gè)更簡(jiǎn)單的LED驅(qū)動(dòng)吧
做的工作非常簡(jiǎn)單,就是讓連在GPC0-GPC2上的LED順序閃10下
目的就是演示一下驅(qū)動(dòng)過(guò)程。

一 先補(bǔ)充一下基礎(chǔ)知識(shí) 懂的朋友就不用看了

嵌入式驅(qū)動(dòng)的概念
?
設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核和機(jī)器硬件之間的接口,設(shè)備驅(qū)動(dòng)程序?yàn)閼?yīng)用程序屏蔽了硬件的細(xì)節(jié),這樣在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備驅(qū)動(dòng)程序是內(nèi)核的一部分,它主要完成的功能有:對(duì)設(shè)備進(jìn)行初始化和釋放;把數(shù)據(jù)從內(nèi)核傳送到硬件和從硬件讀取數(shù)據(jù);讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)、回送應(yīng)用程序請(qǐng)求的數(shù)據(jù)以及檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。
?
Linux將設(shè)備分為最基本的兩大類:一類是字符設(shè)備,另一類是塊設(shè)備。字符設(shè)備和塊設(shè)備的主要區(qū)別是:在對(duì)字符設(shè)備發(fā)出讀/寫請(qǐng)求時(shí),實(shí)際的硬件I/O一般就緊接著發(fā)生了。字符設(shè)備以單個(gè)字節(jié)為單位進(jìn)行順序讀寫操作,通常不使用緩沖技術(shù);塊設(shè)備則是以固定大小的數(shù)據(jù)塊進(jìn)行存儲(chǔ)和讀寫的,如硬盤、軟盤等,并利用一塊系統(tǒng)內(nèi)存作為緩沖區(qū)。為提高效率,系統(tǒng)對(duì)于塊設(shè)備的讀寫提供了緩存機(jī)制,由于涉及緩沖區(qū)管理、調(diào)度和同步等問(wèn)題,實(shí)現(xiàn)起來(lái)比字符設(shè)備復(fù)雜得多。LCD是以字符設(shè)備方式加以訪問(wèn)和管理的,Linux把顯示驅(qū)動(dòng)看做字符設(shè)備,把要顯示的數(shù)據(jù)一字節(jié)一字節(jié)地送往LCD驅(qū)動(dòng)器。
?
Linux的設(shè)備管理是和文件系統(tǒng)緊密結(jié)合的,各種設(shè)備都以文件的形式存放在/dev目錄下,稱為設(shè)備文件。應(yīng)用程序可以打開、關(guān)閉和讀寫這些設(shè)備文件,完成對(duì)設(shè)備的操作,就像操作普通的數(shù)據(jù)文件一樣。為了管理這些設(shè)備,系統(tǒng)為設(shè)備編了號(hào),每個(gè)設(shè)備號(hào)又分為主設(shè)備號(hào)和次設(shè)備號(hào)。主設(shè)備號(hào)用來(lái)區(qū)分不同種類的設(shè)備,而次設(shè)備號(hào)用來(lái)區(qū)分同一類型的多個(gè)設(shè)備。對(duì)于常用設(shè)備,Linux有約定俗成的編號(hào),如硬盤的主設(shè)備號(hào)是3。Linux為所有的設(shè)備文件都提供了統(tǒng)一的操作函數(shù)接口,方法是使用數(shù)據(jù)結(jié)構(gòu)struct file_operations。這個(gè)數(shù)據(jù)結(jié)構(gòu)中包括許多操作函數(shù)的指針,如open()、close()、read()和write()等,但由于外設(shè)的種類較多,操作方式各不相同。Struct file_operations結(jié)構(gòu)體中的成員為一系列的接口函數(shù),如用于讀/寫的read/write函數(shù)和用于控制的ioctl等。打開一個(gè)文件就是調(diào)用這個(gè)文件file_operations中的open操作。不同類型的文件有不同的file_operations成員函數(shù),如普通的磁盤數(shù)據(jù)文件,接口函數(shù)完成磁盤數(shù)據(jù)塊讀寫操作;而對(duì)于各種設(shè)備文件,則最終調(diào)用各自驅(qū)動(dòng)程序中的I/O函數(shù)進(jìn)行具體設(shè)備的操作。這樣,應(yīng)用程序根本不必考慮操作的是設(shè)備還是普通文件,可一律當(dāng)作文件處理,具有非常清晰統(tǒng)一的I/O接口。所以file_operations是文件層次的I/O接口。

二 開始寫了
采用了在代碼里加注釋的方法,同時(shí)把幾個(gè)文件上傳了一下,喜歡的朋友可以下載當(dāng)作模板。每個(gè)文件以==隔開
一共需要寫寫3個(gè)文件,1個(gè)驅(qū)動(dòng)頭文件,1個(gè)驅(qū)動(dòng)文件,一個(gè)驅(qū)動(dòng)測(cè)試用程序文件
分別是test.h,test.c和ledtest.c

簡(jiǎn)單說(shuō)說(shuō)驅(qū)動(dòng)都做什么,怎么做
1 系統(tǒng)加載驅(qū)動(dòng)
2 應(yīng)用程序里打開設(shè)備(文件)
3 應(yīng)用程序?qū)υO(shè)備操作
4 應(yīng)用程序關(guān)閉設(shè)備(文件)
5 系統(tǒng)關(guān)閉設(shè)備

應(yīng)用程序如何對(duì)設(shè)備操作?
記得C語(yǔ)言里怎么寫文件嗎?這里很相象的。對(duì)于一般的字符設(shè)備(還有塊設(shè)備,網(wǎng)絡(luò)設(shè)備等等)主要有3個(gè)函數(shù)(還有很多,可以看)llseek??? read:??? write:??? ioctl:? 這里只用ioctl:控制函數(shù),當(dāng)然也可以使用讀寫函數(shù)操作IO 口,但ioctl:似乎更適合。
具體實(shí)現(xiàn)可以看ledtest.c文件了。

test.c中主要有幾個(gè)函數(shù) 分別負(fù)責(zé)初始化和清除,打開和關(guān)閉。以及ioctl對(duì)串口寄存器寫一些數(shù)據(jù)。
初始化和清除,打開和關(guān)閉函數(shù)里都各有一句主要句,已經(jīng)分別作了注釋。只要記住就好了。

對(duì)寄存器操作就不單獨(dú)說(shuō)了,需要看44B0數(shù)據(jù)手冊(cè)了。好了 剩下的看代碼吧。
==============================
==========test.h==================
==============================

/****************************************Copyright (c)**************************************************
**?????????????????????????????? FREE
**
**--------------File Info-------------------------------
** File Name: config.h
** Last modified Date:? 2006-9-9
** Last Version: 1.0
** Descriptions: User Configurable File
**
**----------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date:?? 2006-9-9
** Version: 1.0
** Descriptions: First version
**
**-------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:1.0
** Descriptions:在此忠心感謝ZLG的模版 我的高質(zhì)量編程意識(shí)起源于此
**
*****************************************************/
//防止重復(fù)包含此文件而設(shè)置的宏
#ifndef __CONFIG_H
#define __CONFIG_H

//包含必要的頭文件
#i nclude <linux/config.h>
#i nclude <linux/module.h> //模塊必須包含的頭文件
#i nclude <linux/kernel.h>?????? /* printk()函數(shù),用于向內(nèi)核輸出信息 */
#i nclude <linux/fs.h>?????????? /* 很重要 其中包含了如file_opration等結(jié)構(gòu) 此結(jié)構(gòu)用于文件層接口 */
#i nclude <linux/errno.h>??????? /* 錯(cuò)誤代碼*/
#i nclude <asm/uaccess.h>
#i nclude <linux/types.h>
#i nclude <linux/mm.h>
#i nclude <asm/arch/s3c44b0x.h>

/********************************/
/*???? 應(yīng)用程序配置???????????? */
/********************************/
//以下根據(jù)需要改動(dòng)
//定義主設(shè)備號(hào) 設(shè)備名稱

#define LED_MAJOR_NR 231 //231~239 240~255都可以

#define DEVICE_NAME "led"?????????????? /* name for messaging */

#define SET_LED_OFF 0
#define SET_LED_ON 1

#endif
/************************??????????????????????????? End Of File
*********************************************************/


=============END===============

最簡(jiǎn)單的驅(qū)動(dòng)---讓LED閃一閃-2
==============================
============test.c================
==============================

/*************Copyright (c)**************************
**?????????????????????????????? FREE
**
**--------------File Info-----------------------------------------
** File Name: test.c
** Last modified Date:? 2006-9-9
** Last Version: 1.0
** Descriptions: User Configurable File
**
**----------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date:?? 2006-9-9
** Version: 1.0
** Descriptions: First version
**
**--------------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:1.0
** Descriptions:在此忠心感謝ZLG的模版 我的高質(zhì)量編程意識(shí)起源于此
**
***********************************************************/
#i nclude "test.h"//包含驅(qū)動(dòng)頭文件


/************************************************************
????????????? function announce
******************************************************/
//以下是關(guān)鍵函數(shù)的聲明
static int led_open(struct inode *inode, struct file *filp);
//打開設(shè)備時(shí)用的 linux把設(shè)備當(dāng)作文件管理 設(shè)備最好在用的時(shí)候再打開 盡量不要提前
static int led_release(struct inode *inode, struct file *filp);
static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
??????????????? unsigned long param);
//控制函數(shù) 這里用于控制LED亮與滅
int? led_init(void);//注冊(cè)時(shí)用的 注意 模塊注冊(cè)的越早越好
void led_cleanup(void);//卸載時(shí)用的

/*************************************************************
**????????????????? "全局和靜態(tài)變量在這里定義"????????
**??????? global variables and static variables define here

/****************************************************************/

static struct file_operations LED_fops =??????? /* 前面基礎(chǔ)部分提到的重要結(jié)構(gòu)體了*/
{
??? owner:????? THIS_MODULE,

#if 0/*注意:#if 0-#endif里的代碼是不編譯的,但這里為了驅(qū)動(dòng)模板講解上的完整性仍然加上了*/
??? llseek:???? gpio_llseek,
??? read:?????? gpio_read,
??? write:????? gpio_write,
#endif
??? ioctl:????? led_ioctl,//控制函數(shù)
??? open:?????? led_open, //打開函數(shù),打開文件時(shí)做初始化的
??? release:??? led_release,//釋放函數(shù),關(guān)閉時(shí)調(diào)用
};

???????????????
/**************************************************************
** Function name: led_open
** Descriptions:? open device
** Input:inode:?? information of device
**?????? filp:??? pointer of file
** Output 0:????? OK
**??????? other:? not OK
** Created by:??? Chenmingji
** Created Date:? 2006-9-9
**-------------------------------------------------------------
** Modified by:mamajinco
** Modified Date: 2006-9-9
**--------------------------------------------------------------
**************************************************************/
??????? static int led_open(struct inode *inode, struct file *filp)
{
?/*初始化放在OPEN里*/
?(*(volatile unsigned *)S3C44B0X_PCONC) &= 0xffffffc0;
?(*(volatile unsigned *)S3C44B0X_PCONC) |= 0xffffffd5; /*GPIO C口0~2 設(shè)置為輸出*/

?(*(volatile unsigned *)S3C44B0X_PUPC) &= 0xffffffc0;/*GPIO C口0~2 設(shè)置為上拉*/

???? MOD_INC_USE_COUNT;
???? return 0;?????????
}
?
最簡(jiǎn)單的驅(qū)動(dòng)---讓LED閃一閃-3
*********************************************************
** Function name: led_release
** Descriptions:? release device
** Input:inode:?? information of device
**?????? filp:??? pointer of file
** Output 0:????? OK
**??????? other:? not OK
** Created by:??? Chenmingji
** Created Date:? 2006-9-9
**-----------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**--------------------------------------------------------
****************************************************/
??????? static int led_release(struct inode *inode, struct file *filp)
{
??? MOD_DEC_USE_COUNT;
??? return(0);
}
/****************************************************
** Function name: led_ioctl
** Descriptions:? IO control function
** Input:inode:?? information of device
**?????? filp:??? pointer of file
**?????? cmd:???? command
**?????? arg:???? additive parameter
** Output 0:????? OK
**??????? other:? not OK
** Created by:??? Chenmingji
** Created Date:? 2006-9-9
**-------------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**----------------------------------------------------------
***********************************************************/
??????? static int led_ioctl(struct inode *inode, struct file *filp,
?????????????????????? unsigned int cmd, unsigned long arg)
{
??? if( arg > 2 )//判斷IO是否屬于0-2
?return -1;

??? switch(cmd)
??? {
??????? case 0://把ARG傳來(lái)的IO口編號(hào)轉(zhuǎn)換成寄存器數(shù)據(jù),把相應(yīng)IO口置低
???????? (*(volatile unsigned *)S3C44B0X_PDATC) |= 0x1 << arg;

???????????? break;

??????? case 1://把ARG傳來(lái)的IO口編號(hào)轉(zhuǎn)換成寄存器數(shù)據(jù),把相應(yīng)IO口置高
? (*(volatile unsigned *)S3C44B0X_PDATC) &= 0x0 << arg;
???????????? break;

??????? default:
? return -1;
? break;
??? }
??? return 0;
}

/**************************************************
** Function name: led_init
** Descriptions:? init driver
** Input:none
** Output 0:????? OK
**??????? other:? not OK
** Created by:??? Chenmingji
** Created Date:? 2006-9-9
**------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**-----------------------------------------------------
*************************************************/
?int led_init(void)
{
??? int? result;

??? result = register_chrdev(231,"led",? &LED_fops);
/*關(guān)鍵語(yǔ)句 用于注冊(cè)
** 注意!這是傳統(tǒng)的注冊(cè)方法 在2.4以上的linux版本中 加入了devfs設(shè)備文件系統(tǒng) 使注冊(cè)更容易 但為了與大部分資料相**同 大家看的方便? 這里仍然使用老方法*/
??? if (result < 0) //用于異常檢測(cè)
??? {
??????? printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n", LED_MAJOR_NR ); //printk用于向內(nèi)核輸出信息
??????? return(result);
??? }


??? printk(KERN_INFO DEVICE_NAME ": init OK\n");
?
?return(0);
}

最簡(jiǎn)單的驅(qū)動(dòng)---讓LED閃一閃-4
/*************************************************************
** Function name: led_cleanup
** Descriptions:? exit driver
** Input:none
** Output none
** Created by:??? Chenmingji
** Created Date:? 2006-9-9
**--------------------------------------------------------
** Modified by: mamajinco
** Modified Date: 2006-9-9
**-----------------------------------------------------
**************************************************/
??????? void led_cleanup(void)
{
??? unregister_chrdev(231, "led"); //與register_chrdev配對(duì)使用 用于清楚驅(qū)動(dòng)
}

/***********************************************************
**??????????????????????????? End Of File
****************************************************/


===============END=============

=====================================
=============ledtest.c===============
===================================

/*********************Copyright (c)**************************
**?????????????????????????????? FREE
**
**--------------File Info----------------------------
** File Name: led.c
** Last modified Date:? 2006-9-9
** Last Version: 1.0
** Descriptions: User Configurable File
**
**-------------------------------------------------------
** Created By: ZLG CHENMINGJI
** Created date:?? 2006-9-9
** Version: 1.0
** Descriptions: First version
**
**--------------------------------------------------------
** Modified by:MAMAJINCO
** Modified date:2006-9-9
** Version:1.0
** Descriptions:在此忠心感謝ZLG的模版 我的高質(zhì)量編程意識(shí)起源于此
**
********************************************************/

#i nclude <stdio.h>
#i nclude <stdlib.h>
#i nclude <unistd.h>
#i nclude <fcntl.h>
#i nclude <sys/types.h>
#i nclude <sys/stat.h>

void delay(int delay)//延時(shí)用函數(shù)
{
?int i;
?for(;delay>0;delay--)
?{
? for(i=0 ; i < 5000 ; i ++);
?
?}
}

int main()
{
?int fd1;
?int j;

?fd1= open("/dev/led" , O_RDWR);/*打開設(shè)備,就象打開文件一樣簡(jiǎn)單*/

?if(fd1 == -1)/*異常處理*/
?{
? printf ( "file can not be open" );
? return -1;
?}
?
?for (j =0 ; j< 10 ; j ++)/*重復(fù)10次*/
?{
? ioctl(fd1 , 1 , 0);/*GPC0上LED亮*/
? delay(1000);
? ioctl(fd1 , 0 , 0);/*GPC0上LED滅*/
? ioctl(fd1 , 1 , 1);/*GPC1上LED亮*/
? delay(1000);
? ioctl(fd1 , 0 , 1);/*GPC1上LED滅*/
? ioctl(fd1 , 1 , 2);/*GPC2上LED亮*/
? delay(1000);
? ioctl(fd1 , 0 , 2);/*GPC2上LED滅*/
? delay(1000);
?}
?
?close (fd1);/*關(guān)閉設(shè)備(文件)*/
?return 0;
?
}


===============END===============

最簡(jiǎn)單的驅(qū)動(dòng)---讓LED閃一閃-5
三 驅(qū)動(dòng)編譯進(jìn)內(nèi)核
編譯的中對(duì)于菜鳥來(lái)說(shuō)需要需要注意幾點(diǎn)
1 被打錯(cuò)字,包括上面的函數(shù)中也是!
就算各位扔磚頭我也得說(shuō),因?yàn)榫幾g進(jìn)內(nèi)核是很費(fèi)時(shí)間的~~而且最重要的是對(duì)于菜鳥來(lái)說(shuō)make的錯(cuò)誤提示都是一道關(guān),絕對(duì)不要自己給自己設(shè)置障礙!我們團(tuán)隊(duì)里就常有兄弟姐妹出現(xiàn)這樣的錯(cuò)誤,怎么看怎么對(duì),尤其是從書上抄下來(lái)的命令和字符,l和1還有I你怎么分?最后一個(gè)是大寫的i :)
2 不要用中文文件名 包括ABC(復(fù)件)
要不然MAKE出錯(cuò)
3 在各個(gè)現(xiàn)成的文件里修改的時(shí)候按照原有的格式修改 要不然菜鳥很難保證不犯低級(jí)錯(cuò)誤
讓我想起來(lái)了IBM的規(guī)律總結(jié)測(cè)試題:6 13 7 14 8 下一個(gè)數(shù)字是什么?

好了 開始修改!
===============START==============
uClinux-dist/linux-2.4.x/drivers/char/Makefile
----------------------------------------------
obj-$(CONFIG_C5471_WDT) += wdt_c5471.o之后加
obj-$(CONFIG_TEST) += led.o
================END============

=================START===========
uClinux-dist/linux-2.4.x/drivers/char/Config.in
-----------------------------------------
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
?? bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X之后加
?? bool 'Test LED Driver' CONFIG_TEST
================END=================
=================START=============
uClinux-dist/linux-2.4.x/drivers/char/mem.c
-----------------------------------------
開頭的地方扎堆加
#ifdef CONFIG_LEDTEST
extern void led_init(void);
#endif

int __init chr_dev_init(void)之后加
#ifdef CONFIG_TEST
?led_init();
#endif
================END==============
=================START============
uClinux-dist/vendors/Samsung/44B0/Makefile
-----------------------------------------
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15\之后加
\
led,c,231,0 \
================END==============


四 把程序編譯進(jìn)內(nèi)核
沒什么說(shuō)的了,和過(guò)去寫的簡(jiǎn)單的程序一樣加 但這里再重復(fù)一次

================START============
uClinux-dist/user/Makefile
-----------------------------------------
扎堆加個(gè)下面
dir_$(CONFIG_USER_LEDTEST)????????????????? += LEDtest
=================END===============
================START============
uClinux-dist/config/Configure.help
-----------------------------------------
扎堆加個(gè)下面
CONFIG_USER_LEDTEST
? Test the LED driver
=================END=============
================START================
uClinux-dist/config/Configure.in
-----------------------------------------
##############################
mainmenu_option next_comment
comment 'LED driver test PG'

bool 'LEDtest' CONFIG_USER_LEDTEST
endmenu

###############################
=================END=============

五 編譯 燒寫……省略200字 想看的看我寫的helloworld編譯筆記吧
六 下面的操作在板子上執(zhí)行
1 cd /dev
2 ls
看見里面有個(gè)LED了吧?
3 cd /proc
4 cat devices
看見驅(qū)動(dòng)列表吧?
led 231也應(yīng)該在里面
5 LEDtest
在任何地方執(zhí)行這個(gè)語(yǔ)句 就可以
之后看GPIO的C口電平吧:)

總結(jié)
好了 到今天為止簡(jiǎn)單的東西都已經(jīng)整理過(guò)了 也感謝大家最近的關(guān)注

剩余的部分LCD圖形操作 GPRS驅(qū)動(dòng) 有機(jī)會(huì)再發(fā)吧 估計(jì)對(duì)于菜鳥不是很重要。

有人向我要GPS的驅(qū)動(dòng) 我沒給:)其實(shí)很簡(jiǎn)單的UART 但是涉及到本實(shí)驗(yàn)室別人的勞動(dòng) 就不發(fā)了。

至于minigui移植本人還一直沒時(shí)間做 因?yàn)闇?zhǔn)備把SD卡 SPI觸摸屏驅(qū)動(dòng)搞定再做 但過(guò)了這段時(shí)間一定會(huì)做的 也是到時(shí)候再說(shuō)吧。

再次聲明一下,這個(gè)BLOG是因?yàn)楦兄x那些幫助過(guò)我的朋友們而建立的,偶然發(fā)現(xiàn)有幾篇筆記已經(jīng)被很多網(wǎng)站轉(zhuǎn)載了,大家當(dāng)然可以隨意利用這里的資源,但只有一個(gè)要求,希望大家會(huì)了以后也把自己的東西共享一下。

其實(shí)寫了這么多 技術(shù)上的很少有創(chuàng)新 多是總結(jié) 在這里也感謝那些我提到與沒提到的人 因?yàn)檫@里所有的文章都來(lái)自于他們的原始積累。

寫這些簡(jiǎn)單的出奇的東西 也無(wú)非就是想告訴那些比我還菜的鳥們:這個(gè)世界上有高手,但不多??赡苣氵@輩子都見不到幾個(gè)。那么與其一直敬仰他們不如自己踏踏實(shí)實(shí)從小做起。在自己的小范圍內(nèi)作到一個(gè)點(diǎn)的專家。然后點(diǎn)連成線,線變成知識(shí)面……

說(shuō)實(shí)在的,很多人上來(lái)QQ就問(wèn)我“我在做畢業(yè)設(shè)計(jì) 一點(diǎn)頭緒也沒有”“導(dǎo)師逼我做的……”“高手 幫我講講什么是XX”
我不喜歡這些……如果這些朋友不改變這種狀態(tài)的話,我勸大家還是不要做了。

做東西也好,做項(xiàng)目也罷,態(tài)度很重要。有人問(wèn)我學(xué)ARM重要的是什么?我也總結(jié)了一下,不應(yīng)該說(shuō)學(xué)ARM重要是什么,而是做事重要的是什么:把肉都剔掉以后就只有骨頭---心系一處,全力以赴??赡苓@就是大道致簡(jiǎn)吧。因?yàn)槲覜Q定做點(diǎn)成績(jī)出來(lái),所以我對(duì)實(shí)驗(yàn)室的事都很積極;因?yàn)槲液芊e極,雖然開始都是些雜活,我同樣把它們完成的盡量好;因?yàn)槲野阉鼈兺瓿傻谋M量好,領(lǐng)導(dǎo)發(fā)現(xiàn)了我;因?yàn)轭I(lǐng)導(dǎo)發(fā)現(xiàn)了我,我身上一些東西開始被注意;因?yàn)轭I(lǐng)導(dǎo)發(fā)現(xiàn)這些東西了,我被指定做一個(gè)小型的4人項(xiàng)目;因?yàn)槲胰匀粵Q定做點(diǎn)成績(jī),這個(gè)項(xiàng)目竟然完成了……頻吧?其實(shí)除了技術(shù)以外,我是個(gè)很開朗的人,從我的筆記就可以看出來(lái)。

好了,不多說(shuō)了 每個(gè)人都有自己的哲學(xué) 是不用寫下來(lái)的 哲學(xué)與技術(shù)不一樣 技術(shù)寫下來(lái)可以幫助理解 哲學(xué)寫下來(lái)就打折了 哈哈
你看那些哲學(xué)高手都什么樣?老和尚輕易不說(shuō)話 一說(shuō)出來(lái) 當(dāng)……當(dāng)……

享受奮斗以后一邊擦汗一邊喝著冰鎮(zhèn)啤酒的感覺
mamajinco 發(fā)表于 2006-11-11 10:10:00
經(jīng)過(guò)幾個(gè)月的苦修

撥開烏云見藍(lán)天了~~心情舒暢很多了~~

盡情的享受奮斗以后一邊擦汗一邊喝著冰鎮(zhèn)啤酒的感覺 哈哈

被鄙視了無(wú)數(shù)次 也鄙視別人無(wú)數(shù)次之后最大的感覺就是“人生是什么”

“幸福是什么”“滿足是什么”……都是狗屎 作為一個(gè)工程師來(lái)說(shuō) 整天琢磨這些 也與這些黃澄澄盤旋向上的妙不可言的東西無(wú)異了吧 呵呵

最重要的是什么?或者說(shuō)作為工程師來(lái)說(shuō) 最重要的是什么?

任務(wù)……不停的設(shè)定更高的目標(biāo) 然后達(dá)到它

以完成不可能完成的任務(wù)為榮

工程師的生活是什么 工程師的人生是什么 工程師的幸福是什么

就是看著自己的努力給家人帶來(lái)的幸福生活

就是不斷挑戰(zhàn)自己人生目標(biāo) 在有限的人生里把精力只放在幾個(gè)點(diǎn)上 然后讓它們?nèi)紵?/p>

就是和朋友嘴里吟頌著中國(guó)幾千年來(lái)的國(guó)罵 喝到半死的 睡上一天 第三天繼續(xù)前進(jìn)的幸福

俗吧?就這么俗

撿個(gè)優(yōu)惠時(shí)段和女朋友開個(gè)KTV大包 唱上1天 晚上回來(lái)的路上還停不了 一直哼哼

領(lǐng)著女朋友擠公交繞半個(gè)城市 就為了找自己原來(lái)喜歡的“大排面” 啃著大排骨對(duì)著傻笑

和5個(gè)發(fā)小一起慶祝我找到好工作 去去了無(wú)數(shù)次的四川火鍋 花上100多

陪老媽呆上一天 聽她嘮叨老爸年輕時(shí)對(duì)他不好 聽她一邊鼓勵(lì)我好好發(fā)展 有舍不得我去北京

陪老爸聊聊天 聽他說(shuō)“其實(shí)我做欣賞你的是……”用胳膊肘憝一下健康的老爸 告訴他“搞什么 爺倆還嘮這嗑……”

打車跑到玩具批發(fā)市場(chǎng) 找了半天 找到金屬的變形金剛 回來(lái)再租本柯南 關(guān)上電話 像豬一樣委在床上一下午

去tompda淘二手的智能手機(jī)和PDA 突然發(fā)現(xiàn)手上都有3個(gè)了 還想要新的 被女朋友制止 只好把舊的打磨一下 看起來(lái)新一些 繼續(xù)用

給朋友發(fā)發(fā)短信 操來(lái)操去 最后互祝平安

看著女朋友跑到WATSON買便宜的小玩意 還不要我給她買喜歡了好久 才3XX的靴子 還安慰我說(shuō)等我一年能拿到16W的時(shí)候再說(shuō)

看著開著吉利的大哥送自己的孩子上學(xué) 想起自己家也是買過(guò)寶來(lái) 開了1年 油太貴了 又沒人開 賣了賠6W 但畢竟我家也有過(guò)車 還是個(gè)小名牌

看著考了博士 有找了研究所工作的女朋友整天還在等消息 還在為論文忙碌 想起來(lái)1年前的她還在為我認(rèn)了個(gè)妹妹而吃醋

哈哈 人生不過(guò)如此 讓別人笑笑 偶爾笑笑別人~~

?

?
?
?
?
?
?
?
?

?

?

?

?

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的arm学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。