2009年11月30日 星期一

Bootloader的啟動方式


Bootloader的啟動


Linux系統是通過Bootloader引導啟動的。一上電,就要執行Bootloader來初始化系統。
系統加電或復位後(Reset),所有CPU都會從某個地址開始執行,這是由處理器設計決定的。比如,X86的復位向量在高地址端,ARM處理器在復位時從地址 0x00000000取第一條指令。嵌入式系統的開發板都要把板上ROMFlash映射到這個地址。因此,必須把Bootloader程序存儲在相應的 Flash位置。系統加電後,CPU將從這裡開始執行。


主機和目標機之間一般有串口(RS232或是RJ-45)可以連接,Bootloader軟件通常會通過串口來輸入輸出。例如:輸出出錯或者執行結果信息到串口終端,從串口終端讀取用戶控制命令等。


Bootloader啟動過程通常是多階段的(Vivi分成兩階段head.S(組合語言寫成)init/main.c(C語言寫成)),這樣既能提供復雜的功能,又有很好的可移植性。例如:從Flash啟動的Bootloader多數是兩階段的啟動過程。


大多數Bootloader都包含2種不同的操作模式:本地加載模式和遠程下載模式。這2種操作模式的區別僅對於開發人員才有意義,也就是不同啟動方式的使用。從最終用戶的角度看,Bootloader的作用就是用來加載操作系統,而並不存在所謂的本地加載模式與遠程下載模式的區別。
因為Bootloader的主要功能是引導操作系統啟動,所以我們詳細討論一下各種啟動方式的特點。


1.網路啟動方式
這種方式開發板不需要配置較大的存儲介質,跟無硬碟的工作站有點類似。但是使用這種啟動方式之前,需要把Bootloader安裝到板上的EPROM或者 Flash中。Bootloader通過以太網接口遠程下載Linux內核映像或者文件系統。
使用這種方式也有前提條件,就是目標板有串口、以太網接口或者其他連接方式。串口一般可以作為控制台,同時可以用來下載內核影像和RAMDISK文件系統。串口通信(RS232)傳輸速率過低,不適合用來掛接NFS文件系統。所以以太網接口成為通用的互連設備,一般的開發板都 可以配置10M乙太網接口(RJ-45)
對於PDA等手持設備來說,以太網的RJ-45接口顯得大了些,而USB接口,特別是USB的迷你接口,尺寸非常小。對於開發的嵌入式系統,可以把USB接口虛擬成以太網接口來通訊。這種方式在開發主機和開發板兩端都需要驅動程序。
另外,還要在服務器上配置啟動相關網路服務。Bootloader下載文件一般都使用TFTP網路協議,還可以通過DHCP的方式動態配置IP地址。


2.硬碟啟動方式
傳統的Linux系統運行在桌機或者伺服器上,這些電腦一般都使用BIOS引導,並且使用硬碟作為存儲介質。如果進入BIOS設置菜單,可以探測處理器、內存、硬碟等設備,可以設置BIOS從軟碟片、光碟機或者某顆硬碟啟動。也就是說,BIOS並不直接引導操作系統。那麼在硬碟的主引導區,還需要一個 Bootloader。這個Bootloader可以從硬碟文件系統中把操作系統引導起來。
Linux傳統上是通過LILOLInux LOader)引導的,後來又出現了GNU的軟件GRUBGRand Unified Bootloader)。這2Bootloader廣泛應用在X86Linux系統上。你的開發主機可能就使用了其中一種,熟悉它們有助於配置多種系統引導功能。


LILO軟件工程是由Werner Almesberger創建,專門為引導Linux開發的。現在LILO的維護者是John Coffman,最新版本下載站點:http://lilo.go.dyndns.orgLILO有詳細的文檔,例如LILO套件中附帶使用手冊和參考手冊。此外,還可以在LDP的“LILO mini-HOWTO”中找到LILO的使用指南。
GRUB GNU計劃的主要bootloaderGRUB最初是由Erich BoleynGNU Mach操作系統撰寫的引導程序。後來有Gordon MatzigkeitOkuji Yoshinori接替Erich的工作,繼續維護和開發GRUBGRUB的網站http://www.gnu.org/software/grub/上有對套件使用的說明文件,叫作《GRUB manual》。GRUB能夠使用TFTPBOOTP或者DHCP通過網路啟動,這種功能對於系統開發過程很有用。
除了傳統的Linux系統上的引導程序以外,還有其他一些引導程序,也可以支持硬碟引導啟動。例如:LoadLin可以從DOS下啟動Linux;還有ROLOLinuxBIOSU-Boot也支持這種功能。


3Flash啟動方式
大多數嵌入式系統上都使用Flash存儲介質。Flash有很多類型,包括NOR FlashNAND Flash和其他半導體盤。其中,NOR Flash使用最為普遍。
NOR Flash可以支持隨機訪問,所以程式是可以直接在Flash上執行的。Bootloader一般是存儲在Flash芯片上的。
Bootloader一般放在Flash的底端或者頂端,這要根據處理器的復位向量(Reset)設置。要使Bootloader的入口位於處理器上電執行第一條指令的位置。
接下來分配參數區,這裡可以作為Bootloader的參數保存區域。
再下來內核映像區。Bootloader引導Linux內核,就是要從這個地方把內核映像解壓到RAM中去,然後跳轉到內核映像入口執行。
然後是文件系統區。如果使用Ramdisk文件系統,則需要Bootloader把它解壓到RAM中。
最後還可以分出一些數據區,這要根據實際需要和Flash大小來考慮了。
這些分區是開發者定義的,Bootloader一般直接讀寫對應的偏移地址。到了Linux內核空間,可以配置成MTD設備來訪問Flash分區。
除了NOR Flash,還有NAND FlashCompact FlashDiskOnChip等。這些Flash具有芯片價格低,存儲容量大的特點。但是這些芯片一般通過專用控制器的I/O方式來訪問,不能隨機訪問,因此引導方式跟NOR Flash也不同。在這些芯片上,需要配置專用的引導程序。通常,這種引導程序起始的一段程式就把整個引導程序複製到RAM中運行,從而實現自行啟動,這跟從硬碟上啟動相似。

2009年11月22日 星期日

如何讓Ubuntu下可以解壓縮RAR檔?

下載rarlinux-3.9.0.tar.gz (版本可能不同)

開啟終端機然後到該資料夾的目錄輸入
tar zxvf rarlinux-3.9.0.tar.gz

會出現下列訊息
rar/
rar/readme.txt
rar/default.sfx
rar/whatsnew.txt
rar/license.txt
rar/order.htm
rar/rar
rar/unrar
rar/rar_static
rar/technote.txt
rar/rarfiles.lst
rar/makefile
rar/rar.txt

然後在輸入
cd rar => 進入rar資料夾

接著在輸入
make

2009年11月21日 星期六

如何在Ubuntu下安裝FTP(以Vsftpd為例)

1.首先先在終端機下輸入

sudo apt-get install vsftpd => 安裝Vsftpd套件

2.接著開啟

sudo gedit /etc/vsftpd.conf => 設定相關參數(可自行Google各參數定義)

****************以下是指令(你也可以複製貼上然後存檔)********************

# Example config file /etc/vsftpd.conf


#


# The default compiled in settings are fairly paranoid. This sample file


# loosens things up a bit, to make the ftp daemon more usable.


# Please see vsftpd.conf.5 for all compiled in defaults.


#


# READ THIS: This example file is NOT an exhaustive list of vsftpd options.


# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's


# capabilities.


#


#


# Run standalone? vsftpd can run either from an inetd or as a standalone


# daemon started from an initscript.


listen=YES


#


# Run standalone with IPv6?


# Like the listen parameter, except vsftpd will listen on an IPv6 socket


# instead of an IPv4 one. This parameter and the listen parameter are mutually


# exclusive.


#listen_ipv6=YES


#


# Allow anonymous FTP? (Beware - allowed by default if you comment this out).


anonymous_enable=NO


#


# Uncomment this to allow local users to log in.


local_enable=YES


#


# Uncomment this to enable any form of FTP write command.


write_enable=YES


#


# Default umask for local users is 077. You may wish to change this to 022,


# if your users expect that (022 is used by most other ftpd's)


local_umask=022


#


# Uncomment this to allow the anonymous FTP user to upload files. This only


# has an effect if the above global write enable is activated. Also, you will


# obviously need to create a directory writable by the FTP user.


#anon_upload_enable=YES


#


# Uncomment this if you want the anonymous FTP user to be able to create


# new directories.


#anon_mkdir_write_enable=YES


#


# Activate directory messages - messages given to remote users when they


# go into a certain directory.


dirmessage_enable=YES


#


# Activate logging of uploads/downloads.


xferlog_enable=YES


#


# Make sure PORT transfer connections originate from port 20 (ftp-data).


connect_from_port_20=YES


#


# If you want, you can arrange for uploaded anonymous files to be owned by


# a different user. Note! Using "root" for uploaded files is not


# recommended!


#chown_uploads=YES


#chown_username=whoever


#


# You may override where the log file goes if you like. The default is shown


# below.


xferlog_file=/var/log/vsftpd.log


#


# If you want, you can have your log file in standard ftpd xferlog format


xferlog_std_format=YES


#


# You may change the default value for timing out an idle session.


idle_session_timeout=600


#


# You may change the default value for timing out a data connection.


#data_connection_timeout=120


#


# It is recommended that you define on your system a unique user which the


# ftp server can use as a totally isolated and unprivileged user.


#nopriv_user=ftpsecure


#


# Enable this and the server will recognise asynchronous ABOR requests. Not


# recommended for security (the code is non-trivial). Not enabling it,


# however, may confuse older FTP clients.


#async_abor_enable=YES


#


# By default the server will pretend to allow ASCII mode but in fact ignore


# the request. Turn on the below options to have the server actually do ASCII


# mangling on files when in ASCII mode.


# Beware that on some FTP servers, ASCII support allows a denial of service


# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd


# predicted this attack and has always been safe, reporting the size of the


# raw file.


# ASCII mangling is a horrible feature of the protocol.


#ascii_upload_enable=YES


#ascii_download_enable=YES


#


# You may fully customise the login banner string:


#ftpd_banner=Welcome to OIpingo FTP service.


#


# You may specify a file of disallowed anonymous e-mail addresses. Apparently


# useful for combatting certain DoS attacks.


#deny_email_enable=YES


# (default follows)


#banned_email_file=/etc/vsftpd.banned_emails


#


# You may restrict local users to their home directories. See the FAQ for


# the possible risks in this before using chroot_local_user or


# chroot_list_enable below.


#chroot_local_user=YES


#


# You may specify an explicit list of local users to chroot() to their home


# directory. If chroot_local_user is YES, then this list becomes a list of


# users to NOT chroot().


chroot_list_enable=YES


# (default follows)


chroot_list_file=/etc/vsftpd.chroot_list


#


# You may activate the "-R" option to the builtin ls. This is disabled by


# default to avoid remote users being able to cause excessive I/O on large


# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume


# the presence of the "-R" option, so there is a strong case for enabling it.


#ls_recurse_enable=YES


#


#


# Debian customization


#


# Some of vsftpd's settings don't fit the Debian filesystem layout by


# default. These settings are more Debian-friendly.


#


# This option should be the name of a directory which is empty. Also, the


# directory should not be writable by the ftp user. This directory is used


# as a secure chroot() jail at times vsftpd does not require filesystem


# access.


secure_chroot_dir=/var/run/vsftpd


#


# This string is the name of the PAM service vsftpd will use.


pam_service_name=vsftpd


#


# This option specifies the location of the RSA certificate to use for SSL


# encrypted connections.


rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem


# This option specifies the location of the RSA key to use for SSL


# encrypted connections.


rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key


#可以接受的最大clinet可連線的數目


max_clients=20


#每個ip的最大連線數目


max_per_ip=15

*************以上是程式碼(去掉前面的井號該參數就會enable)****************



3.如果要新增另一個使用者步驟如下:
在終端機下輸入(先切換成Root權限 => sudo su)
adduser 您要的帳號
接著會要你輸入兩次密碼
然後開啟ftp軟體 輸入IP 帳號 密碼 就可以進入了
(如果你只有一個人使用,輸入IP然後帳號密碼用你登入Ubuntu的帳號與密碼就可以了 )

或者是在終端機下輸入
ftp 你的IP
(如果你的IP非固定IP請參考這篇NO-IP)


4.更改步驟後都要在終端機執行


sudo /etc/init.d/vsftpd stop 關閉 FTP服務
sudo /etc/init.d/vsftpd start 開啟 FTP服務
或者是你也可以用
sudo /etc/init.d/vsftpd restart 重開FTP服務

5.限制使用者

當在/etc/vsftpd.conf裡的chroot_local_user=YES(代表所有人都不可以跳出家目錄)
這時如果在sudo gedit /etc/vsftpd.chroot_list有該使用者的名稱則該使用者可以跳出

反之當chroot_local_user=NO(代表所有人都可以跳出家目錄)
這時如果在sudo gedit /etc/vsftpd.chroot_list有該使用者的名稱則該使用者無法跳出

6.讓你的FTP在登入時出現歡迎訊息方法如下:

開啟筆記本將你想要的歡迎訊息輸入,並將檔案儲存為『.message』並存放於跟目錄下『/home/你的帳號』

2009年11月20日 星期五

想開保時捷又沒錢買嗎?







 Link
想開保時捷又沒錢買嗎?
這裡有不錯的方案
xbox的方向盤
希望他可以出法拉利或是賓士、藍寶堅尼
個人是比較想開法拉利的

2009年11月13日 星期五

Ubuntu能夠執行.rpm檔的方法

如果在 Ubuntu 想要安裝的軟件只提供 RPM 檔案,而沒有提供 debian 的 .deb 檔案,可以使用 Alien Package 來解決。

執行下列指令安裝alien
sudo apt-get install alien

將.rpm轉.deb
sudo alien -k 檔名.rpm  這個步驟就需要一點時間了

完成後直接點就可以安裝了

Nero的Linux版

網址連結
http://www.nero.com/eng/downloads-linux4-trial.php

點選你要的版本安裝後就可以使用了

電路板的Nike球鞋






engadget看到的這雙Nike  這樣穿起來舒服嗎?

2009年11月12日 星期四

全世界最小的直昇機

全世界最小的直昇機Gen H-4 看了很久還是很有意思



該公司網站 http://www.gen-corp.jp/

販売価格 日幣 ¥6,000,000円(税別)能夠飛上天,這價錢算便宜吧!


另外一台 Mosquito XE

Mosquito XE : $30,000 (美金)including engine/instruments

Vivi Stage2

vivi的第二阶段

vivi的第二阶段是从main()函数开始,同一般的C语言程序一样,该函数在/init/main.c文件中,总共可以分为8个步骤。
(1) 函数开始,通过putstr(vivi_banner)打印出vivi的版本。Vivi_banner在/init/version.c文件中定义
(2) 对开发板进行初始化(board_init函数),board_init是与开发板紧密相关的,这个函数在/arch/s3c2410/smdk.c文件中。开发板初始化主要完成两个功能,时钟初始化(init_time())和通用IO口设置(set_gpios())。
void set_gpios(void)
{
GPACON = vGPACON;
GPBCON = vGPBCON;
GPBUP = vGPBUP;
GPCCON = vGPCCON;
GPCUP = vGPCUP;
GPDCON = vGPDCON;
GPDUP = vGPDUP;
GPECON = vGPECON;
GPEUP = vGPEUP;
GPFCON = vGPFCON;
GPFUP = vGPFUP;
GPGCON = vGPGCON;
GPGUP = vGPGUP;
GPHCON = vGPHCON;
GPHUP = vGPHUP;
EXTINT0 = vEXTINT0;
EXTINT1 = vEXTINT1;
EXTINT2 = vEXTINT2;
}
其中,GPIO口在smdk2410.h(\vivi\include\platform\目录下)文件中定义。
(3) 内存映射初始化和内存管理单元的初始化工作:
mem_map_init();
mmu_init();

这两个函数都在/arch/s3c2410/mmu.c文件中。
void mem_map_init(void)
{
#ifdef CONFIG_S3C2410_NAND_BOOT
mem_map_nand_boot();
#else
mem_map_nor();
#endif
cache_clean_invalidate();
tlb_invalidate();
}
如果配置vivi时使用了NAND作为启动设备,则执行mem_map_nand_boot(),否则执行mem_map_nor()。这里要注意的是,如果使用NOR启动,则必须先把vivi代码复制到RAM中。这个过程是由copy_vivi_to_ram()函数来完成的。代码如下:
static void copy_vivi_to_ram(void)
{ putstr_hex("Evacuating 1MB of Flash to DRAM at 0x", VIVI_RAM_BASE);
memcpy((void *)VIVI_RAM_BASE, (void *)VIVI_ROM_BASE, VIVI_RAM_SIZE);
}
VIVI_RAM_BASE、VIVI_ROM_BASE、VIVI_RAM_SIZE这些值都可以在smdk2410.h中查到,并且这些值必须根据自己开发板的RAM实际大小修改。这也是在移植vivi的过程中需要注意的一个地方。
mmu_init()函数中执行了arm920_setup函数。这段代码是用汇编语言实现的,针对arm920t核的处理器。
(4) 初始化堆栈,heap_init()。(定义在\vivi\lib\heap.c文件中)
int heap_init(void)
{
return mmalloc_init((unsigned char *)(HEAP_BASE), HEAP_SIZE);
}
(5) 初始化mtd设备,mtd_dev_init()。
int mtd_init(void)
{ int ret;
#ifdef CONFIG_MTD_CFI
ret = cfi_init();
#endif
#ifdef CONFIG_MTD_SMC
ret = smc_init();
#endif
#ifdef CONFIG_S3C2410_AMD_BOOT
ret = amd_init();
#endif
if (ret) {
mymtd = NULL;
return ret;
}
return 0;
}
这几个函数可以在/drivers/mtd/maps/s3c2410_flash.c里找到。
(6) 初始化私有数据,init_priv_data()。(定义在\vivi\lib\priv_data\rw.c文件中)
(7) 初始化内置命令,init_builtin_cmds()。
通过add_command函数,加载vivi内置的几个命令。
(8) 启动boot_or_vivi()。
启动成功后,将通过vivi_shell()启动一个shell(如果配置了CONFIG_SERIAL_TERM),此时vivi的任务完成。

Vivi Stage1

vivi的第一阶段
完成含依赖于CPU的体系结构硬件初始化的代码,包括禁止中断、初始化串口、复制自身到RAM等。相关代码集中在head.S(\vivi\arch\s3c2410目录下):
Head.S:
#include "config.h"
#include "linkage.h"
#include "machine.h"
@ Start of executable code
ENTRY(_start)
ENTRY(ResetEntryPoint)
@
@ Exception vector table (physical address = 0x00000000) ;异常向量表物理地址
@
@0x00: Reset ;复位
b Reset
@ 0x04: Undefined instruction exception ;未定义的指令异常
UndefEntryPoint:
b HandleUndef
@0x08: Software interrupt exception ;软件中断异常
SWIEntryPoint: b HandleSWI
@ 0x0c: Prefetch Abort (Instruction Fetch Memory Abort) ;内存操作异常
PrefetchAbortEnteryPoint: b HandlePrefetchAbort
@ 0x10: Data Access Memory Abort ;数据异常
DataAbortEntryPoint: b HandleDataAbort
@0x14: Not used ;未使用
NotUsedEntryPoint: b HandleNotUsed
@ 0x18: IRQ(Interrupt Request) exception ;慢速中断处理
IRQEntryPoint: b HandleIRQ
@ 0x1c: FIQ(Fast Interrupt Request) exception ;快速中断处理
FIQEntryPoint: b HandleFIQ
@
@ VIVI magics
@
@ 0x20: magic number so we can verify that we only put
.long 0
@ 0x24:
.long 0
@ 0x28: where this vivi was linked, so we can put it in memory in the right place
.long _start
@ 0x2C: this contains the platform, cpu and machine id
.long ARCHITECTURE_MAGIC
@ 0x30: vivi capabilities
.long 0
#ifdef CONFIG_PM ;vivi考虑不需要使用电源管理
@ 0x34:
b SleepRamProc
#endif
#ifdef CONFIG_TEST
@ 0x38:
b hmi
#endif
@
@ Start VIVI head
@
Reset:
@ disable watch dog timer ;禁止看门狗计时器
mov r1, #0x53000000 ;WTCON寄存器地址是0x53000000,清0
mov r2, #0x0
str r2, [r1]
#ifdef CONFIG_S3C2410_MPORT3 ;不符合条件,跳到下面的关中断
/**** 在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT3******/
mov r1, #0x56000000 ;GPACON寄存器地址是0x56000000
mov r2, #0x00000005 str r2, [r1, #0x70] ;配置GPHCON寄存器
mov r2, #0x00000001 str r2, [r1, #0x78] ;配置GPHUP寄存器
mov r2, #0x00000001 str r2, [r1, #0x74] ;配置GPHDAT寄存器
#endif
@ disable all interrupts ;禁止全部中断
mov r1, #INT_CTL_BASE
mov r2, #0xffffffff str r2, [r1, #oINTMSK] ;掩码关闭所有中断
ldr r2, =0x7ff
str r2, [r1, #oINTSUBMSK]
@ initialise system clocks ;初始化系统时钟
mvn r2, #0xff000000
str r2, [r1, #oLOCKTIME]
@ldr r2, mpll_50mhz
@str r2, [r1, #oMPLLCON]
#ifndef CONFIG_S3C2410_MPORT1 ;满足条件,向下执行
/**** 在/vivi/include/autoconf.h中#undef CONFIG_S3C2410_MPORT1******/
@ 1:2:4
mov r1, #CLK_CTL_BASE
mov r2, #0x3
str r2, [r1, #oCLKDIVN]
mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
orr r1, r1, #0xc0000000 @ Asynchronous
mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
@ now, CPU clock is 200 Mhz ;CPU的频率是200MHz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_200mhz
str r2, [r1, #oMPLLCON]
#else
@ 1:2:2
mov r1, #CLK_CTL_BASE
ldr r2, clock_clkdivn
str r2, [r1, #oCLKDIVN]
orr r1, r1, #0xc0000000 @ Asynchronous
mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
@ now, CPU clock is 100 Mhz ;CPU的频率是100MHz
mov r1, #CLK_CTL_BASE
ldr r2, mpll_100mhz
str r2, [r1, #oMPLLCON]
#endif
bl memsetup ;跳转到memsetup函数
/*****************************
Memsetup函数的实现:
ENTRY(memsetup)
@ initialise the static memory
@ set memory control registers ;设置内存控制寄存器的初值
mov r1, #MEM_CTL_BASE
adrl r2, mem_cfg_val
/*******************
@
@ Data Area
@
@ Memory configuration values
.align 4
mem_cfg_val: ;定义好的13*4=52个字节初值
.long vBWSCON ;在/vivi/include/platform/smdk2410.h中赋值
/****** SDRAM从32位变成16位,需要修改vBWSCON的值 ******/
.long vBANKCON0
.long vBANKCON1
.long vBANKCON2
.long vBANKCON3
/********** 网卡控制器vBANKCON3的值可能需要修改 **************/
.long vBANKCON4
.long vBANKCON5
.long vBANKCON6
/****** SDRAM从32位变成16位,可能需要修改vBANKCON6的值 ******/
.long vBANKCON7
.long vREFRESH
.long vBANKSIZE
/****** SDRAM从64MB变成32MB,需要修改vBANKSIZE的值 ******/
.long vMRSRB6
.long vMRSRB7
********************/
add r3, r1, #52
1: ldr r4, [r2], #4
str r4, [r1], #4
cmp r1, r3
bne 1b ;循环操作,直到13个寄存器赋值完成
mov pc, lr
*******************************/
#ifdef CONFIG_PM ;vivi考虑不需要使用电源管理
@ Check if this is a wake-up from sleep
ldr r1, PMST_ADDR
ldr r0, [r1]
tst r0, #(PMST_SMR)
bne WakeupStart ;查看状态,判断是否需要跳转到WakeupStart
#endif
#ifdef CONFIG_S3C2410_SMDK ;SMDK开发板使用
@ All LED on ;点亮开发板上的LED
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_F ;LED使用GPIOF组的管脚
ldr r2,=0x55aa ;使能EINT0,EINT1,EINT2,EINT3,
;另四个管脚配置成输出,屏蔽EINT4,5,6,7
str r2, [r1, #oGPIO_CON]
mov r2, #0xff
str r2, [r1, #oGPIO_UP] ;disable the pull-up function
mov r2, #0x00
str r2, [r1, #oGPIO_DAT]
#endif
#if 0
@ SVC
mrs r0, cpsr
bic r0, r0, #0xdf
orr r1, r0, #0xd3
msr cpsr_all, r1
#endif
@ set GPIO for UART ;设置串口
mov r1, #GPIO_CTL_BASE
add r1, r1, #oGPIO_H ;设置GPIO_H组管脚为串口
ldr r2, gpio_con_uart
str r2, [r1, #oGPIO_CON]
ldr r2, gpio_up_uart
str r2, [r1, #oGPIO_UP]
/*************************
@ inital values for GPIO
gpio_con_uart:
.long vGPHCON ;vGPHCON在/vivi/include/platform/smdk2410.h中赋值
;#define vGPHCON 0x0016faaa
;GPIO_H配置为nCTS0,nRTS0, RXD0,TXD0, RXD1,
;TXD1,nCTS1,nRTS1,
/**** 三个串口都使能,可能需要修改#define vGPHCON 0x0016aaaa ****/
gpio_up_uart:
.long Vgphup ;同上#define vGPHUP 0x000007ff
;The pull-up function is disabled.
************************/
bl InitUART ;跳转到InitUART串口初始化函数
/****************************************************
@ Initialize UART
@
@ r0 = number of UART port
InitUART:
ldr r1, SerBase
/*******************
.align 4 ;缺省情况下在vivi中只初始化了UART0
SerBase:
#if defined(CONFIG_SERIAL_UART0)
.long UART0_CTL_BASE ;基地址在/vivi/include/s3c2410.h中定义
#elif defined(CONFIG_SERIAL_UART1)
.long UART1_CTL_BASE
#elif defined(CONFIG_SERIAL_UART2)
.long UART2_CTL_BASE
#else
#error not defined base address of serial
#endif
********************/
mov r2, #0x0
str r2, [r1, #oUFCON]
str r2, [r1, #oUMCON]
mov r2, #0x3
str r2, [r1, #oULCON]
ldr r2, =0x245
str r2, [r1, #oUCON]
#define UART_BRD ((50000000 / (UART_BAUD_RATE * 16)) - 1)
mov r2, #UART_BRD
str r2, [r1, #oUBRDIV]
mov r3, #100
mov r2, #0x0
1: sub r3, r3, #0x1
tst r2, r3
bne 1b
#if 0
mov r2, #'U'
str r2, [r1, #oUTXHL]
1: ldr r3, [r1, #oUTRSTAT]
and r3, r3, #UTRSTAT_TX_EMPTY
tst r3, #UTRSTAT_TX_EMPTY
bne 1b
mov r2, #'0'
str r2, [r1, #oUTXHL]
1: ldr r3, [r1, #oUTRSTAT]
and r3, r3, #UTRSTAT_TX_EMPTY
tst r3, #UTRSTAT_TX_EMPTY
bne 1b
#endif
mov pc, lr
****************************************************/
#ifdef CONFIG_DEBUG_LL ;打印调试信息,缺省未定义
@ Print current Program Counter
ldr r1, SerBase
mov r0, #'\r'
bl PrintChar
mov r0, #'\n'
bl PrintChar
mov r0, #'@'
bl PrintChar
mov r0, pc
bl PrintHexWord
#endif
#ifdef CONFIG_BOOTUP_MEMTEST
@ simple memory test to find some DRAM flaults.
bl memtest
#endif
#ifdef CONFIG_S3C2410_NAND_BOOT ;从NAND Flash启动
bl copy_myself ;跳转到copy_myself函数
/**********************************************
@
@ copy_myself: copy vivi to ram
@
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
1: add r3, r3, #0x1
cmp r3, #0xa
blt 1b
2: ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq 2b
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
@ copy vivi to RAM
ldr r0, =VIVI_RAM_BASE
/*********在/vivi/linux/platform/smdk2410.h中定义
#define VIVI_RAM_BASE (DRAM_BASE + DRAM_SIZE - VIVI_RAM_SIZE)
***************************************/
mov r1, #0x0
mov r2, #0x20000 ;0x20000-〉128k字节
bl nand_read_ll ;nand_read_ll在/vivi/arch/s3c2410/nand_read.c中定义
;r0,r1,r2分别为函数的三个参数
;从NANDFlash的0地址拷贝128k到SDRAM指定处
tst r0, #0x0
beq ok_nand_read
#ifdef CONFIG_DEBUG_LL
bad_nand_read:
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
1: b 1b @ infinite loop
#endif
ok_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase
bl PrintWord
#endif
@ verify
mov r0, #0
ldr r1, =0x33f00000
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq done_nand_read
bne go_next
notmatch:
#ifdef CONFIG_DEBUG_LL
sub r0, r0, #4
ldr r1, SerBase
bl PrintHexWord
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
#endif
1: b 1b
done_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase
bl PrintWord
#endif
mov pc, r10 ;vivi拷贝到SDRAM完成,函数返回
*********************************/
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
#ifdef CONFIG_DEBUG_LL
ldr r1, SerBase
ldr r0, STR_STACK
bl PrintWord
ldr r0, DW_STACK_START
bl PrintHexWord
#endif
@ get read to call C functions
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
mov a2, #0 @ set argv to NULL
bl main @ call main
mov pc, #FLASH_BASE @ otherwise, reboot
@
@ End VIVI head
@

2009年11月11日 星期三

Ubuntu下安裝Flash Player(32bit)

安裝Flash Player(建議到官方網站下載Linux下可執行的deb檔比較快)
sudo apt-get install flashplugin-installer

亂碼問題
sudo mv /etc/fonts/conf.avail/49-sansserif.conf /etc/fonts/conf.avail/49-sansserif.conf.bak

Ubuntu上方面板圖示不小心刪了處理方法

話說有天更新完Ubuntu的套件後右上方的圖示亂了

想說調整看看,沒想到我手賤把Ubuntu的無線訊號給砍了

最後只剩下帳號的圖示

筆記型電腦沒有那個圖示 要怎麼上網?連訊號都不知道要收尋哪個

還好搜尋了半天總算找到解決辦法(原來也有人跟我一樣手賤)

以下是解決辦法

Ubuntu的默认面板菜单栏删除后恢复的方法

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]
本文链接: http://www.php-oa.com/2008/09/21/gnome-panel.html
我在一次不小心给Ubuntu的面板菜单栏删除了,害我很多事情不能做,因为没有面板。研究了一下怎么恢复的方法。
其实很容易,在个人的主目录。然后
rm -rf  .gconf
这样就行了,在重新进入,是不是面板都恢复成默认的啦。
如果还不行,那就
rm -rf .gconfd 这个也删除啦
另外,如果只是面板上面应用程序的面板菜单没有了
给.config/menus/application.menu 删除后重新登录好了

2009年11月10日 星期二

如何在Ubuntu下增加字型

將新的字型 copy 到/usr/share/fonts/truetype

終端機下
=> sudo cp 字型的位址 /usr/share/fonts/truetype

或是直接複製字型到/usr/share/fonts/truetype

第一篇文章

這個Blog主要是紀錄日常、研究生活的點點滴滴

主要為LinuxEmbedded System上的心得與筆記

並提供給有需要的人 在遍尋不著時的良藥