arm学习笔记
簡單的介紹
打今天起菜鳥的ARM筆記算是開張了,也算給我的這些筆記找個存的地方。
為什么要發布出來?也許是大家感興趣的,其實這些筆記之所以叫筆記而不是文章,是因為它們完全是本人個人學習經驗的總結,而這些經驗都來自于其他前輩的無私奉獻,在這里對這些樂于發表自己經驗的前輩致以由衷的感謝!現在我把這些前輩的文章經過自己的理解寫出來一方面是對于他們的尊重,另一方面也希望覺得本人的筆記有參考意義的朋友把這種精神繼續傳下去。
再次聲明,本人確實是個菜鳥,現在手頭的板子是自己畫的,以RT&ZQ的板子為底版,對部分電路進行了改動。比如加入了SD卡,IIC總線鍵盤,觸摸屏,GPS,GPRS等等。并對LCD接口進行改造,使之完全適合手頭的SHARP液晶。把網絡,串口,USB這些調試用接口都外擴了,目的是使主板盡量小(目前第一版為了調試方便,主板特意畫的比較大)。但是存儲部分(RAM ROM)沒有做任何變動,在這里對RT&ZQ致謝!
這塊板子是本人第二個板子(第一塊是個接口板,30根線。)所以走線,設計都經不起推敲,但是同樣非常希望大家能夠指點!
板子基本元件清單說一下吧,方便其他人參考
CPU:44B0
RAM:HY57V641620
ROM:AM29LV160
NET:8019
USB:D12
KEY:ZLG7290
LCD:SHARP LM7M632
?
目前為止本人做的工作
1 板子的硬件調試是跟著軟件來的
2 ADS AXD調試環境搭建
3 FLSH燒寫筆記
4 UBOOT移植筆記
5 UCLINUX編譯下載簡單筆記
6 字符設備驅動開發
?
C工程模板使用說明
本模板用于使44B0運行C程序
一般說來匯編用來初始化 之后跳到C入口MAIN函數處
一、關于工程文件
1、本目錄下建工程文件(.MCP)
2、工程文件至少包含3個文件44binit.s??? 44blib_a.s??? *.c(自己的c文件)
3、44binit.s中開頭部分INCLUDE兩個文件MEMCFG.S?? Option.s用于基本設置
注意這兩個文件的存放目錄,即讓INCLUDE找到它們
4、以上文件除自己的c文件之外均為三星公版,不需修改
二、關于CodeWarrior設置
1、DebugRel Setting里一般設置幾項
1)Target Setting->Linker里選ARMLinker
?? 用于設置連接
2)Target Setting->Post-Linker選ARM fromELF
?? 用于生成FLASH燒錄代碼(只在RAM里運行 而不燒錄則不用)
3)ARM Linker->RO BASE里添地址
?? 根據板子來,這板子上RAM接的NSCS6,地址0XC000000-0XC7FFFFF;
?FLASH接的NSCS0,地址0X00000-0XFFFFF
?地址分配原理見44B0數據手冊內存管理那章的內存分配圖
?想在RAM里調試就添0XC000000(比如0XC008000)的地址
?但是注意的是地址不要添過界,比如想在RAM里調試卻添0X00000000 程序可以 進入C代碼 但沒法運行
?
?再有
?想生成用于燒寫得FLASH代碼 RO地址就需要設置為0X0000000開始的 而且LAYOUT中也必須設置44BINIT.O為初始加載文件
?以上FLASH測試結論經FLASHPGM測試
而且FLASHPGM不支持BIN文件 只支持INTEL得HEX文件
4)RW可以添 可以不添 一般RO解釋為數據段,RW解釋為數據段
?有時高興了就添上0XC100000(RAM調試時)
5)ARM Linker->OPTION->Image entry point選擇0xc000000(RAM調試時)
6)ARM Linker->Layout->Object/Symbol里可以添工程起始程序44BINIT.O 注意是.O不是.S和.0(零)
?也可以不添
三、AXD設置
1)按照BANYANGT或者ARM7正確設置調試代理
?BANYANGT、ARM7、H-JTAG都是代理,裝哪個無所謂,一般認為BANYANGT好,但無論哪個調試之前必須運行代理
2)在option->configure interface里 在session file 選擇 44b0.ini 這個文件是初始化44b0寄存器的,必須運行
3)Options->Configue Target里本來有兩項,上面上是硬件調試,下面是軟件仿真(在電腦上仿真)
?用ARM7就改第一項(按照ARM7說明改),用BANYANGT就按照BANYANGT說明在下面再加個BANYANGT的驅動
4)在general標簽頁選擇attach,然后確定,最后在file->save session,關閉AXD(在CodeWarrior里一DEBUG就自動打開)
四、關于JTAG
1)JTAG一般有幾種 SDT和WIGGLER 我的是WIGGLER的,兩者區別主要在并口25針定義不一樣(不算復位腳),與板子上JTAG相連的腳不是區分JTAG類型的標志
?只要和44B0對上就行
2)JTAG小板上與44B0大板上JTAH跳線RAM調試時都不用接 燒FLASH才用到
3)網上流傳的JTAG小板上也有不用RST信號的版本,無所謂,RST信號不是標準的
五、另外
開始的時候犯了低級錯誤,沒設置OM1 2 3跳線 導致晶體不陣~~~
?
其他的看萬龍的ARM開發板使用手冊,寫的還不錯
模板:user94/mamajinco/upload/825806664.rar
這部分可能過于簡單,很少有人寫,但是對于不了解ARM開發過程的人真的簡單嗎?我是菜鳥,在這卡了3天:)
一般說來有幾種方法,
1)板子原來的BOOTLOADER程序或者為燒寫而編寫的專用ADS程序
比較高級而快速的方法,很多現成的開發板都用這種方法(相對來說有實力的公司),此狀態下CPU是運行的,所以速度快。
比如ZLG的,但是對于初學或者不準備細研究硬件的人來說就比較麻煩,因為要編寫(改寫)ADS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時并不運行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個軟件,原因比較簡單,麻煩+速度慢。
因為需要編寫(改寫)兩個配置文件,而且是字符界面。倒是有人說這個軟件只能在WIN98下用的說法好象不對(現在有可以讓2000和XP下用的方法)
喜歡的朋友可以用用
3)FLASHPGM(推薦)
很簡單的程序,GUI界面,速度尚好。
設置很簡單,在CPU里選對型號,當然是3星的44B0。在FLASH里也一樣,39LV160,29LV160都有。
確定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上)
選完了以后讀一下FLASH的ID(左下腳的按鈕吧)能讀出廠家的ID就行。
然后是燒寫了,PROGRAME按鈕,注意的是FLASHPGM不支持BIN格式,按照下面方法處理。
再有就是盡量在寫之前擦一下,PROGRAME菜單里有個選項,打個鉤就OK。
具體燒寫方法可以看我總結的另一篇文檔,在這里只說說UBOOT相關的。
前面說過UBOOT編譯以后產生3個文件
u-boot——ELF格式的文件,可以被大多數Debug程序識別;
u-boot.bin——二進制bin文件,純粹的U-BOOT二進制執行代碼,不保存ELF格式和調試信息。這個文件一般用于燒錄到用戶開發板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發板中。
FLASHPGM不支持BIN格式的,可以燒寫u-boot——ELF格式的文件,別看它沒擴展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現成的BIN文件來燒,FLASHPGM還提供了一個BINTOS19的程序,就在它的安裝目錄下。具體用法運行它,它自己就告訴你了。
注意:有時(尤其是FLASH里已經有程序的時候)0XC000000會莫名奇妙的提示內存不可以寫,有幾個方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點EREASE擦除芯片,擦除一般說來是不成功的,最后無論如何都下不去,沒關系,這時候關閉擦除對話框,然后0x10000000地址不變,燒FLASH,我一般是燒寫一個我自己寫的LED測試小程序把內存占上:)。回來這時候再把0X1000000換成0XC000000再按照正常操作,一般可以正常。
這現象的原因就是過去下的程序(多數是不正確的程序)正在運行 占用了RAM與ROM,下個LED測試小程序就是把這幾個部分清除掉。
如果以上方法還不正常,可以用另一個程序叫FLASHP就差2個字母:)很好!在這里對這個程序的作者致敬!!
用這個軟件擦FLASH,然后再用FLASHPGM燒,原因是FLASHP擦厲害,但寫好象有些問題~~
UBOOT 移植操作(1)
[0]目錄結構
◆ board:和一些已有開發板有關的文件,比如Makefile和u-boot.lds等都和具體開發板的硬件和地址分配有關。
◆ common:與體系結構無關的文件,實現各種命令的C文件。
◆ cpu:CPU相關文件,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設置指令Cache和數據Cache等;interrupt.c設置系統的各種中斷和異常,比如快速中斷、開關中斷、時鐘中斷、軟件中斷、預取中止和未定義指令等;start.S是U-BOOT啟動時執行的第一個文件,它主要是設置系統堆棧和工作方式,為進入C程序奠定基礎。
◆ disk:disk驅動的分區處理代碼。
◆ doc:文檔。
◆ drivers:通用設備驅動程序,比如各種網卡、支持CFI的Flash、串口和USB總線等。
◆fs:支持文件系統的文件,U-BOOT現在支持cramfs、fat、fdos、jffs2和registerfs。
◆ include:頭文件,還有對各種硬件平臺支持的匯編文件,系統的配置文件和對文件系統支持的文件。
◆ net:與網絡有關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS文件系統的實現。
◆ lib_arm:與ARM體系結構相關的代碼。
◆ tools:創建S-Record格式文件 和U-BOOT images的工具。
==========================================================================================
[1]u-boot.1.1.2目錄下有Makefile
1)設置編譯器
可以看到這一項:
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
也就是說這里所用的交叉編譯器是arm-linux-gcc,u-boot默認是用這個的,也有用arm-elf-gcc的,arm-elf-tools-20030314.sh,用它來編譯,沒有問題。如果最后MAKE的時候提示找不到arm-linux-gcc就是這錯了,改一下。
arm-elf-gcc是用來編譯uClinux內核的工具,arm-linux-gcc用來編譯LINUX
2)加進自己板子的項目
搜索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來的,TT_config?????? :????? unconfig也是一樣,不能用空格代替,因為它是靠這個來識別命令的
==========================================================================================
[2]在宿主機(PC機)上建立arm-elf-gcc交叉編譯環境
1)建立arm-linux-gcc編譯環境
在RedHat Linux系統下以root用戶登錄,
將cross-2.95.3.tar.bz2文件復制到/目錄下,
安裝:
# tar jxvf cross-2.95.3.tar.bz2
這個命令會在你的/usr/local/arm/2.95.3目錄下安裝 arm-linux-gcc 交叉編譯程序,
然后在PATH變量中添加一項:/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文件中添加一項:
?export PATH=:$PATH:/usr/local/arm/2.95.3/bin
之后可以測試一下 echo $PATH
注意:PATH大小寫不一樣,另外LINUX下大小寫是不同的,以后不特別聲明。
注意:命令中的參數之間都由單個空格或者TAB隔開,命令前有的有# 代表命令行符,不用輸入。
注意:不可在WINDOWS下用winRAR解壓u-boot-1.1.2.tar.bz2或u-boot-1.1.2.tar.gz這種文件,會少文件,去LINUX下,另外解壓的時候也不用非點用命令行操作,LINUX現在對GUI已經支持的非常好了,比如解壓只要右鍵點文件,選解壓到當前文件夾就可以,執行的時候只要雙擊再選“執行”
注意:我用的VMWARE(虛擬機)裝的LINUX,要在LINUX和WIN中間傳遞文件用VM-》SETTING里的SHARE FOLDER
該功能是把WIN 下的一個文件夾共享給LINUX。
這個功能必須裝VMWARE TOOLS才能用,
裝VMWARE TOOLS方法:首先在VM-》SETTING里CDROM項里把光驅設置為裝入VMWARE安裝文件夾下的LINUX工具的.ISO,LUINUX下就出現CDROM了 拷貝 解壓 安裝不在話下。必須注意的是VMWARE TOOLS在每次重起LINUX之后還必須也重起一下,TMD,誰搞定不用重起告訴我一聲
重起的方法:/etc/init.d/vmware-tools restart
就有消息出來了
注意:另外郁悶的是我的WIN與LINUX之間復制文字似乎也不順暢,干脆在SHARE FOLDER里建立一個TXT,兩個系統搗文字玩~~
測試:
把終端關閉,重新打開后執行如下命令:
# arm-linux-gcc –v
建立好交叉編譯環境后可以試著編譯u-boot了
2)也可以建立arm-elf-gcc
與上面類似,用周立功的編譯包直接安裝
會在/usr/local/bin下產生arm-elf-gcc只類的文件
然后設置路徑
[root@localhost root]# export PATH=$PATH:/usr/local/arm-elf/bin
======================================================================================================
[3] 測試交叉編譯器搞好沒有
?編譯個44B0例子 在UBOOT包目錄下執行一下命令,以下是編譯的包自帶的DAVE公司板子B2(名)
1)???? Make distclean (清除以前編譯的痕跡)
2)???? Make B2_config(B2代表B2板子的,前面見到過)
3)???? Make
沒問題就可以進行下面了
注意:B2默認用arm-linux-gcc編譯,要是前面安的arm-elf-gcc的話此時會報錯 把UBOOT目錄下的MAKEFILE按照前面說的改一下
注意:一般說來還會有個問題,懷疑是編譯器的問題 提示什么abi=apcs-gnu只類的找不到吧~~記不住了
改UBOOT目錄下config.mk (好象)
文件里改成如下
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu,))
原來的行少了$(call cc-option,-mabi=apcs-gnu,) 具體在哪行忘了 CTRL+F搜索一下
其他應該沒問題,有問題GOOGLE搜一下,不是通病就是自己安裝的問題了
注意:
MAKE之后會生成三個文件:
u-boot——ELF格式的文件,可以被大多數Debug程序識別;
u-boot.bin——二進制bin文件,純粹的U-BOOT二進制執行代碼,不保存ELF格式和調試信息。這個文件一般用于燒錄到用戶開發板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發板中。
?
[4]開始配置U BOOT
1)給自己板子個公司起個名,我的公司叫T2T 板子叫TT,剛才那個例子公司名DAVE板子名B2
以B2板子的程序做為模板來做,省很多工作
#cd u-boot-1.1.2//進U BOOT目錄
#cd board //進BOARD目錄,該目錄下存放各種公司的開發板,但44B0的好象只有一種B2
#cp -R dave T2T (復制 并且改名)
#cd T2T
#mv B2 TT (復制 并且改名)
#cd TT
# mv B2.c TT.c
修改TT里面的Makefile, 把B2改成TT,編譯時如果報的其它類似找不到B2的錯誤也是把相應的B2改成TT來處理。
修改T2T/TT/config.mk
TEXT_BASE = 0x0c1000000
修改T2T/TT/Makefile
將所有的B2改為TT
2)/include/configs
cp B2.h TT.h依舊是把B2的改個名
注意:DAVE的板子是用44B0的,但還有其他板子用嗎?怎么確定只有它用?用以下命令
到board目錄查了一下:
#cd u-boot
#cd board
#find . -exec grep -l 44B0 {} \;
結果是:
./dave/B2/B2.c
B2網站是: http://www.dave-tech.it
3)以下文件修改記錄
----------------------------------------------------------------------------------------------------
-----------------------------------/include/configs/TT.h-------------------------------------------
----------------------------------------------------------------------------------------------------
#define CONFIG_INIT_CRITICAL???? 1???????? 這個在cpu/s3c44b0/start.S里面用到,如果你的u-boot程序不是在sdram中調試而是固化到flash中運行的話,這個必不可少。
找到 #define CONFIG_B2????????? 1??????? 改成CONFIG_TT
找到 #define CONFIG_S3C44B0_CLOCK_SPEED?? 75?? 主頻改成60
找到Size of malloc() pool這部分設置,改成這樣。
#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? 這個必不可少,如果你想把你的參數保存到flash的話
#define CFG_ENV_ADDR??? (PHYS_FLASH_1+0x40000)? 這個就是你的參數保存在flash里的起始地址了
#define CFG_ENV_OFFSET 0x40000????? 這個我后來看它源程序發現如果你上一步沒有設置它的起始地址的話就會用它來作默認地址的了
#define CONFIG_AUTO_COMPLETE
其它地方沒有深究哦,有些好像不要也行,你就試試吧。
找到Hardware drivers部分,這應該是網絡芯片設置吧,參考一下這個吧(要看芯片的):
#define CONFIG_DRIVER_RTL8019??????? 這個就要看你的板上用的是什么網卡了(這個是臺灣出的,有10M)
#define RTL8019_BASE??????? 0x06000300?? 這個是網卡相就寄存器的起始地址,有的掛在BANK4上了地址自然是0X08000300
以下部分我試過不要也行,你試下吧
#define RTL8019_BUS32???????????? 0
#define CONFIG_SMC_USE_16_BIT
#undef? CONFIG_SHOW_ACTIVITY
#define CONFIG_NET_RETRY_COUNT?????????? 10?????? 應該是重試的次數吧
#define CONFIG_SERIAL 1
#define CONFIG_BAUDRATE???????????? 115200? 設置波特率
?
#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參數設置,看一下吧,其實我覺得了解一下就行的了,只是一些初始設置值,以后可以用命令setenv? saveenv來修改的。
#define CONFIG_BOOTDELAY?? 3??????????????? 這個就是運行bootcmd之前的等待時間
#define CONFIG_BOOTARGS? "devfs=mount root=ramfs console=ttyS0,115200" 引導uClinux的時候傳遞的參數,不會就先不用管它也行。
#define CONFIG_ETHADDR?????? 00:50:c2:1e:af:fb??? 網卡的物理地址MAC
#define CONFIG_NETMASK? 255.255.255.0?????? 掩碼地址,設置過ip的人都應該知道吧
#define CONFIG_IPADDR?? 192.168.0.30????????? 這是你板上網卡8019的ip地址
#define CONFIG_SERVERIP?????? 192.168.0.10?????? 這是你宿主機的ip地址,以后用tftp下載的時候用到,一定要跟你的宿主機一致才行。
#define CONFIG_BOOTFILE?????? "u-boot.bin"??????? 這個就是你要下載文件的默認名字,注意的是不是UBOOT編譯的文件 而是UBOOT下載以后在這個地址執行這個文件,比如這個文件在下LINUX后就常被改成UCLINUC.BIN了
#define CONFIG_BOOTCOMMAND?? "bootm 0x50000"?? 這是bootdelay后運行的命令
?
Miscellaneous configurable options部分,參考一下吧:
#define??? CFG_LONGHELP?????????????????????? /* undef to save memory?????? */
#define??? CFG_PROMPT????? "TENWAY=>"?? 這是進入命令模式下的提示符,改個帥一點的吧
#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??? 默認的下載地址
#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??????? 我們只占用了一個Bank用來映射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?? 定義多個名字而已,其它地方會用到
注意:
存儲容量的計算方法
2M=0x00200000-----------------16進制轉換成10進制(用WINDOWS自帶的計算機就行)-------------------》2097152
2097152=1024*1024*2
FLASH organization部分,看注釋應該知道了吧,參考一下:
/*-----------------------------------------------------------------------
?* FLASH organization
?*/
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks? */
#define CFG_MAX_FLASH_SECT 256 /* 最大支持的SECTOR數量,另外SAM FEI的補丁這里設置了32個 是錯誤的*/
//#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) 在前面加個4讓它長點 */
#define CFG_FLASH_WRITE_TOUT 1000 /* Timeout for Flash Write (in ms) */
其他地方還沒動 以后動的再補上
UBOOT 移植操作(3)
----------------------------------------------------------------------------------------------------
-----------------------------------board/myboard/common/flash.c-----------------------------------
----------------------------------------------------------------------------------------------------
找到這個函數:write_buff
里面有這句話,一共有6處吧?全改了:#ifdef CONFIG_B2
把CONFIG_B2改成上面TT.H文件里面起的名,我的叫CONFIG_TT
關于FLASH的一點疑問:
一直懷疑29LV160和39LV160在U BOOT下是否兼容的問題
看了這段程序后似乎U BOOT是可以自動檢測的
----------------------------------------------------------------------------------------------------
-----------------------------------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*/
主要是設置MEMORY_CONFIG里的內容 值得注意的是.long?? 0x01000102 /* Bank0 = OM[1:0] , Bank1-2 4-7 16bit, ,BANK3 8BIT,Bank2=Nowait,UB/LB*/中設置了各個BANK的位寬,要注意。因為8019有8位的,有16位的,配置錯了網絡不通
其實就是一些字
有人從地址讀出來后是下面這樣也可以
“
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
由于對armsys硬件不是太了解,沒有辦法,只得看armsys bootloader程序,但每個版本又有差別.因此是用AXD調試看bootlaoder啟動后0x1c80000中的值定的.
”
注意:這個注意是后補上的,因為自己和朋友在做的時候發現網上對這部分分析的人特別少,可能因為理論比較簡單,操作起來又比較麻煩吧。
聽聽菜鳥的方法吧。
首先U BOOT1.1.1和1.1.4版本有個小差別,就是文件名的差別1.1.1叫memsetup.S,1.1.4叫lowlevel_init.S如果把別人用1.1.1編譯的直接拿過來也可以,但一定記得在改文件名的同時還一定要在文件里改函數名!就是這個文件最后那部分匯編上面的函數名。不然后來會提示START.S里找不到lowlevel_init。切記
另外,比較重要的這部分究竟代表什么,怎么改。
這個文件實際分3部分,這3個部分實際又是把44B0初始化那幾個匯編文件重新組合了,就是ADS在RAM里調試文檔里說的,把44B0當單片機用時C語言前面的那寫匯編文件,一般說來包括44binit.s MEMCFG.S 44BLIB_A.S Option.s。其中44binit.s MEMCFG.S就包含了內存初始化的參數,按照這兩個文件改吧。
再說這3部分
開始是內存設置,在數據手冊(英文)4-14頁,各個意思就不多說了。說說怎么改,當然得根據你的內存具體改(一句廢話)但是有簡單的方法,前面提到了,看MEMCFG.S這個文件。
然后是一些移位只類的操作,把各個BANK設置好,其實就是設置一些預定義的字,然后在其他的地方利用這些字設置寄存器。就把這些理解為宏或者就當是個結構體吧(不準確,就幫助理解)。為什么這么設置看看數據手冊(英文)4-13頁
這部分在怎么改的快?找,哪找?44binit.s里面有,一模一樣,不羅嗦了。
最后那部分是這個文件唯一執行的部分
基本不需要改吧(除了有的時候函數名:))
看見0X01C80000還不明白嗎?看數據手冊(英文)4-3頁去吧,有匯編的例子,至于這個32位寄存器為什么這么設置。
別看我這裝的明白,就是會對付,別跟我較真,我還也在研究中:)
注意:順便在這里說說個小問題,有朋友問“為什么原理圖上地址線從A1開始,而不是A0”看數據手冊(英文)4-4頁,因為是16位地~~~
注意:我的8019是連在BANK3上的 而且是8BIT的 所以MEMORY_CONFIG下面第一項里要做設置 要不不好使
----------------------------------------------------------------------------------------------------
-----------------------------------board/T2T/TT/config.mk-----------------------------------
----------------------------------------------------------------------------------------------------
修改最后的TEXT_BASE為把UBOOT加載到RAM的地址,這里添0XC700000,當然添0XC300000也可以 但是如果添0XC300000之前的似乎在下載LINUX的時候會死機,因為地址空間不夠
?
-----------------------------------------------------------------
-----------------------------------cpu/s3c44b0/start.S------
-------------------------------------------------------------------
找到
#if CONFIG_S3C44B0_CLOCK_SPEED==60
??
?ldr r0, =0x70081 /* 60MHz (Quartz=10MHz) 具體怎么算的 可以看我寫的計算方法說明*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
?ldr r0, =0xac042? /* 75MHz? */
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
設置一下主頻
------------------------------------------------------------------------------
--------------cpu/s3c44b0/serial.c-----------------------------------
--------------------------------------------------------------------------------
找到以下幾項
主要是把頻率改一下并把分拼設置對
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;/*具體算法和上面主頻算法在一個文檔里*/
#elif CONFIG_S3C44B0_CLOCK_SPEED==75
? divisor = 40;
#else
# error CONFIG_S3C44B0_CLOCK_SPEED undefined
#endif
--------------------------------------------------------------------------
---------board/T2T/TT/TT.C-------------------------------
------------------------------------------------------------
這個沒什么好說的,如果你用的是網上流行的原理圖,改動基本沒有,我的因為加了些東西,所以這個文件改動很多。
但文件里主要就是對44B0各個管腳設置,哪個是IO哪個是TXD、RXD。不多說了,自己看數據手冊8-6頁,有點耐心。
---------------------------------------------------------------------
------------lib_arm/board.c-----------------------------------
---------------------------------------------------------
好象網卡需要加個INCLUDE
//待補充
這個文件不用修改,在網上找的講解,順便提一下
進行各種初始化設置,主要有:
cpu_init CPU相關的設置, 具體在./cpu/s3c44b0/cpu.c中.
board_init 板子相關的設置, 具體在board/wx/wx20/wx20.c 中
interrupt_init中斷設置,我們沒有用,具體在./cpu/s3c44b0/interrupts.c中
env_init 初始化環境變量, 具體要看用什么介質來存儲環境變量,如果用flash來存貯, 程序在common/env_flash.c中.
init_baudrate 設置baud參數
serial_init 串口初始化, 具體在cpu/s3c44b0/serial.c.
console_init_f 控制臺設置, 具體在./common/console.c
display_banner 顯示標題.[這里可以鼓搗一下,讓它輸出些個性的東西:)]
dram_init 可用內存配置, 具體在./board/wx/wx20/wx20.c.
flash_init flash初始化,具體./drivers/cfi_flash.c.
接下來就是環境變量初始化, 網絡初始化,最后到main_loop,可以運行各種命令.
====================================
[5]燒寫FLASH
這部分可能過于簡單,很少有人寫,但是對于不了解ARM開發過程的人真的簡單嗎?我是菜鳥,在這卡了3天:)
一般說來有幾種方法,
1)板子原來的BOOTLOADER程序或者為燒寫而編寫的專用ADS程序
比較高級而快速的方法,很多現成的開發板都用這種方法(相對來說有實力的公司),此狀態下CPU是運行的,所以速度快。
比如ZLG的,但是對于初學或者不準備細研究硬件的人來說就比較麻煩,因為要編寫(改寫)ADS燒寫程序。愿意的人可以看看。
2)FLUTED
和FLASHPGM一樣,使用的好象叫邊界掃描法,CPU此時并不運行,因此燒寫的比較慢。
在這里也不推薦FLUTED這個軟件,原因比較簡單,麻煩+速度慢。
因為需要編寫(改寫)兩個配置文件,而且是字符界面。倒是有人說這個軟件只能在WIN98下用的說法好象不對(現在有可以讓2000和XP下用的方法)
喜歡的朋友可以用用
3)FLASHPGM(推薦)
很簡單的程序,GUI界面,速度尚好。
設置很簡單,在CPU里選對型號,當然是3星的44B0。在FLASH里也一樣,39LV160,29LV160都有。
確定好地址,RAM地址我的是0XC000000(BANK7上) FLASH地址0X0(BANK0上)
選完了以后讀一下FLASH的ID(左下腳的按鈕吧)能讀出廠家的ID就行。
然后是燒寫了,PROGRAME按鈕,注意的是FLASHPGM不支持BIN格式,按照下面方法處理。
再有就是盡量在寫之前擦一下,PROGRAME菜單里有個選項,打個鉤就OK。
具體燒寫方法可以看我總結的另一篇文檔,在這里只說說UBOOT相關的。
前面說過UBOOT編譯以后產生3個文件
u-boot——ELF格式的文件,可以被大多數Debug程序識別;
u-boot.bin——二進制bin文件,純粹的U-BOOT二進制執行代碼,不保存ELF格式和調試信息。這個文件一般用于燒錄到用戶開發板中;
u-boot.srec——Motorola S-Record格式,可以通過串行口下載到開發板中。
FLASHPGM不支持BIN格式的,可以燒寫u-boot——ELF格式的文件,別看它沒擴展名,一樣燒寫。
還有,如果你懶(和我一樣),拿別人現成的BIN文件來燒,FLASHPGM還提供了一個BINTOS19的程序,就在它的安裝目錄下。具體用法運行它,它自己就告訴你了。
注意:有時(尤其是FLASH里已經有程序的時候)0XC000000會莫名奇妙的提示內存不可以寫,有幾個方法可以試試:把地址改成0x10000000(好象是緩存地址),之后點EREASE擦除芯片,擦除一般說來是不成功的,最后無論如何都下不去,沒關系,這時候關閉擦除對話框,然后0x10000000地址不變,燒FLASH,我一般是燒寫一個我自己寫的LED測試小程序把內存占上:)。回來這時候再把0X1000000換成0XC000000再按照正常操作,一般可以正常。
這現象的原因就是過去下的程序(多數是不正確的程序)正在運行 占用了RAM與ROM,下個LED測試小程序就是把這幾個部分清除掉。
如果以上方法還不正常,可以用另一個程序叫FLASHP就差2個字母:)很好!在這里對這個程序的作者致敬!!
用這個軟件擦FLASH,然后再用FLASHPGM燒,原因是FLASHP擦厲害,但寫好象有些問題~~
細小的問題--patch命令的使用
有的時候大家收到的別人移植好的UBOOT了UCLINUC了是以patch包發布的
這里轉個寫的比較好的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文件的首行已經指明了路徑,所以根據當前所在的目錄,加不同的參數使用patch命令:
?
1:如果當前的目錄是和linux-2.6.12的同級目錄:
?
[root@kcn-110mw]#patch -p0 </root/isp1161-2.6.12.patch
?
2:如果當前的目錄為 linux-2.6.12/:
?
[root@kcn-110mw]#patch -p1 </root/isp1161-2.6.12.patch
?
3:如果當前的目錄為 linux-2.6.12/drivers/:
?
[root@kcn-110mw]#patch -p2 </root/isp1161-2.6.12.pathc
?
0,1,2,是指略去的patch文件中的前幾級目錄
?
細小的問題---VMWARE安裝與使用
mamajinco 發表于 2006-9-6 9:49:00
首先 推薦大家在開發的過程中使用VMWARE虛擬機 安裝LINUX
原因比較簡單 開發過程中會頻繁的在兩個系統之間交換 對于沒有兩個計算機的朋友來說 過于麻煩
對的不說了 說說開發里遇到問題
==================================
一 安裝VMWARE虛擬機與LINUX
1 分出個10G左右的地方
我是分個10G的FAT32格式分區來單獨做LINUX的區域,推薦分出來的空間大于9G,因為對于新手來說LIXUN要盡量全部安裝。
分區盡量是FAT32格式(WINDOWS用的)NTFS聽有的朋友說過好象有問題。
推薦計算機內存大于256M,我用的是512M,開VMWARE再開ACROBAT時就會明顯慢。
安裝后的VMWARE虛擬機基本是3種文件,VMWARE程序文件我安在C盤下了,VMWARE的配置文件(安裝后再添加的,比較小)和VMWARE虛擬出的硬盤文件(選10G,該文件就是10G),所以我單獨分出個驅存他們。
虛擬機里安裝后的操作系統(一般都是LINUX吧,順便說一下,你也可以按WIN了蘋果了操作系統)
2 安裝VMWARE虛擬機
VMWARE虛擬機對于WINDOWS來說就是個軟件,用這個軟件虛擬出個計算機來。對于VMWARE虛擬機里面安裝的系統來說自己就獨占了一臺計算機。
安裝沒有什么特殊的,我用的是VER5.5,選標準安裝,基本一律下一步就搞定。
值得注意的是中間有問你分出來多大硬盤空間,默認是8G ,改成10G吧。
之后是建立VMWARE虛擬機配置文件,根據自己的要求建立,基本不用改什么,就是整錯了也可以在后來的SETTING里改。
不多說了。
3 安裝LINUX
把LINUX安裝盤放光驅里吧,啟動虛擬機,自己就檢測啟動了。
多說一句,到這大家都明白了吧?啟動虛擬機就相當于啟動一個計算機,光盤自動啟動也跟物理上的計算機完全一樣。
值得注意的是:如果電腦里安了虛擬光驅可能影響光盤自動啟動,如果有問題就把虛擬光驅卸了吧。
安裝的時候同樣沒什么問題,手動分驅,按照內存大小的2倍分出來個SWAP分驅,其余的我分成一個驅,強制為主分驅,掛載點選“/”根目錄,分驅格式選EXT3……
多說一句,在分驅里就能看出來了吧?LINUX完全獨占了這10G的地方,看不到WINDOWS
二 安裝VMWARE-tools
VMWARE-tools還是安裝比較好,最起碼WIN和LINUX交換文件就方便了
引用別人的文章 加上自己的注釋吧
1、以ROOT身份進入LINUX
2、按下 CTRL+ALT組合鍵,進入主操作系統,點擊VMWARE狀態欄安裝提示,或者點擊 SETTING菜單下的ENABLE VMWARE TOOLS子菜單。
3、確認安裝VMWARE TOOLS。
這時我們并沒有真正的安裝上了VMWARE TOOLS軟件包,如果您點擊菜單:DEVICES,您就會發現光驅的菜單文字變為:ide1:0-> Crogram FilesVMwareVMware WorkstationProgramslinux.iso,這表示VMWARE將LINUX的ISO映象文件作為了虛擬機的光盤
注釋:有的時候不能自動掛載,自己要在菜單里光驅項目里選掛載VMWARE安裝目錄(不是配置文件存儲目錄,我的在C盤里)里某個目錄的linux.iso
4、鼠標點擊LINUX界面,進入LINUX。
5、運行如下命令,注意大小寫。
mount -t iso9660 /dev/cdrom /mnt
加載CDROM設備,這時如果進入 /mnt 目錄下,你將會發現多了一個文件:vmware-linux-tools.tar.gz。這就是WMWARE TOOLS的LINUX軟件包,也就是我們剛才使用WINISO打開LINUX.ISO文件所看到的。
注釋:在新版本里可以不用命令掛載和卸載了,打開 LINUX.ISO后LINUX桌面會自動彈出光驅標志,雙擊打開。
cp /mnt/vmware-linux-tools.tar.gz /tmp
將該軟件包拷貝到LINUX的 TMP目錄下。
umount /dev/cdrom
卸載CDROM。
cd /tmp
進入TMP目錄
tar zxf vmware-linux-tools.tar.gz
解壓縮該軟件包,默認解壓到vmware-linux-tools目錄下(與文件名同名)。
cd vmware-linux-tools
進入解壓后的目錄
./install.pl
運行安裝命令。
這時install提示你是否需要備份以前的配置文件,建議選擇"y"。
等待INSTALL運行完成后,這時鍵入 START 命令,是不是可以看到漂亮的LINUX圖形界面了?
三 使用VMWARE TOOLS
必須注意的是VMWARE TOOLS在每次重起LINUX之后還必須也重起一下,TMD,誰搞定不用重起告訴我一聲
重起的方法:/etc/init.d/vmware-tools restart
就有消息出來了
四 文件共享
我用的VMWARE虛擬機裝的LINUX,要在LINUX和WIN中間傳遞文件用VM-》SETTING里的SHARE FOLDER
該功能是把WIN 下的一個文件夾共享給LINUX。
這個功能必須裝VMWARE TOOLS才能用。
共享以后在LINUX的MNT目錄下就出一個F什么打頭的文件夾,進去就是你共享的文件夾名了
細小的問題---arm-linux-gcc與arm-elf-gcc的區別
總看見有人問
arm-linux-gcc為有MMU的LINUX準備的比如2410上的LINUX
arm-elf-gcc為沒有MMU的UCLINUX準備的比如44B0上的UCLINUX
就這么簡單
?
閑聊ARM的入門(1)
我的筆記剛公布就有很多朋友來找我,把我當高手,問我“ARM怎么入門”。我不是高手,仍然是菜鳥。
但是回想起自己當時的迷茫,特意寫了這篇東西,當作給和我一樣的兄弟姐妹的幫助吧。問這個問題的人多半不是已經工作的工程師,而是和我一樣是學生,所以這篇筆記就把看家當成我一樣的菜鳥,高手勿怪。
首先聲明:本人還沒有找工作,事實上處于研究生剛畢業,還沒開始找工作的空閑時間,44B0只是興趣所在,打發時間。
所有看法完全是自己的感受,不代表任何他人。錯了的觀點各位幫我糾正。
再次補充:很多朋友看了上面的話就問我為什么研究生畢業了還不找工作:)說是打發時間,其實是因為研究生的時候帶了一個項目,申請提前畢業以后項目還有塊尾巴,答應導師把項目做完再走:)就這么簡單。男人總點負點責,呵呵
以下問題常被問到,我就想到哪說到哪吧。
一 首先說說ARM的發展
可以用一片大好來形容,翻開各個公司的網站,招聘里面嵌入式占據了大半工程師職位。
廣義的嵌入式無非幾種:傳統的什么51、AVR、PIC稱做嵌入式微控制器;ARM是嵌入式微處理器;DSP;FPGA。
客觀的講,工作需求量上DSP的需求比ARM要多,而ARM和FPGA差不多。
DSP因為數字處理與通信領域的空前發展而火暴,小到MP3 射象頭,大到我們軍品里的控制器,應用面很廣。
FPGA的兄弟一般做ANSIC(特殊芯片設計,好象是這么翻譯的)。
而ARM單純說來并不比一個單片機強多少,但是它的獨特就在于不斷下降的價格和提升的性能。這完全依靠于ARM公司的戰略,厲害!!很佩服他們的戰略眼光!!
值得注意的是:在找工作中,企業(著名的,小的不算)對單純的ARM硬件開發工程師并不比單片機重視,很少有大企業的職位里寫“從事過ARM開發優先”。
寫的多的是什么?“嵌入式LINUX”
到這相信大家看出來了吧,需要的是硬件中的軟件。
二 ARM是硬件還是軟件
很難說,ARM是硬件,LINUX是軟件。
ARM的硬件多半已經模塊化了,像我這樣把板子改成這樣的就算動的多的了,這同樣是ARM公司的戰略,再次佩服。
實際中的LINUX的開發工作更多,更耗時。從這方面說ARM應該算是軟件了。
在找工作中更是這樣,舉個例子,聯想里和ARM最接近的是“BIOS工程師”是軟件,MOTO里接近的是嵌入式LINUX工程師是軟件。而其他很多公司把嵌入式產品開發歸為硬件。
所以,不要討論這個,好好玩轉自己的板子才是關鍵。實在不爽你就把自己叫“嵌入式開發工程師”
三 要不要買開發板 買哪家
我的答案是“在你個人的學習方法”,但是如果看家是需要看這騙筆記的水平,個人推薦還是買現成的。
1 買
買板子可以把注意力集中在軟件開發上,軟件開發(尤其是驅動)可以不必擔心自己硬件上的問題,我就是以便調試一邊寫驅動和程序,每次寫驅動前就要先確認硬件沒問題。
另外,買板子更省錢和時間,我自己做的板子,原理圖PCB花了2周以上!制版又15天,回來以后焊接44B0 160個腳!那叫一個麻煩~~花了多少錢呢?2層板,制版費就300塊!當然 我把接口都外引了,還做了個20X18的LCD背板,板子比較大。
總體下來 元件+LCD屏+PCB=11XX塊!夠2410的了。
再有就是買的資料相對來說比較全,但是不要指望有技術支持!都是騙人的,賣你之后就不會理你。
2 做
自己做可以更了解底層硬件,可以按照自己的要求加東西,比如我就加了GPS模塊、 GPRS模塊 、SD卡模塊,擴了個IIC的35個鍵子的鍵盤、把LCD接口按照買的LCD改裝了,可以用FPC線直接連接。做的很爽的。玩一把嗎。
當然,你可以有策略的做,比如像我一樣,把RAM和ROM,網絡都保持和某現成的板子一樣,這樣他們的資料你就可以拿過來直接用,給自己留個退路。其他的如SD了 什么的自己做。都達到了~~就是費錢,費時間。
再有就是給做的朋友幾點建議:盡量拿到現成的板子,盡量多搜集其他板子的全套資料,一定要拿到一張沒問題的原理圖。
網上流傳的原理圖多數是龔俊03年畫的,再這里對龔俊表達一下我的敬意!!牛人!
但是那個圖有個小BUG,我指的是03版的,后來的沒這問題了。8019那地址線和地址有問題。還有人仿照他的PDF圖畫的SCH,更是漏洞百出!譴責!順便譴責把龔俊板子偷賣的人。
3 買哪家
個人感覺分3類吧
1)首先是ZLG的,資料非常的全,感覺他是真正想教你怎么開發ARM,而不是像有的公司自己技術都沒做好就做個板子出來賣錢。但是最大的不利就是價格太貴!而且主要是PHILIP的,貨源比較麻煩~~可能有人說21XX系列的不貴啊,那是總線不外擴的,只能跑UCOS,不能跑UCLINUX。但是說是話,21XX系列才是ARM7的價格性能結合點。ARM7最適合做工業控制,ARM普及,銷量都是怎么來的?都是ARM7來的,而44B0是典型的商業片子。但是,這里如果你看中的是為工作做準備,還是選能跑UCLINUX的吧。
但是仍然作為第一個推薦,因為菜鳥時期,合適的資料太重要了!!在這里被ZLG的務實精神感動!你看人家那代碼寫的。
2)感覺立宇泰的44B0不錯
硬件沒別的,就是資料比較全的說,不像有些家,原理圖直接拿人家的,還錯的~~
3)找個最便宜的
好象最便宜的有賣350的吧?也是沒別的,就是即省了錢 還省時間搜集資料,至于資料全不全,別計較了~~硬件肯定好使就行吧。
四 要不要有51 AVR等單片機基礎
有更好,但沒有也無所謂。
兩個月以前,我只是看別人做,耳濡目染~~,本科學過單片機,從來沒做過。我們這的技術主干做AVR和51,我就跟他們調過C語言程序。你看出來了?我是個不折不扣的菜鳥吧?
但是做這個之前我特意找了ZLG的兩本書,看了里面的例子和原理圖,這很重要。例程里有匯編有C,都看懂了就OK,不用自己現寫
五 開發都需要學習哪些軟件
總結起來最主要的有以下幾個吧
1 ADS調試用
確切的說是ADS+AXD。ADS里包含AXD。原來都用SDT后來ARM公司停止對SDT支持了,改支持ADS了,還是用ADS吧。
有的人的程序發布的仍然是SDT版本的,但基本都可以找到相應ADS的,新人在這里不要發蒙。ADS是編譯器,AXD是調試器。便宜成AXF以后再在ARM的RAM里調試。
2 PLASHPGM
FLASH燒寫的軟件。AXD在RAM里調試,掉電就沒有了,方便程序修改。調試好的程序再下到FLASH里,上電直接運行。
同類的軟件還有很多,什么FLUTED了、FLSHP了都是,但FLASHPGM最好,要是有人還問FLASH不支持BIN格式文件的問題就要看我寫的PLASHPGM使用了。
3 BANYANT調試代理(不知道名對不,起這么個難記的,我一般都叫它“半羊”因為知道它那幾天剛吃了烤羊)
調試代理就是用它幫你使用更簡單的JTAG(便宜啊)來實現原本1K才賣的JTAG仿真器的大部分功能。JTAG調試原理看我另一篇筆記。簡單的就可以把他理解為你自己做的JTAG的驅動就行了。
調試代理還有很多種,什么H-JTAG了、ARM7了(不知道具體叫什么,就記得可執行文件叫ARM7.EXE)都是,BANYANT比較好。
需要注意的是,沒種調試代理安裝方法雖然都簡單 但都不一樣,需要看說明。而且AXD調試之前都要運行。省錢了,就別怕麻煩了。
4 ARM-ELF-TOOLS工具鏈
里面是UCLINUX開發用的工具比如ARM-ELF-GCC只類的。工具鏈就是把很多工具打包在一起發布的方便你開發的東西。具體安裝方法看我另一篇筆記。
另外如果你開發LINUX就要用ARM-LINUX-TOOLS,不一樣,不通用。
5 U-BOOT
大名鼎鼎的BOOTLOADER生成工具,同類的好象還有VIVI(名字很曖昧~~)
生成的BOOTLOADER燒到FLASH里,然后就可以用BOOTLOADER下載 燒寫其他了
有了BOOTLOADER才能下UCLINUX。BOOTLOADER就像電腦上的BIOS。當然UCOS的不用這個,用什么我不知道:)
最新版本是1.1.4 具體使用方法看我另一篇筆記吧。
6 UCLINUX包
UCLINUX的源碼包,不用多說了吧?建議大家用現成的先體會一下,然后再自己編譯,裁剪。因為單獨UCLINUX的編輯技術上比較簡單,但涉及的方面還是比較廣的。
7 VMWARE
老牌的虛擬機軟件,在一個機器上虛擬出一個機器裝LINUX(PC上用的),省得你來回開關機了。記得裝VMWARE-TOOLS,安裝方法在我另一篇筆記里。
六 有哪些書推薦
主要推薦ZLG的三本書,有這3本再加網絡就不用別的書了,其中主要推薦前2本,3是介紹體系結構的,也不錯
1 ARM嵌入式LINUX系統構建與驅動開發,北航版
驅動寫的很詳細,前期開發介紹也很好
2 ARM 嵌入式系統實驗教程(二),北航版
有ZLG2200的原理圖,實驗程序和注釋,了解人家是怎么開發的。
3 ARM嵌入式系統基礎教程
最重要的是體系結構,匯編部分介紹,看看吧,增加理論素質。
4 44B0數據手冊
寫在這里是強調它的重要。
不推薦ZLG早期出的紅色皮的ARM什么體系結構~只類的
寫的太多,看煩了。
其他的書沒了幾本,沒看見好的,大家有看過的推薦吧。
?
閑聊ARM的入門(2)
mamajinco 發表于 2006-9-7 9:34:00
七 選UCOS?UCLINUX?LINUX?VXWORKS?還是當單片機用
1 搞開發,工程設計,用UCOS,小巧,多進程,簡單,體現了ARM7的精髓。
2 LINUX 正根的嵌入式系統,LINUX消費與通信領域用的比較多,但缺點是必須ARM9才能跑,ARM9的板子自己做就不行了,6層板太貴。買開發板1K達底吧。但是還是推薦選ARM9+LINUX
3 UCLINUX 算投機嵌入式系統:)ARM7上可以跑,由有LINUX近親,學好好可以比較方便的轉向LINUX,像我一樣的窮鬼用吧,呵呵
4 VXWORKS
學好后可以找到高薪工作,但工作機會本身并不比LINUX好找。
5 當單片機用
不推薦,雖然我景仰的ZLG一直號召這么干。因為對于學習來說多進程的系統設計才是ARM7的玩頭,至少你也要整個UCOS啊:)
有朋友問我先學這個當基礎不行嗎?那當然可以~~但我當時就用了1周搞定,就是我先的ADS在RAM中調試的筆記。后來我清空FLASH用的小段程序還是當時寫的LED閃爍程序呢。另外1周里其中還因為自己過于菜,沒把OM設置好導致晶陣不陣
哈哈。這個是必須做的,但一帶而過。目標放的遠一點。
八 學習要用多長時間
我從菜鳥到現在兩個多月,中間被打擾數次。仍然搞定了PCB設計與制版,RAM調試,FLASH下載,UBOOT移植和下載UCLINUX(沒剪裁,用現成的),LCD驅動。
再次坦誠的說:我確實比較菜,說這些不是讓大家羨慕,只是告訴你們“你們應該比這個更好”
我相信良好的態度+合適的方法+及時的總結=成績
九 ARM都玩什么
就幾點
1 硬件設計
2 系統移植
3 驅動開發
4 應用開發
沒了。其中推薦把注意力放在后兩個上,3有難度,4比較靈活,最重要的是都是找工作的砝碼。
十 我用的什么板子
很多人問我這個問題,我特意寫過一個的。再說一次吧。
我是自己做的,RAM、ROM、8019等比較麻煩而當時的自己不理解的都按照龔俊的做的。保持其他不便的情況下做了如下改動。
1 加了串口通信的GPS模塊、 GPRS模塊
一個UART0,一個UART1,當與要用超級終端時用跳線切換。
2 SD卡,和7843觸摸屏
同時掛在SPI總線上,因為SPI只能掛一個設備,同時還做了I/O模擬的準備,把兩個設備又通過跳線掛在4個IO上。
3 擴了個IIC的35個鍵子的鍵盤
用的ZLG的7290,不占用CPU,最大支持64個鍵子,只上了35個,其他留接口。
4 把LCD接口按照買的LCD改裝了,可以用FPC線直接連接。
?所以改動雖然多,但真正很移植了,初期調試有關的并沒動,就是為了現在不那么菜的時候做準備:)
十一 開發流程
這里是我的開發流程
1 設計原理圖(含WIGGLER的JTAG訪真器)
2 設計PCB(含WIGGLER的JTAG訪真器)
3 制版
4 焊接電壓,確定電壓沒問題
5 焊接44B0+JTAG電路+WIGGLER的JTAG訪真器+周邊電路,用BANYANT+仿真器連接,BANYANT提示錯誤,但可以顯示44B0編號,好象是0X0F0F0F0F只類的,說明44B0沒問題
6 焊接晶體+RAM+ROM+周邊電路,用BANYANT+仿真器連接,可以顯示正確的44B0了
7 用BANYANT+仿真器連接,開AXD,在命令行窗口操作RAM,看可不可以修改,可以的話(用內存窗口看RAM地址)RAM就沒問題
可以用這個命令“setmem 0xc000000,0xffffffff,32”
我的RAM掛在BANK6上 所以地址是0XC000000,你要是改了就也得改。
8 用我寫的《自己寫了個C工程模板又寫了個使用說明 》里的方法調試程序吧,寫個簡單的,我當時寫個LED閃爍的。看好使不。
9 把程序按照《FLASH燒寫總結 》里的燒到FLASH里,測試一下
10 按照《UBOOT 移植操作》移植UBOOT
11 按照《UCLINUX下載簡單說明》下個UCLINUX
12 看看驅動開發的方法,自己寫個驅動看看
13 還有很多事東西著你玩 呵呵
十二 關于JTAG訪真器
JTAG訪真器現在用的多是簡板的,一個244那種,用的沒什么不好。
按照并口定義不同分幾種,建議選WIFFLER定義的,因為支持的軟件多。這個網上多的是,不多說了。
值得提的是有的JTAG訪真器原理圖上有跳線用來使能復位信號,這個一般不跳上。就是不用復位信號,因為JTAG協議里本身也可以控制44B0復位。
當然,板子上的復位信號跳線也不用跳。
十三 哪個公司的ARM
這個是問題比較簡單。
1 ARM7主要就幾個公司的
三星,PHILIP,ATMEL的
ATMEL的有比較便宜的AT91SAM7S32 和AT91SAM7S64 專為8位應用產品量身定做,價格很便宜好象《3刀吧。和PHILIP的21XX差不多,資料太少,項目中選還不錯。
其他兩家上面說了的不多說了吧
2 ARM9
這個玩2410和2440的多吧,現在2440還比較火啊 可以考慮買個了
但是2410就比較便宜了,作為學習來說反到和不錯,推薦整一個:)
其實ARM9用的最多的領域應該是消費電子,比如手機PDA,而這上面用的多的應該是INTEL的和TI的吧。
但是INTEL的TI的入門材料少,價格高,自己看情況定吧。
UBOOT命令總結(轉)
很好的UBOOT命令總結,我在起步時就是看的這篇東西,熟悉了以后就用“?”看自帶幫助就行:)
Printenv 打印環境變量。
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 設置新的變量
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 保存變量
命令將當前定義的所有的變量及其值存入flash中。用來存儲變量及其值的空間只有8k字節,應不要超過。
Loadb 通過串口Kermit協議下載二進制數據。
Tftp 通過網絡下載程序,需要先設置好網絡配置
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254???? (tftp服務器的地址)
下載bin文件到地址0x20000000處。
Uboot> tftp 20000000 application.bin (application.bin應位于tftp服務程序的目錄)
Uboot> tftp 32000000 vmlinux
把server(IP=環境變量中設置的serverip)中/tftpdroot/ 下的vmlinux通過TFTP讀入到物理內存32000000處。
Md 顯示內存區的內容。
Mm 修改內存,地址自動遞增。
Nm 修改內存,地址不自動遞增。
Mw 用模型填充內存
mw 32000000 ff 10000(把內存0x32000000開始的0x10000字節設為0xFF)
Cp 拷貝一塊內存到另一塊
Cmp 比較兩塊內存區
這些內存操作命令后都可加一個后綴表示操作數據的大小,比如cp.b表示按字節拷貝。
Protect 寫保護操作
protect on 1:0-3(就是對第一塊FLASH的0-3扇區進行保護)
protect off 1:0-3取消寫保護
Erase 擦除扇區。
erase: 刪除FLASH的扇區
erase 1:0-2(就是對每一塊FLASH的0-2扇區進行刪除)
對DataFlash的操作
U-Boot在引導時如果發現NPCS0和NPCS3上連有DataFlash,就會分配虛擬的地址給它,具體為 :
0xC0000000---NPCS0
0xD0000000---NPCS3
run 執行設置好的腳本
Uboot> setenv flashit tftp 20000000 mycode.bin\; erase 10020000 1002FFFF\;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit
bootcmd 保留的環境變量,也是一種腳本
如果定義了該變量,在autoboot模式下,將會執行該腳本的內容。
Go 執行內存中的二進制代碼,一個簡單的跳轉到指定地址
Bootm 執行內存中的二進制代碼
要求二進制代碼為制定格式的。通常為mkimage處理過的二進制文件。
起動UBOOT TOOLS制作的壓縮LINUX內核, bootm 3200000
Bootp 通過網絡啟動,需要提前設置好硬件地址。
? 得到所有命令列表
help? help usb, 列出USB功能的使用說明
ping? 注:只能開發板PING別的機器
usb
usb start:? 起動usb 功能
usb info:? 列出設備
usb scan:? 掃描usb storage(u 盤)設備
kgo? 起動沒有壓縮的linux內核
kgo 32000000
fatls 列出DOS FAT文件系統
fatls usb 0列出第一塊U盤中的文件
fatload 讀入FAT中的一個文件
fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 讀到物理內存0x32000000處!
flinfo 列出flash的信息
nfs
nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系統)中的NFS文件系統中的aa.txt 讀入內存0x32000000處。
?
CPU頻率計算方法---PLL設置
看見很多朋友不會計算PLL分頻和串口頻率,整理個筆記發上來
cpu時鐘頻率和串口波特率的計算公式
S3C44B0的系統時鐘設置公式
Fpllo 為系統的主頻,此處為60MHz
Fin 為晶振的頻率,此處為10MHz
一. 通過PLL輸出時鐘脈沖頻率的計算:
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應該盡可能的大)
e) 1MHz <= Fin/p < 2MHz (最好是Fin/p = 1MHz)
f) 如果PLL打開則:Fpllo = Fout
g) 這樣計算出MDIV, PDIV, SDIV的值寫入PLLCON寄存器中就可設置Fpllo的輸出頻率。
根據 d)知道s=1
根據 e)知道p=10
再根據 a)就知道了m=120,注意2^s代表2的s次方
再根據 b)知道MDIV=112, PDIV=8, SDIV=1
根據44B0數據手冊5-14頁算出 PLLCON=0X70081
注意:PLLCON的結果不為一!比如P可以取8 取7……
注意:PLLCON寄存器是20位的 各個區域中間有空的
比如MDIV是寄存器里19-12位,PDIV是9-4位兩個中間有11,10位空,如果用2進制算就添0
不過做過硬件的就知道 大可不必只要把MDIV, PDIV, SDIV用WEINDOWS自帶計算機直接由2進制轉換成16進制順序寫就行
比如MDIV=112=0x70, PDIV=8=0x08, SDIV=1=0x1
PLLCON寄存器就是0x70081(看到這 連手冊都不用翻了吧?:))
還得多說一句 不是0x700801,因為SDIV=1=0x1不是0X01,跟PDIV=8=0x08不一樣
S3C44B0的UART波特率計算公式---分頻設置
S3C44B0的UART波特率計算公式
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設置
最近的朋友很多問MINICOM設置的問題
把原來寫的整理一下 發一下 現成的還行 有朋友問我驅動怎么開發
這個就比較麻煩了:)還是等我過段時間了也把手頭的幾個驅動搞定了再說
---------正文-------------
MINICOM是LINUX提供的和WEINDOWS超級終端一樣的工具,一般用做串口與開發板通信,當然有的板子也用USB,但這里只介紹串口的設置
一 VMWARE虛擬機添加串口(如果沒用虛擬機可以跳過這步)
如果在VMWARE虛擬機下 一定要記得先確認這步 要不不好使 很多朋友的問題就在這里!
先關閉虛擬機下的LINUX,然后設置一下虛擬機:在vm-〉settings-〉hardware里添加串口 COM1 COM2都加上吧
二 設置MINICOM
進LINUX系統 開個控制臺 字符里輸入minicom 就啟動了
這時一般還要設置一下
Ctrl+A進入控制界面(Esc返回)按Z進設置
一般設置兩個
1 按O(注意:是O不是零)設置第三第四項,分別是串口設置與MODEM設置
串口設置:不用說了吧 進去都看明白了 敲字母 設置相應項目 比如“115200 8-N-1”
MODEM設置:也要設置一下 要不有的看不到東西 把上面兩個選項都清空 就是按那行前面的字母(好象是‘A’和什么)然后光標就跳過去了 刪之
回車 到開始選第三第四項的菜單 選下面的保存(別忘了保存 菜鳥們常犯)
2 回到剛才按O的界面 看一下P 里面的串口設置對不對
對就不用改了 不對改之
提醒一下:LINUX設備的編號是從0開始的 比如串口1也就是COM1在LINUX里的設備號叫ttyS0
串口設置里面要用到 那里添全部路徑也就是"/dev/ttyS0"
好了 就這么簡單
?
uclinux編譯文檔
user94/mamajinco/upload/1012638628.rarUCLINUX編譯的過程是非常折磨人的,我在這整了3天!媽的!把很多公司的都試遍了。第3天的晚上10點搞定了~~
但說真的,很難寫下來整體過程,因為跟版本有關,跟各個板子也有關系……
所有的移植都是用2.4做的,誰讓咱是菜鳥呢,先從簡單的做。
總結幾點吧,介紹個現在主流的立宇泰的板子UCLINUX編譯方法和我自己拿HFRK的板子提供的UCLINUX改的8019和NFS的方法
一 立宇泰(憑回憶,有些地方當時沒記下來)
1下載
arm-elf-tools-20030314.sh//開發工具
uClinux-dist-20040408.tar.gz//源代碼包
uClinux-20040408-ARMSYS.rar//立宇泰的補丁
configfiledemo.rar//立宇泰的設置文件
前兩個UCLINUX的網站有下的,很快。
后兩個立宇泰公司網站有下的,很小,也很快。
2 安裝
arm-elf-tools-20030314.sh
在LINUX(我用的VMWARE跑的PC4)下雙擊,選運行就行,不多說了,有人這里出過問題,提示一個錯誤,去21IC搜索一下,把一個參數改一下就行。但我的沒這個問題。
uClinux-dist-20040408.tar.gz
考到/usr/src/下,右鍵截壓縮到當前目錄,也沒什么說的。就是記得硬盤要有足夠的空間,這個比較大,一般還得有幾個備份,得2G左右。
uClinux-20040408-ARMSYS.rar
這個補丁確實不錯!!好商家!還共享了,改了一堆文件。
截壓縮不說了,得到PARCH文件,拷貝到剛才UCLINUX源代碼包目錄下,注意,要到uClinux-dist目錄里。不是uClinux-dist-20040408.tar.gz目錄里。
還不能直接補丁,需要改一下uClinux-dist/vector/Samsung/4510B這個文件夾,直接把名字改成44B0就行了。
打開終端吧,CD到uClinux-dist目錄里輸入以下命令:
patch -p1 < uClinux-20040408-ARMSYS.patch
注意-P1是數字一不是L字母,命令什么意思就不解釋了,GOOGLE一下,有個兄弟專門講了。
打包到最后會有問題,因為剛才咱們把4510直接改成44B0了嘛,問你問題的時候敲的N吧,退出。
把uClinux-dist/vector/Samsung/44B0里Makefile 和 rc打開,對著uClinux-20040408-ARMSYS.patch改。
具體方法是:雙擊(這里PC機都默認使用GNOME,比KDE方便,比如雙擊打開)查看PATCH文件。對著改吧。
補充個語法知識:.patch里面主要有幾種符號分別是“+++”“---”"+""-""@@""diff"
每個區域都是diff --- +++ @@四行開始 之后是+ -或者無符號的行,+代表在一個位置加一行,-代表刪除一行,什么都不帶就什么都不做,用來定位的。
好了,文件最后可以找到 diff uClinux-dist/vector/Samsung/44B0開始的文件了吧?
對著把Makefile 和 rc改了吧。
打完補丁,還得做一件事,把/uClinux-dist/Linux-2.4.x/Driver/Block/blkmem.c改了
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
#endif
后加個
#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
要不編譯后的內核運行的時候會有“Kernel panic: VFS: Unable to mount root fs on XXXXX”錯誤
3 設置
make menuconfig
當然 也可以make Xconfig 但不推薦,雖然顯示很好,但速度慢~~
進了菜單,基本就幾個鍵子上 下 左 右 回車 空格。
選什么比較麻煩,建議第一次先用剛才下的configfiledemo立宇泰的設置文件,解壓以后是三個文件,分別對應主菜單,內核和用戶菜單。
選擇Load an Alternate Configuration File
里面輸入文件的地址與名稱,記得開始的時候說的VMWARE-TOOS共享吧?把這幾個文件拷貝到合適的目錄下吧,我就放在uClinux-dist-20040408.tar.gz下了。
左右選《EXIT》退出。選保存。
一會自動彈出KERNEL設置菜單,和上面一樣Load an Alternate Configuration File,選config_kernel文件。
需要注意的是這里的USB好象不對,因為板子上沒整USB(以后再整)就把USB的選項直接去掉了(到USB子菜單下把[*]去了)。
要不會有hcb.c錯誤。
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
其他沒說就是別動
左右選《EXIT》退出。選保存
一會自動彈出USER設置菜單,和上面一樣Load an Alternate Configuration File,選config_user文件。(語法多整齊)
沒有注意了,直接左右選《EXIT》退出。選保存。
說實在的,要是沒有這些CONFIG文件,自己改是件很麻煩的事,本人就嘗試了自己增加NFS和修改8019(我的板子是自己畫的和這個不一樣)那叫一個麻煩~~~。建議大家新手還是先把這些順利的做完了再說改的。
退出以后就是編譯了。
4 編譯
幾大命令
make dep
make clean
make lib_only
make user_only
make romfs
make
順利的話一次全的執行了,但第3步要是自己鼓搗過在這里就要受苦了,比如后面要講的把驅動編譯進內核里。
這里要說的是,出問題不可怕,但一要做好記錄,知道自己改什么,錯誤可能出現在什么地方,因為報告的錯誤很可能不是出現錯誤的位置。二要善于搜索,使用GOOGLE搜索。三 要BBS提問的時候把錯誤,操作記錄都說清楚了,等待高手給你解答。四就是自己要積累看MAKE錯誤的知識。此外別無他法!
二 好了
我最后用的是HFRK的包,版本是2005311,不用打補丁。但聽說所有2005311的包都不用打了,好消息啊。但編譯的過程仍然折磨人。
設置與編譯的過程仍然和上面一樣,這里共項我的CONFIG文件供大家參考吧。就不多說了。
下面說我自己改8019驅動的方法。
8019用的是drivers/net/下的ne.c文件改的。
改之前要差幾點:8019是8位還是16位,地址線是怎么對應的(8019是ADDR1對44B0的ADDR幾?),8019掛在44B0的哪個BANK上,8019使用哪個中斷,中斷號多少。
好了,對應的改吧。
先改文件。
drivers/net/ne.c
找到CONFIG_BOARD_MBA44,修改一下中斷號dev-irq,改成我們電路中使用的EINT1(中斷號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地址線是怎么對應的,我的是0對0(8位)但有的朋友8019是7對0,就要改了,但是具體哪個文件忘了,GOOGLE搜索一下吧:)
進make menuconfig里把以下選了
1 General Setup --->
Networking Support
2Networking options --->
?Packet socket
TCP/IP networking
3 進Networking device Support---》
4 File system --->
Network device support?
Ethernet (10 or 100Mbit) --->
Other ISA cards
NE2000/NE1000 support
注意:這里通過[ ]??????? 16Bits mode support選擇8019工作位,我沒選,因為做的是8位的
4 Network Applications --->
arp
ifconfig
inetd
ping
route
好了,之后就是編譯了,燒寫,然后測試一下PING宿主機,NFS掛一下看看。
注意:宿主機的防火墻要關了,不然PING不通,當然NFS也不行。
好了,編譯內核就到這里,因為過于繁瑣,只能分部分來簡化寫了~~大家有問題再交流吧。
搞定UCLINUX移植以后就開始整個最小的程序吧,當然是HELLOWORLD了:)
一 先寫個helloworld.c (對于小代碼我喜歡先在WINDOW下建個“新建 文本文檔.txt”再在里面寫代碼,然后保存后改名成helloworld.c 注意的是擴展名也要從TXT改成C才行,原來說過,不多說了)
里面寫下面等號里的代碼:
==================
#i nclude <stdlib.h>
#i nclude <stdio.h>
int main(void)
{
?printf("hello world ! I got it!\n");
?return 0;
}
==================
不用解釋了吧:)
二 然后編寫個makefile吧,別總用arm-elf-gcc了。
為以后編寫大規模程序打個基礎:)
建個makefile(和前面一樣,先TXT然后改名,沒有擴展名)
=====================
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的語法比較復雜,就不多講了,可以看我在前幾篇筆記里推薦的ZLG那本書。但幸運的是基本不用自己動手了,LINUX源代碼里有很多MAKE 拿來改改吧:)
三 下面就是有朋友問我怎么把程序下到板子里了
一般說來有幾種方法。
1 板子掛載宿主機的NFS共享目錄,把程序拷貝到/tmp目錄(在RAM里)測試一下,但缺點是掉電要消失,只適合做調試時用。
2 做JFFS之類的日志文件系統,和上面一樣NFS掛載拷貝過來,JFFS文件系統可以保證掉電不消失,類似U盤里拷貝程序(只是結果類似,原理完全不同)。
3 直接把程序燒寫進ROMFS文件系統,這里就只介紹這種。原因有兩點 首先 我還沒學怎么做JFFS,其次 我還沒學怎么做JFFS。哈哈
好了,那開工。
1)在uClinux-dist/user/下建立目錄hello
把helloworld.c和makefile拷貝到里面,怎么拷貝不用說了吧?VMWARE-TOOLS共享文件夾吧。
2)修改uClinux-dist/user/makefile
在適當位置 找一行(這句語法扎堆的地方)加
dir_$(CONFIG_USER_HELLO)?????????????? += hello
3)記住CONFIG_USER_HELLO這個名(自己可以改的 )
在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
#############################################################################
#號中間加的就是語法了,基本意思就是在Hello World--->下加個[]demo
編譯過內核的都熟悉吧:)
5)像編譯內核一樣編譯了
進內核源代碼目錄,比如uClinux-dist
make menucinfig
把主菜單選好了,不用說了吧?我的編譯內核筆記里有,當然如果不想修改內核就只選上以下這個
Kernel/Library/Defaults Selection? --->[*] Customize Kernel Settings (NEW)
意思是修改USER程序
EXIT 保存
然后在Customize Kernel Settings菜單里最后會出現Hello World--->
回車進去以后看見[]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編譯筆記里寫過,再寫一次)
A:loadb 0xc500000
B:發送(KERMIT協議)uclinux_rom.bin
C:erase 0x50000 0x1fffff
D:cp 0xc500000 0x50000 文件大小
注意:文件大小就是在傳輸完uclinux_rom.bin后顯示的數字 0X開頭=什么的那個0X數字
比如提示是0X0012a7f1=1222641
就0X0012a7f1/4+2=0x4A9FE命令就是:cp 0xc500000 0x50000 0x4A9FE
E:重起板子 就進UCLINUX了
8)板子進到/bin下 看是不是有個helloworld?
執行它就看見“hello world ! I got it!”
注意:因為把文件編寫到內核了,所以不是用./helloworld
直接在任何目錄下寫helloworld就行
最簡單的驅動---讓LED閃一閃-1
user94/mamajinco/upload/1012942565.rar這幾天抽時間做了幾個驅動,基本都是字符設備,什么GPS 模塊了GPRS模塊了LCD了
有很多朋友關心驅動,但更菜的菜鳥居多:)總結了一下 把I/O驅動改成個更簡單的LED驅動吧
做的工作非常簡單,就是讓連在GPC0-GPC2上的LED順序閃10下
目的就是演示一下驅動過程。
一 先補充一下基礎知識 懂的朋友就不用看了
嵌入式驅動的概念
?
設備驅動程序是操作系統內核和機器硬件之間的接口,設備驅動程序為應用程序屏蔽了硬件的細節,這樣在應用程序看來,硬件設備只是一個設備文件,應用程序可以像操作普通文件一樣對硬件設備進行操作。設備驅動程序是內核的一部分,它主要完成的功能有:對設備進行初始化和釋放;把數據從內核傳送到硬件和從硬件讀取數據;讀取應用程序傳送給設備文件的數據、回送應用程序請求的數據以及檢測和處理設備出現的錯誤。
?
Linux將設備分為最基本的兩大類:一類是字符設備,另一類是塊設備。字符設備和塊設備的主要區別是:在對字符設備發出讀/寫請求時,實際的硬件I/O一般就緊接著發生了。字符設備以單個字節為單位進行順序讀寫操作,通常不使用緩沖技術;塊設備則是以固定大小的數據塊進行存儲和讀寫的,如硬盤、軟盤等,并利用一塊系統內存作為緩沖區。為提高效率,系統對于塊設備的讀寫提供了緩存機制,由于涉及緩沖區管理、調度和同步等問題,實現起來比字符設備復雜得多。LCD是以字符設備方式加以訪問和管理的,Linux把顯示驅動看做字符設備,把要顯示的數據一字節一字節地送往LCD驅動器。
?
Linux的設備管理是和文件系統緊密結合的,各種設備都以文件的形式存放在/dev目錄下,稱為設備文件。應用程序可以打開、關閉和讀寫這些設備文件,完成對設備的操作,就像操作普通的數據文件一樣。為了管理這些設備,系統為設備編了號,每個設備號又分為主設備號和次設備號。主設備號用來區分不同種類的設備,而次設備號用來區分同一類型的多個設備。對于常用設備,Linux有約定俗成的編號,如硬盤的主設備號是3。Linux為所有的設備文件都提供了統一的操作函數接口,方法是使用數據結構struct file_operations。這個數據結構中包括許多操作函數的指針,如open()、close()、read()和write()等,但由于外設的種類較多,操作方式各不相同。Struct file_operations結構體中的成員為一系列的接口函數,如用于讀/寫的read/write函數和用于控制的ioctl等。打開一個文件就是調用這個文件file_operations中的open操作。不同類型的文件有不同的file_operations成員函數,如普通的磁盤數據文件,接口函數完成磁盤數據塊讀寫操作;而對于各種設備文件,則最終調用各自驅動程序中的I/O函數進行具體設備的操作。這樣,應用程序根本不必考慮操作的是設備還是普通文件,可一律當作文件處理,具有非常清晰統一的I/O接口。所以file_operations是文件層次的I/O接口。
二 開始寫了
采用了在代碼里加注釋的方法,同時把幾個文件上傳了一下,喜歡的朋友可以下載當作模板。每個文件以==隔開
一共需要寫寫3個文件,1個驅動頭文件,1個驅動文件,一個驅動測試用程序文件
分別是test.h,test.c和ledtest.c
簡單說說驅動都做什么,怎么做
1 系統加載驅動
2 應用程序里打開設備(文件)
3 應用程序對設備操作
4 應用程序關閉設備(文件)
5 系統關閉設備
應用程序如何對設備操作?
記得C語言里怎么寫文件嗎?這里很相象的。對于一般的字符設備(還有塊設備,網絡設備等等)主要有3個函數(還有很多,可以看)llseek??? read:??? write:??? ioctl:? 這里只用ioctl:控制函數,當然也可以使用讀寫函數操作IO 口,但ioctl:似乎更適合。
具體實現可以看ledtest.c文件了。
test.c中主要有幾個函數 分別負責初始化和清除,打開和關閉。以及ioctl對串口寄存器寫一些數據。
初始化和清除,打開和關閉函數里都各有一句主要句,已經分別作了注釋。只要記住就好了。
對寄存器操作就不單獨說了,需要看44B0數據手冊了。好了 剩下的看代碼吧。
==============================
==========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的模版 我的高質量編程意識起源于此
**
*****************************************************/
//防止重復包含此文件而設置的宏
#ifndef __CONFIG_H
#define __CONFIG_H
//包含必要的頭文件
#i nclude <linux/config.h>
#i nclude <linux/module.h> //模塊必須包含的頭文件
#i nclude <linux/kernel.h>?????? /* printk()函數,用于向內核輸出信息 */
#i nclude <linux/fs.h>?????????? /* 很重要 其中包含了如file_opration等結構 此結構用于文件層接口 */
#i nclude <linux/errno.h>??????? /* 錯誤代碼*/
#i nclude <asm/uaccess.h>
#i nclude <linux/types.h>
#i nclude <linux/mm.h>
#i nclude <asm/arch/s3c44b0x.h>
/********************************/
/*???? 應用程序配置???????????? */
/********************************/
//以下根據需要改動
//定義主設備號 設備名稱
#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===============
最簡單的驅動---讓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的模版 我的高質量編程意識起源于此
**
***********************************************************/
#i nclude "test.h"//包含驅動頭文件
/************************************************************
????????????? function announce
******************************************************/
//以下是關鍵函數的聲明
static int led_open(struct inode *inode, struct file *filp);
//打開設備時用的 linux把設備當作文件管理 設備最好在用的時候再打開 盡量不要提前
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);
//控制函數 這里用于控制LED亮與滅
int? led_init(void);//注冊時用的 注意 模塊注冊的越早越好
void led_cleanup(void);//卸載時用的
/*************************************************************
**????????????????? "全局和靜態變量在這里定義"????????
**??????? global variables and static variables define here
/****************************************************************/
static struct file_operations LED_fops =??????? /* 前面基礎部分提到的重要結構體了*/
{
??? owner:????? THIS_MODULE,
#if 0/*注意:#if 0-#endif里的代碼是不編譯的,但這里為了驅動模板講解上的完整性仍然加上了*/
??? llseek:???? gpio_llseek,
??? read:?????? gpio_read,
??? write:????? gpio_write,
#endif
??? ioctl:????? led_ioctl,//控制函數
??? open:?????? led_open, //打開函數,打開文件時做初始化的
??? release:??? led_release,//釋放函數,關閉時調用
};
???????????????
/**************************************************************
** 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 設置為輸出*/
?(*(volatile unsigned *)S3C44B0X_PUPC) &= 0xffffffc0;/*GPIO C口0~2 設置為上拉*/
???? MOD_INC_USE_COUNT;
???? return 0;?????????
}
?
最簡單的驅動---讓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傳來的IO口編號轉換成寄存器數據,把相應IO口置低
???????? (*(volatile unsigned *)S3C44B0X_PDATC) |= 0x1 << arg;
???????????? break;
??????? case 1://把ARG傳來的IO口編號轉換成寄存器數據,把相應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);
/*關鍵語句 用于注冊
** 注意!這是傳統的注冊方法 在2.4以上的linux版本中 加入了devfs設備文件系統 使注冊更容易 但為了與大部分資料相**同 大家看的方便? 這里仍然使用老方法*/
??? if (result < 0) //用于異常檢測
??? {
??????? printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n", LED_MAJOR_NR ); //printk用于向內核輸出信息
??????? return(result);
??? }
??? printk(KERN_INFO DEVICE_NAME ": init OK\n");
?
?return(0);
}
最簡單的驅動---讓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配對使用 用于清楚驅動
}
/***********************************************************
**??????????????????????????? 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的模版 我的高質量編程意識起源于此
**
********************************************************/
#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)//延時用函數
{
?int i;
?for(;delay>0;delay--)
?{
? for(i=0 ; i < 5000 ; i ++);
?
?}
}
int main()
{
?int fd1;
?int j;
?fd1= open("/dev/led" , O_RDWR);/*打開設備,就象打開文件一樣簡單*/
?if(fd1 == -1)/*異常處理*/
?{
? printf ( "file can not be open" );
? return -1;
?}
?
?for (j =0 ; j< 10 ; j ++)/*重復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);/*關閉設備(文件)*/
?return 0;
?
}
===============END===============
最簡單的驅動---讓LED閃一閃-5
三 驅動編譯進內核
編譯的中對于菜鳥來說需要需要注意幾點
1 被打錯字,包括上面的函數中也是!
就算各位扔磚頭我也得說,因為編譯進內核是很費時間的~~而且最重要的是對于菜鳥來說make的錯誤提示都是一道關,絕對不要自己給自己設置障礙!我們團隊里就常有兄弟姐妹出現這樣的錯誤,怎么看怎么對,尤其是從書上抄下來的命令和字符,l和1還有I你怎么分?最后一個是大寫的i :)
2 不要用中文文件名 包括ABC(復件)
要不然MAKE出錯
3 在各個現成的文件里修改的時候按照原有的格式修改 要不然菜鳥很難保證不犯低級錯誤
讓我想起來了IBM的規律總結測試題:6 13 7 14 8 下一個數字是什么?
好了 開始修改!
===============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==============
四 把程序編譯進內核
沒什么說的了,和過去寫的簡單的程序一樣加 但這里再重復一次
================START============
uClinux-dist/user/Makefile
-----------------------------------------
扎堆加個下面
dir_$(CONFIG_USER_LEDTEST)????????????????? += LEDtest
=================END===============
================START============
uClinux-dist/config/Configure.help
-----------------------------------------
扎堆加個下面
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編譯筆記吧
六 下面的操作在板子上執行
1 cd /dev
2 ls
看見里面有個LED了吧?
3 cd /proc
4 cat devices
看見驅動列表吧?
led 231也應該在里面
5 LEDtest
在任何地方執行這個語句 就可以
之后看GPIO的C口電平吧:)
總結
好了 到今天為止簡單的東西都已經整理過了 也感謝大家最近的關注
剩余的部分LCD圖形操作 GPRS驅動 有機會再發吧 估計對于菜鳥不是很重要。
有人向我要GPS的驅動 我沒給:)其實很簡單的UART 但是涉及到本實驗室別人的勞動 就不發了。
至于minigui移植本人還一直沒時間做 因為準備把SD卡 SPI觸摸屏驅動搞定再做 但過了這段時間一定會做的 也是到時候再說吧。
再次聲明一下,這個BLOG是因為感謝那些幫助過我的朋友們而建立的,偶然發現有幾篇筆記已經被很多網站轉載了,大家當然可以隨意利用這里的資源,但只有一個要求,希望大家會了以后也把自己的東西共享一下。
其實寫了這么多 技術上的很少有創新 多是總結 在這里也感謝那些我提到與沒提到的人 因為這里所有的文章都來自于他們的原始積累。
寫這些簡單的出奇的東西 也無非就是想告訴那些比我還菜的鳥們:這個世界上有高手,但不多。可能你這輩子都見不到幾個。那么與其一直敬仰他們不如自己踏踏實實從小做起。在自己的小范圍內作到一個點的專家。然后點連成線,線變成知識面……
說實在的,很多人上來QQ就問我“我在做畢業設計 一點頭緒也沒有”“導師逼我做的……”“高手 幫我講講什么是XX”
我不喜歡這些……如果這些朋友不改變這種狀態的話,我勸大家還是不要做了。
做東西也好,做項目也罷,態度很重要。有人問我學ARM重要的是什么?我也總結了一下,不應該說學ARM重要是什么,而是做事重要的是什么:把肉都剔掉以后就只有骨頭---心系一處,全力以赴。可能這就是大道致簡吧。因為我決定做點成績出來,所以我對實驗室的事都很積極;因為我很積極,雖然開始都是些雜活,我同樣把它們完成的盡量好;因為我把它們完成的盡量好,領導發現了我;因為領導發現了我,我身上一些東西開始被注意;因為領導發現這些東西了,我被指定做一個小型的4人項目;因為我仍然決定做點成績,這個項目竟然完成了……頻吧?其實除了技術以外,我是個很開朗的人,從我的筆記就可以看出來。
好了,不多說了 每個人都有自己的哲學 是不用寫下來的 哲學與技術不一樣 技術寫下來可以幫助理解 哲學寫下來就打折了 哈哈
你看那些哲學高手都什么樣?老和尚輕易不說話 一說出來 當……當……
享受奮斗以后一邊擦汗一邊喝著冰鎮啤酒的感覺
mamajinco 發表于 2006-11-11 10:10:00
經過幾個月的苦修
撥開烏云見藍天了~~心情舒暢很多了~~
盡情的享受奮斗以后一邊擦汗一邊喝著冰鎮啤酒的感覺 哈哈
被鄙視了無數次 也鄙視別人無數次之后最大的感覺就是“人生是什么”
“幸福是什么”“滿足是什么”……都是狗屎 作為一個工程師來說 整天琢磨這些 也與這些黃澄澄盤旋向上的妙不可言的東西無異了吧 呵呵
最重要的是什么?或者說作為工程師來說 最重要的是什么?
任務……不停的設定更高的目標 然后達到它
以完成不可能完成的任務為榮
工程師的生活是什么 工程師的人生是什么 工程師的幸福是什么
就是看著自己的努力給家人帶來的幸福生活
就是不斷挑戰自己人生目標 在有限的人生里把精力只放在幾個點上 然后讓它們燃燒
就是和朋友嘴里吟頌著中國幾千年來的國罵 喝到半死的 睡上一天 第三天繼續前進的幸福
俗吧?就這么俗
撿個優惠時段和女朋友開個KTV大包 唱上1天 晚上回來的路上還停不了 一直哼哼
領著女朋友擠公交繞半個城市 就為了找自己原來喜歡的“大排面” 啃著大排骨對著傻笑
和5個發小一起慶祝我找到好工作 去去了無數次的四川火鍋 花上100多
陪老媽呆上一天 聽她嘮叨老爸年輕時對他不好 聽她一邊鼓勵我好好發展 有舍不得我去北京
陪老爸聊聊天 聽他說“其實我做欣賞你的是……”用胳膊肘憝一下健康的老爸 告訴他“搞什么 爺倆還嘮這嗑……”
打車跑到玩具批發市場 找了半天 找到金屬的變形金剛 回來再租本柯南 關上電話 像豬一樣委在床上一下午
去tompda淘二手的智能手機和PDA 突然發現手上都有3個了 還想要新的 被女朋友制止 只好把舊的打磨一下 看起來新一些 繼續用
給朋友發發短信 操來操去 最后互祝平安
看著女朋友跑到WATSON買便宜的小玩意 還不要我給她買喜歡了好久 才3XX的靴子 還安慰我說等我一年能拿到16W的時候再說
看著開著吉利的大哥送自己的孩子上學 想起自己家也是買過寶來 開了1年 油太貴了 又沒人開 賣了賠6W 但畢竟我家也有過車 還是個小名牌
看著考了博士 有找了研究所工作的女朋友整天還在等消息 還在為論文忙碌 想起來1年前的她還在為我認了個妹妹而吃醋
哈哈 人生不過如此 讓別人笑笑 偶爾笑笑別人~~
?
?
?
?
?
?
?
?
?
?
?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: 程序简单教程:飞秋官方下载
- 下一篇: 一个简单的录音软件程序代码【C++】