{{http://www.mcuzone.com/bbs/skins/Discuz/logo.gif}}\\ 本页内容发表于MCUZone。\\ 如果你对本页的技术内容有疑问,请到 [[http://www.mcuzone.com/bbs | MCUZone技术论坛]] 发帖。\\ 如果你认为本页的内容侵害了你的权益,请与; 联系,我们会在确认后移除。 MCUZone旗下网站:\\ [[http://www.mcuzone.com | http://www.mcuzone.com]]---MCUZone是微控电子主力站点。\\ [[http://www.mcuzone.com/bbs | 微控电子论坛]]---微控电子的技术/售后服务论坛。\\ [[http://www.atarm.com|http://www.atarm.com]]---ATARM为微控电子的第二品牌,主要进行ATARM的推广和芯片以及周边产品的销售。\\ ====== SAM926x Linux HowTo ====== 本文的目的在于帮助AT91SAM926x(以下简称为SAM926x)的软件开发工程师从零开始,为SAM926x建立Linux运行环境。\\ 在进行SAM926x Linux开发之前,需要[[http://www.mcuzone.com/bbs/dispbbs.asp?boardID=7&ID=7503&page=1|建立开发环境]]。\\ 本文的行文不拘泥于一种形式,变化颇多,请谅解。\\ 本文的部分内容来源于网络。\\ 本文不会补充Linux的基本应用知识,请自行google。\\ 本文涉及到的源码包都将收录于本站的[[http://www.mcuzone.com:8080/shop/index.php?gOo=goods_search_list.dwt&gcat=14 | 开发板]]配套光盘。\\ \\ SAM926x Linux的基本组成: * Bootstrap * U-boot * Kernel * Rootfs Bootstrap可以在Windows PC上编译,其余的在Linux PC上编译。\\ 各部分组成如下图: {{ http://www.at91.com/linux4sam/pub/Linux4SAM/GettingStarted/Linux4SAM_GettingStarted.png }} ===== 基础知识 ===== * AT91SAM926x是什么? 如果你还没有搞懂这个问题,请不要继续往下看。请先参观一下[[http://www.mcuzone.com/bbs | 本站论坛]]。 * Linux是什么? 简单地说,Linux是一套免费使用和自由传播的类Unix操作系统,它主要用于基于Intel x86系列CPU的计算机上。这个系统是由世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的 Unix兼容产品。 Linux的出现,最早开始于一位名叫 Linus Torvalds的计算机业余爱好者,当时他是芬兰赫尔辛基大学的学生。他的目的是想设计一个代替 Minix(是由一位名叫 Andrew Tannebaum的计算机教授编写的一个操作系统示教程序)的操作系统,这个操作系统可用于 386、486或奔腾处理器的个人计算机上,并且具有 Unix操作系统的全部功能,因而开始了 Linux雏形的设计。 Linux以它的高效性和灵活性著称。它能够在 PC计算机上实现全部的 Unix特性,具有多任务、多用户的能力。 Linux是在 GNU公共许可权限下免费获得的,是一个符合 POSIX标准的操作系统。 Linux操作系统软件包不仅包括完整的 Linux操作系统,而且还包括了文本编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的 X-Windows图形用户界面,如同我们使用 Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。 * Linux与其他操作系统有什么区别? Linux可以与 MS-DOS、OS/2、Windows等其他操作系统共存于同一台机器上。它们均为操作系统,具有一些共性,但是互相之间各有特色,有所区别。 目前运行在 PC机上的操作系统主要有Microsoft的 MS-DOS、 Windows、 Windows NT、 IBM的 OS/2等。早期的 PC机用户普遍使用 MS-DOS,因为这种操作系统对机器的硬件配置要求不高,而随着计算机硬件技术的飞速发展,硬件设备价格越来越低,人们可以相对容易地提高计算机的硬件配置,于是开始使用 Windows、Windows NT等具有图形界面的操作系统。 Linux是新近被人们所关注的操作系统,它正在逐渐为PC机的用户所接受。那么,Linux与其他操作系统的主要区别是什么呢?下面从两个方面加以论述。 首先看一下Linux与 MS-DOS之间的区别。在同一系统上运行Linux和MS-DOS已很普遍,就发挥处理器功能来说,MS-DOS没有完全实现x86处理器的功能,而Linux完全在处理器保护模式下运行,并且开发了处理器的所有特性。Linux可以直接访问计算机内的所有可用内存,提供完整的Unix接口。而MS-DOS只支持部分Unix的接口。 就使用费用而言,Linux和MS-DOS是两种完全不同的实体。与其他商业操作系统相比,MS-DOS价格比较便宜,而且在PC机用户中有很大的占有率,任何其他 PC机操作系统都很难达到MS-DOS的普及程度,因为其他操作系统的费用对大多数PC机用户来说都是一个不小的负担。Linux是免费的,用户可以从internet上或者其他途径获得它的版本,而且可以任意使用,不用考虑费用问题。 就操作系统的功能来说,MS-DOS是单任务的操作系统,一旦用户运行了一个MS-DOS的应用程序,它就独占了系统的资源,用户不可能再同时运行其他应用程序。而Linux是多任务的操作系统,用户可以同时运行多个应用程序。 * 从哪里可以获得Linux的源代码? [[http://www.kernel.org | kernel source]] \\ [[http://www.at91.com/linux4sam/bin/view/Linux4SAM/LinuxKernel | linux4sam kernel patch]] * 什么是GPL? 通用性公开许可证(General Public License,简称GPL)。GPL同其它的自由软件许可证一样,许可社会公众享有运行、复制软件的自由;发行传播软件的自由;获得软件源码的自由,以及改进软件并将自己作出的改进版本向社会发行传播的自由。GPL还规定,只要这种修改文本的整体或者其某个部分来源于遵循GPL的程序,则该修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己做出的限制。因此,遵循GPL流通的程序不能同非自由的软件合并。GPL所表达的这种流通规则称为copyleft,表示与copyright(版权)的概念“相左”。 * 哪里有GPL的许可证文本? 一般遵循GPL的软件都会在软件包内包含GPL许可证文本。\\ 也可以到下面网站查看[[http://www.opensource.org/licenses/gpl-license.php | GNU General Public License ]]。 ===== 开发环境 ===== 开发Linux应用,需要: * 一台Linux PC(可以是虚拟机,以下简称为Linux开发机) 可以安装主流的Linux发行版本,比如[[http://ubuntu.org.cn/ | ubuntu]], [[http://www.fedorachina.cn/ | Fedora]]等等。 \\ :!:标准的发行版本可能并没有包括所有开发中需要的组件。开发过程中可以根据需要通过网络安装。\\ 如果采用虚拟机方式,可以选择虚拟机软件如[[http://www.microsoft.com/windows/virtual-pc/ | Virtual PC]], [[http://www.vmware.com/cn/| VMware]], [[http://www.virtualbox.org | VirtualBox]]等。安装完成后需要"打通"虚拟机与宿主机的共享通道,可以使用Linux的samba或者使用虚拟软件提供的第三方工具。\\ :!:使用虚拟机,请保证虚拟机硬盘足够大。可以使用8GB硬盘作为第一硬盘,安装系统;而另外再虚拟一块硬盘,用于编译和工作。 * 可用的网络 基于两个原因:\\ 1. 开发初期使用NFS会比较方便。\\ 2. Linux开发机安装组件。\\ * 开发机上所需要的基本程序开发工具 比如gcc([[http://www.faqs.org/docs/Linux-HOWTO/GCC-HOWTO.html | GCC-HOWTO]])等。 * 目标板所用的交叉编译器 所谓交叉编译器,就是指在开发机上运行,编译结果在另外架构的平台上运行。\\ 这里的交叉编译器指的就是ARM交叉编译器。编译器在Linux x86上将源代码编译成ARM体系结构适用的可执行文件。\\ Linux下可以使用的ARM交叉编译器很多,经过测试,本站推荐使用[[http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite|arm-none-linux-gnueabi]],在下载页面选择GNU/Linux对应的软件包。\\ 下载后在Linux开发机上解压缩,并将工具链bin文件夹(arm-none-linux-gnueabi-gcc所在文件夹)添加到系统PATH,即可完成安装。 * 目标烧写(编程)工具 有了编译的输出,还需要编程工具将其固化到SAM926x的板子上运行。这个过程就是编程的过程。\\ 由于SAM926x提供了SAM-BA工具,所以最基本的方式就是通过USB口利用[[http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3883|SAM-BA软件]]下载。[[http://www.mcuzone.com/artical_html/art/SAM-BA_Rev2.0.pdf | SAM-BA软件使用教程]]。\\ 如果对编程速度有高的要求,可以选择第三方编程器。 * 硬件仿真器 可以用于对bootstrap与u-boot进行调试,方便定位可能的问题。\\ Linux下可以使用软件的方法debug,比如打log,或者使用[[http://www.tutorialspoint.com/gnu_debugger/what_is_gdb.htm | GDB]]。 ===== SAM926x Linux 基础===== ==== 启动过程 ==== 本文主要讲述从Data Flash上启动的过程,NAND flash启动,NOR Flash启动请参考相关文档。 {{ http://www.at91.com/linux4sam/pub/Linux4SAM/GettingStarted/linux_boot_sequence.png }} - 处理器复位,根据BMS引脚的设置,选择从内部ROM启动(NOR Flash启动方式不在本文的讨论范围)。 - ROM中的代码开始运行,初始化处理器和必要的外设,比如DBGU,USB device port。然后开始从Data Flash或NAND的0地址检索合法(:?:具体参考数据手册的boot program的章节)的启动程序,也就是Bootstrap。 - 如果合理的Bootstrap存在,ROMBOOT将其复制到内部SRAM并跳转到Bootstrap运行。如果没有,检测其它支持启动的存储介质,如果都没有,则等待DBGU或者USB口的连接,这部分内容请参考SAM-BA手册。 - Bootstrap将初始化一些设备,主要是Data Flash或NAND与SDRAM,然后从Data Flash或NAND的特定位置(在Bootstrap源代码中指定)将U-boot复制到SDRAM的指定位置,然后跳转到U-boot开始位置运行。 - U-boot根据环境变量(bootcmd)加载Linux Kernel的image。加载完成后跳转到Kernel运行,并传递启动参数(bootargs)。 - Linux Kernel开始运行,加载相关驱动,并加载rootfs。其中的细节,可以参考Linux书籍。 ==== Data Flash Boot Mem Map ==== {{ http://www.at91.com/linux4sam/pub/Linux4SAM/GettingStarted/demo_dataflash_map.png }} * :!: Internal Flash 在sam926x上是ROM * :!: Data Flash的分区在u-boot下指定,上图显示的是新分区,和现在的例子不同 * :!: NAND FLASH(128MB)平均分为两个分区,分区0作为rootfs(JFFS2格式),分区1由用户定义 ==== NAND Flash Boot Mem Map ==== {{ http://www.at91.com/linux4sam/pub/Linux4SAM/GettingStarted/demo_nandflash_map.png }} * 图中所示为页面大小为2048字节的NAND,一个block(NAND擦除的最小单位)为128KB,也就是0x20000 * 图上为ATMEL官方分区,kernel image从2MB开始,到4MB结束,:!:大小不能超过2MB * 本站例子中的kernel image从0xA0000开始,结束地址相同,也是4MB,使得kernel image可以超过3MB ===== Bootstrap ===== Bootstrap用于加载一段程序到SDRAM运行,本文关注于加载u-boot的应用。\\ Bootstrap可以称作(程序员可见的)一级boot,实际上芯片内部还有个BOOTROM,也就是SAM-BA的启动程序。关于芯片内部BOOTROM程序的运行流程和详细描述,请参考数据手册的相关章节(Boot Program)。\\ Bootstrap的代码由芯片上的BOOTROM根据一定的规则(0x14处的数据由特殊含义,这也是烧写一级boot时需要选择send boot file的原因)加载到内部SRAM运行。\\ Bootstrap的代码很短,主要原因在于SAM926x内部SRAM的限制。其主要工作就是初始化SDRAM和相关存储器(Data Flash, NAND),然后加载u-boot到SDRAM指定位置并开始运行u-boot。\\ ==== 下载Bootstrap代码==== [[http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4093| ATMEL bootstrap源代码]]\\ 下载后展开压缩包。 === Bootstrap源代码结构=== Bootstrap源代码由共用的硬件驱动,比如SDRAM,NAND,DATA Flash等,库文件,头文件等组成。\\ 新的Bootstrap代码中包含了一个[[http://get.adobe.com/cn/reader/|PDF格式]]的说明文件,包含在doc文件夹下。\\ 主要的地方在board文件夹下,也就是不同板子的项目所在。根据板子的启动配置不同,同一个板子的文件夹下有不同的目标配置,比如dataflash与nandflash。进入不同的目标配置文件就可以看到该目标配置的配置文件(*.h)及Makefile。 === Bootstrap目标配置文件=== 以SAM9261 Data flash bootstrap为例说明配置文件的作用:\\ Bootstrap-v1.11\board\at91sam9261ek\dataflash\at91sam9261ek.h: #ifndef _AT91SAM9261EK_H #define _AT91SAM9261EK_H /* ******************************************************************* */ /* PMC Settings */ /* */ /* The main oscillator is enabled as soon as possible in the c_startup */ /* and MCK is switched on the main oscillator. */ /* PLL initialization is done later in the hw_init() function */ /* ******************************************************************* */ #define MCK_100 #ifdef MCK_100 #define MASTER_CLOCK (198656000/2) #define PLL_LOCK_TIMEOUT 1000000 #define PLLA_SETTINGS 0x2060BF09 #define PLLB_SETTINGS 0x10483F0E /* AC characteristics */ /* DLYBS = tCSS= 250ns min and DLYBCT = tCSH = 250ns */ #define DATAFLASH_TCSS (0x1a << 16) /* 250ns min (tCSS) <=> 12/48000000 = 250ns */ #define DATAFLASH_TCHS (0x1 << 24) /* 250ns min (tCSH) <=> (64*1+SCBR)/(2*48000000) */ #else /* 133 MHz */ #define MASTER_CLOCK (250000000/2) #define PLL_LOCK_TIMEOUT 1000000 #define PLLA_SETTINGS 0x20D8BF10 #define PLLB_SETTINGS 0x10483F0E /* #define MASTER_CLOCK (266000000/2) #define PLL_LOCK_TIMEOUT 1000000 #define PLLA_SETTINGS 0x2064BF07 #define PLLB_SETTINGS 0x10483F0E */ #define DATAFLASH_TCSS (0xf << 16) /* 250ns min (tCSS) <=> 12/48000000 = 250ns */ #define DATAFLASH_TCHS (0x2 << 24) /* 250ns min (tCSH) <=> (64*1+SCBR)/(2*48000000) */ #endif /* Switch MCK on PLLA output PCK = PLLA = 2 * MCK */ #define MCKR_SETTINGS (AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2) #define MCKR_CSS_SETTINGS (AT91C_PMC_CSS_PLLA_CLK | MCKR_SETTINGS) /* ******************************************************************* */ /* DataFlash Settings */ /* */ /* ******************************************************************* */ #define AT91C_BASE_SPI AT91C_BASE_SPI0 #define AT91C_ID_SPI AT91C_ID_SPI0 /* SPI CLOCK */ #define AT91C_SPI_CLK 33000000 #define DF_CS_SETTINGS (AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | ((MASTER_CLOCK / AT91C_SPI_CLK) << 8)) /* ******************************************************************* */ /* BootStrap Settings */ /* */ /* ******************************************************************* */ #define AT91C_SPI_PCS_DATAFLASH AT91C_SPI_PCS0_DATAFLASH /* Boot on SPI NCS0 */ #define IMG_ADDRESS 0x8400 /* Image Address in DataFlash */ #define IMG_SIZE 0x33900 /* Image Size in DataFlash */ #define MACH_TYPE 0x350 /* AT91SAM9261-EK */ #define JUMP_ADDR 0x23F00000 /* Final Jump Address */ /* ******************************************************************* */ /* Application Settings */ /* ******************************************************************* */ #undef CFG_DEBUG #define CFG_DATAFLASH #define CFG_HW_INIT #define CFG_SDRAM #endif /* _AT91SAM9261EK_H */ * 根据data flash配置,设置时序及data flash片选 * 设置被加载的代码(u-boot, for Linux)的加载源地址(data flash中),及加载目标地址(SDRAM中),以及代码加载长度 :!:加载的起始地址必须与分区表一致,代码长度也必须适合编译输出的u-boot。 * 定义为Dataflash启动,不使用DEBUG的输出 ==== 下载Windows下的编译器arm-elf-gcc==== [[http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/ | WinARM:The gnu-toolchain and several tools and samples for ARM controller/processors for MS-Windows-Platforms]]\\ [[http://www.gnuarm.com/files.html | GNU ARM™ toolchain for CygWin, Linux and MacOS]]\\ [[http://www.yagarto.de/ | YAGARTO GNU ARM toolchain ]]\\ [[http://www.codesourcery.com/sgpp/lite/arm/portal/release1294 | Sourcery G++ Lite ARM EABI ]]\\ 选一即可。\\ 直接安装即可,不同的软件可能需要不同的配置,比如添加路径到PATH。可以参考软件的release notes。\\ 下面的编译过程以GNU ARM + cygwin环境为例。\\ 检验编译器安装:\\ **$** which arm-elf-gcc\\ /cygdrive/d/_dsetup/arm/gnuarm/bin/arm-elf-gcc\\ **$** arm-elf-gcc -v\\ Using built-in specs.\\ Target: arm-elf\\ Configured with: ../gcc-4.3.2/configure --target=arm-elf --prefix=/c/gnuarm --enable-interwork --enable-multilib --with-\\ float=soft --with-newlib --with-headers=../newlib-1.16.0/newlib/libc/include --enable-languages=c,c++\\ Thread model: single\\ gcc version 4.3.2 (GCC)\\ ==== 编译Bootstrap ==== ===Bootstrap for SAM9261 Dataflash=== 在\Bootstrap-v1.11\board\at91sam9261ek\dataflash文件下输入:\\ $ make 输出:\\ rm -f *.o *.bin *.elf *.map\\ arm-elf-gcc -g -mcpu=arm9 -c -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash -DTOP_OF_MEM=0x328000 ../../../crt0_gnu.S -o crt0_gnu.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../board/at91sam9261ek/at91sam9261ek.c -o at91sam9261ek.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../main.c -o main.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../driver/gpio.c -o gpio.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../driver/pmc.c -o pmc.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../driver/debug.c-o debug.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../driver/sdramc.c -o sdramc.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../driver/dataflash.c -o dataflash.o\\ arm-elf-gcc -g -mcpu=arm9 -c -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash -DTOP_OF_MEM=0x328000 ../../../lib/_udivsi3.S -o _udivsi3.o\\ arm-elf-gcc -g -mcpu=arm9 -c -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash -DTOP_OF_MEM=0x328000 ../../../lib/_umodsi3.S -o _umodsi3.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../lib/div0.c -o div0.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../lib/udiv.c -o udiv.o\\ arm-elf-gcc -c -g -mcpu=arm9 -Os -Wall -DAT91SAM9261 -I./../../../board/at91sam9261ek/dataflash ../../../lib/string.c -o string.o\\ arm-elf-gcc -nostartfiles -nostdlib -Wl,-Map=dataflash_at91sam9261ek.map,--cref -T ../../../elf32-littlearm.lds -Ttext 0x300000 -n -o dataflash_at91sam9261ek.elf crt0_gnu.o at91sam9261ek.o main.o gpio.o pmc.o debug.o sdramc.o dataflash.o _udivsi3.o _umodsi3.o div0.o udiv.o string.o\\ arm-elf-objcopy --strip-debug --strip-unneeded dataflash_at91sam9261ek.elf -O binary dataflash_at91sam9261ek.bin\\ 生成的dataflash_at91sam9261ek.bin就是Bootstrap的启动文件,需要通过SAM-BA 以:!: send boot file的方式烧写到data flash。 ===Bootstrap for SAM9263 Dataflash=== :!:由于官方默认时钟频率为16MHz,而板子上使用的是18MHz,因此需要修改源代码: Bootstrap-v1.11\board\at91sam9263ek\dataflash\at91sam9263ek.h: #define CRYSTAL_16_36766MHZ 1 修改为 #define CRYSTAL_18_432MHZ 1 修改代码后使用make即可编译生成板子适用的data flash bootstrap的代码。 ===Bootstrap for SAM9263 Nand=== :!:由于官方默认时钟频率为16MHz,而板子上使用的是18MHz,因此需要修改源代码: Bootstrap-v1.11\board\at91sam9263ek\nandflash\at91sam9263ek.h: #define CRYSTAL_16_36766MHZ 1 修改为 #define CRYSTAL_18_432MHZ 1 修改代码后使用make即可编译生成板子适用的nand bootstrap的代码。 ===== U-boot ===== U-boot是一个庞大的公开源码的软件。支持一系列的ARM体系(但不仅限于ARM体系结构),包含常见的外设的驱动,是一个功能强大的板极支持包。\\ U-BOOT是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案。u-boot是一个open source的bootloader。\\ 为什么需要u-boot?显然可以将Linux直接烧入flash,仅使用简单的引导装载程序(bootloader)加载。但是从软件升级的角度,程序的健壮程度,支持的外设等等来说,一款强大的bootloader能极大提高程序开发效率: - U-boot可以在开发初期测试大部分外设 - U-boot可以使用网络,USB等方式加载kernel image,不需要每次都烧写,既节省时间,又避免flalsh/NAND的损坏 - 丰富的FLASH/NAND编程功能的支持,可以用于代码的烧写 ==== 下载U-boot源代码 ==== * [[http://www.denx.de/wiki/U-Boot/SourceCode | U-boot源代码]] 该页面提供了一个FTP链接,直接从其FTP下载。\\ 本文使用的U-boot版本为[[http://www.denx.de/wiki/U-Boot/UbootStat_2008_10|2008.10]]。\\ 对于下载下来的u-boot-2008.10.tar.bz2文件,使用下面命令解压:\\ tar jxvf u-boot-2008.10.tar.bz2 ==== U-boot代码简介 ==== U-boot的代码比较多,但是一般开发过程中关注board与inculde/configs即可。\\ board目录包含了各种板子的绝大部分板级支持。\\ inculde/configs中以板子命名的头文件定义了该板子的各种配置,比如对网络的支持,JFFS2,USB的支持等。修改头文件就可以改变板子的配置。\\ * [[http://www.mcuzone.com/bbs/dispbbs.asp?BoardID=7&ID=4821&replyID=&skin=1 | 读9261的U-boot代码获得的函数调用关系 ]] * [[http://www.mcuzone.com/bbs/dispbbs.asp?boardID=7&ID=3263&page=3 | 使用AXD在9261上调试u-boot]] ==== 更改U-boot源代码 ==== - 修改Makefile以指定工具链 u-boot-2008.10/Makefile:\\ 默认使用arm-linux-工具链: ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux- endif 修改为上面安装的[[http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite|arm-none-linux-gnueabi-]]工具链: ifeq ($(ARCH),arm) CROSS_COMPILE = arm-none-linux-gnueabi- endif - 针对本站的SAM926x开发板,必须修改源代码的一些相关配置部分,比如时钟频率(SAM9263),LCD时序参数(SAM9261,SAM9263)。 === SAM9261 === 需要修改LCD时序参数,以适合本站的竖屏。\\ u-boot-2008.10\board\atmel\at91sam9261ek\at91sam9261ek.c: 修改结构体: vidinfo_t panel_info = { vl_col: 240, vl_row: 320, vl_clk: 4965000, vl_sync: ATMEL_LCDC_INVLINE_INVERTED | ATMEL_LCDC_INVFRAME_INVERTED, vl_bpix: 3, vl_tft: 1, vl_hsync_len: 5, vl_left_margin: 1, vl_right_margin:33, vl_vsync_len: 1, vl_upper_margin:1, vl_lower_margin:0, mmio: AT91SAM9261_LCDC_BASE, }; vidinfo_t panel_info = { vl_col: 240, vl_row: 320, vl_clk: 4965000, vl_sync: ATMEL_LCDC_INVLINE_INVERTED | ATMEL_LCDC_INVFRAME_INVERTED, vl_bpix: 3, vl_tft: 1, vl_hsync_len: 96, vl_left_margin: 48, vl_right_margin:16, vl_vsync_len: 2, vl_upper_margin:31, vl_lower_margin:12, mmio: AT91SAM9261_LCDC_BASE, }; === SAM9263 === * 修改LCD时序参数: u-boot-2008.10\board\atmel\at91sam9263ek\at91sam9263ek.c:\\ vidinfo_t panel_info = { vl_col: 240, vl_row: 320, vl_clk: 4965000, vl_sync: ATMEL_LCDC_INVLINE_INVERTED | ATMEL_LCDC_INVFRAME_INVERTED, vl_bpix: 3, vl_tft: 1, vl_hsync_len: 5, vl_left_margin: 1, vl_right_margin:33, vl_vsync_len: 1, vl_upper_margin:1, vl_lower_margin:0, mmio: AT91SAM9263_LCDC_BASE, }; 修改为: vidinfo_t panel_info = { vl_col: 240, vl_row: 320, vl_clk: 4965000, vl_sync: ATMEL_LCDC_INVLINE_INVERTED | ATMEL_LCDC_INVFRAME_INVERTED, vl_bpix: 3, vl_tft: 1, vl_hsync_len: 96, vl_left_margin: 48, vl_right_margin:16, vl_vsync_len: 2, vl_upper_margin:31, vl_lower_margin:12, mmio: AT91SAM9263_LCDC_BASE, }; * 时钟频率 u-boot-2008.10\include\configs\at91sam9263ek.h:\\ 从16MHz /* ARM asynchronous clock */ #define AT91_CPU_NAME "AT91SAM9263" #define AT91_MAIN_CLOCK 199919000 /* from 16.367 MHz crystal */ #define AT91_MASTER_CLOCK 99959500 /* peripheral = main / 2 */ #define CFG_HZ 1000000 /* 1us resolution */ #define AT91_SLOW_CLOCK 32768 /* slow clock */ 修改为18MHz: /* ARM asynchronous clock */ #define AT91_CPU_NAME "AT91SAM9263" #define AT91_MAIN_CLOCK (198656000) /* from 18.432 MHz crystal */ #define AT91_MASTER_CLOCK (198656000/2) /* peripheral = main / 2 */ #define CFG_HZ 1000000 /* 1us resolution */ #define AT91_SLOW_CLOCK 32768 /* slow clock */ ==== 编译U-boot ==== 在编译前运行下面命令:\\ # make distclean 清除以前所有编译结果。 === SAM9261 === # make at91sam9261ek_config # make === SAM9263 === # make at91sam9263ek_config # make ==== 编译输出 ==== * u-boot-2008.10/u-boot u-boot编译输出的ELF文件,可以用于调试。 * u-boot-2008.10/u-boot.bin u-boot.bin就是u-boot的烧写文件,按照分区表(:!:必须与Bootstrap的一致),将其烧写,并由Bootstrap加载。\\ :!:更改配置编译后需要注意u-boot.bin的大小,保证Bootstrap会将全部的u-boot.bin复制到SDRAM并运行。 * u-boot-2008.10/tools/mkimage 用于将Linux kernel编译输出的zImage转换为U-boot所支持的uImage。\\ 将此文件安装到Linux PC,如将此文件复制到/usr/local/sbin,并将/usr/local/sbin添加到系统路径(一般Ubuntu默认系统路径就包含/usr/local/sbin,可以使用echo $PATH检查)。\\ [[http://blog.ednchina.com/yujiebaomei/55702/message.aspx | mkimage使用详解]] ==== U-boot环境变量 ==== U-Boot通过环境变量(env)为用户提供一定程度的可配置性,这些环境变量包括串口终端所使用的波特率(baudrate)、启动操作系统内核的参数(bootargs)、本地IP地址(ipaddr)、网卡MAC地址(ethaddr)等等.\\ 环境变量可以固化到非易失性存储介质中,使用printenv / saveenv命令来查看和修改。\\ ===== Kernel ===== 现在的Linux Kernel源码包很大,包含了各种体系架构,板级支持包,设备驱动。\\ 编译Kernel源代码需要一些必要的基础支持,推荐大家google。\\ 下面的描述以[[http://www.kernel.org | Linux-2.6.27]]为例。 ==== 下载Kernel源代码 ==== * [[http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2 | linux-2.6.27.tar.bz2]] * [[http://maxim.org.za/AT91RM9200/2.6/2.6.27-at91.patch.gz | 2.6.27-at91.patch.gz]] * [[ftp://www.at91.com/pub/linux/2.6.27-at91/2.6.27-at91-exp.3.patch.gz | 2.6.27-at91-exp.3.patch.gz]] 展开内核源码包:\\ # tar jxvf linux-2.6.27.tar.bz2 将两个补钉文件直接复制到展开的内核源代码目录下,并在内核目录下运行系列命令按顺序打补钉:\\ # zcat 2.6.27-at91.patch.gz | patch -p1 # zcat 2.6.27-at91-exp.3.patch.gz | patch -p1 ==== 修改Kernel源代码 ==== === SAM9261 === * 修改NAND分区 linux-2.6.27\arch\arm\mach-at91\board-sam9261ek.c:\\ /* * NAND flash */ static struct mtd_partition __initdata ek_nand_partition[] = { { .name = "Bootstrap", .offset = 0, .size = SZ_4M, }, { .name = "Partition 1", .offset = MTDPART_OFS_NXTBLK, .size = 60 * SZ_1M, }, { .name = "Partition 2", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, }; 本站的板子将128MB NAND平均分为两个分区,分区0作为rootfs,分区1未使用:\\ :!:如果分区不同,在使用本站的一些例子时会出现VFS mount fail错误。\\ /* * NAND flash */ static struct mtd_partition __initdata ek_nand_partition[] = { { .name = "Partition 1", .offset = 0, .size = 64 * SZ_1M, }, { .name = "Partition 2", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, }; * 修改LCD时序 linux-2.6.27\arch\arm\mach-at91\board-sam9261ek.c:\\ /* TFT */ static struct fb_videomode at91_tft_vga_modes[] = { { .name = "TX09D50VM1CCA @ 60", .refresh = 60, .xres = 240, .yres = 320, .pixclock = KHZ2PICOS(4965), .left_margin = 1, .right_margin = 33, .upper_margin = 1, .lower_margin = 0, .hsync_len = 5, .vsync_len = 1, .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, } }; 修改为本站的竖屏时序:\\ /* TFT */ static struct fb_videomode at91_tft_vga_modes[] = { { .name = "TX09D50VM1CCA @ 60", .refresh = 60, .xres = 240, .yres = 320, .pixclock = KHZ2PICOS(4965), .left_margin = 48, .right_margin = 16, .upper_margin = 31, .lower_margin = 12, .hsync_len = 96, .vsync_len = 2, .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, } }; * 添加ttyS* linux-2.6.27\arch\arm\mach-at91\board-sam9261ek.c:\\ static void __init ek_map_io(void) { /* Initialize processor: 18.432 MHz crystal */ at91sam9261_initialize(18432000); /* Setup the LEDs */ at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14); /* DGBU on ttyS0. (Rx & Tx only) */ at91_register_uart(0, 0, 0); /* set serial console to ttyS0 (ie, DBGU) */ at91_set_serial_console(0); } 注册USART0到ttyS1, USART1到ttyS2:\\ static void __init ek_map_io(void) { /* Initialize processor: 18.432 MHz crystal */ at91sam9261_initialize(18432000); /* Setup the LEDs */ at91_init_leds(AT91_PIN_PA13, AT91_PIN_PA14); /* DGBU on ttyS0. (Rx & Tx only) */ at91_register_uart(0, 0, 0); /* USART0 on ttyS1. (Rx & Tx only) */ at91_register_uart(AT91SAM9261_ID_US0, 1, 0); /* USART1 on ttyS2. (Rx & Tx only) */ at91_register_uart(AT91SAM9261_ID_US1, 2, 0); /* set serial console to ttyS0 (ie, DBGU) */ at91_set_serial_console(0); } :!:USART2的TXD与RXD所在引脚被NAND占用,因此不可使用。\\ 添加后Linux启动时的信息提示:\\ atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIAL atmel_usart.1: ttyS1 at MMIO 0xfffb0000 (irq = 6) is a ATMEL_SERIAL atmel_usart.2: ttyS2 at MMIO 0xfffb4000 (irq = 7) is a ATMEL_SERIAL === SAM9263 === * 修改分区 对于data flash启动方式,修改为两个分区:\\ :!:如果分区不同,在使用本站的一些例子时会出现VFS mount fail错误。\\ linux-2.6.27\arch\arm\mach-at91\board-sam9263ek.c:\\ /* * NAND flash */ static struct mtd_partition __initdata ek_nand_partition[] = { { .name = "Bootstrap", .offset = 0, .size = SZ_4M, }, { .name = "Partition 1", .offset = MTDPART_OFS_NXTBLK, .size = 60 * SZ_1M, }, { .name = "Partition 2", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, }; 修改为: /* * NAND flash */ static struct mtd_partition __initdata ek_nand_partition[] = { { .name = "Partition 1", .offset = 0, .size = 64 * SZ_1M, }, { .name = "Partition 2", .offset = MTDPART_OFS_NXTBLK, .size = MTDPART_SIZ_FULL, }, }; * 修改LCD时序 linux-2.6.27\arch\arm\mach-at91\board-sam9263ek.c:\\ /* * LCD Controller */ #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) static struct fb_videomode at91_tft_vga_modes[] = { { .name = "TX09D50VM1CCA @ 60", .refresh = 60, .xres = 240, .yres = 320, .pixclock = KHZ2PICOS(4965), .left_margin = 1, .right_margin = 33, .upper_margin = 1, .lower_margin = 0, .hsync_len = 5, .vsync_len = 1, .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, }, }; 修改为: /* * LCD Controller */ #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) static struct fb_videomode at91_tft_vga_modes[] = { { .name = "TX09D50VM1CCA @ 60", .refresh = 60, .xres = 240, .yres = 320, .pixclock = KHZ2PICOS(4965), .left_margin = 48, .right_margin = 16, .upper_margin = 31, .lower_margin = 12, .hsync_len = 96, .vsync_len = 2, .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, .vmode = FB_VMODE_NONINTERLACED, }, }; * 修改时钟频率 linux-2.6.27\arch\arm\mach-at91\board-sam9263ek.c:\\ 从16MHz static void __init ek_map_io(void) { /* Initialize processor: 16.367 MHz crystal */ at91sam9263_initialize(16367660); /* DGBU on ttyS0. (Rx & Tx only) */ at91_register_uart(0, 0, 0); /* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */ at91_register_uart(AT91SAM9263_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS); /* set serial console to ttyS0 (ie, DBGU) */ at91_set_serial_console(0); } 修改为18MHz: static void __init ek_map_io(void) { /* Initialize processor: 16.367 MHz crystal */ at91sam9263_initialize(18432000); // 16367660 /* DGBU on ttyS0. (Rx & Tx only) */ at91_register_uart(0, 0, 0); /* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */ at91_register_uart(AT91SAM9263_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS); /* set serial console to ttyS0 (ie, DBGU) */ at91_set_serial_console(0); } ==== 配置Kernel源代码 ==== [[http://blog.csdn.net/scs2000/archive/2006/09/12/1212376.aspx |Linux内核配置选项详解]] === SAM9261 === [[ftp://www.linux4sam.com/pub/linux/2.6.27-at91/at91sam9261ek_defconfig | at91sam9261ek_defconfig]]供参考 下载[[ftp://www.linux4sam.com/pub/linux/2.6.27-at91/at91sam9261ek_defconfig | at91sam9261ek_defconfig]],并将其复制到内核源代码根目录下并改名为.config,覆盖原来的配置文件。\\ :!:下载保存时注意文件类型,该文件时一个Linux文本文件(LF),而不是DOS格式文本文件(CRLF)。\\ # cp at91sam9261ek_defconfig .config 运行kernel配置工具,比如make config(最基本的界面), make menuconfig(基于 ncurses 的界面), make gconfig(基于 gtk+ 的图形界面), make xconfig(基于 qt 的图形界面)。:!:注意,各种图形界面依赖于开发机(Linux PC)上所安装的图形库,如果图形库不全,将不能启动。\\ 在命令行启动配置时,不要忘记加上ARCH类型。比如: make xconfig ARCH=arm 通过图形界面配置比较方便,可以根据需要对内核的部分进行调整: * :!:使用touchscreen需要使能SPI,不选MMC/SD支持 * :!:使用SD需要不选SPI,选择MMC/SD 配置完成,保存退出。运行下面命令编译内核,工具链使用arm-none-linux-gnueabi-:\\ # make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 视Linux PC的配置不同,完成编译的时间也不同。\\ === SAM9263 === [[ftp://www.linux4sam.com/pub/linux/2.6.27-at91/at91sam9263ek_defconfig |at91sam9263ek_defconfig]]供参考 ==== 使用kernel image ==== 内核编译完成后会在 linux-2.6.27/arch/arm/boot 下生成zImage,这个就是Linux Kernel编译的输出文件。\\ 下面需要使用编译U-boot生成mkimage将zImage转换为uImage:\\ # mkimage -A arm -O linux -T kernel -C none -a 0x20008000 -e 0x20008000 -n 'Linux-2.6.27' -d ./zImage ./uImage27.bin 运行该命令即可生成U-boot可以加载的烧写文件。将uImage27.bin烧写到分区指定地址,通过设置U-boot下的环境变量加载。\\ ===== Rootfs ===== [[http://www.busybox.net/ | busybox 源代码下载]] \\ [[http://www.mcuzone.com/bbs/dispbbs.asp?boardID=7&ID=5946&page=1 | 926x开发板文档——使用busybox制作根文件系统]] ===== 开发资料 ===== ==== LCD 时序 ==== ^LCD类型^LCD尺寸^xres^yres^pixclock^left_margin^right_margin^upper_margin^lower_margin^hsync_len^vsync_len^ |[[http://www.mcuzone.com:8080/shop/index.php?gOo=goods_details.dwt&goodsid=163&productname= | QVGA(240x320)]] | 3.5"竖 | 240 | 320 | 4965KHz | 48 | 16 | 12 | 31 | 96 | 2 | |[[http://www.mcuzone.com/shop/?product-336.html | QVGA(320x240)]] | 3.5"横 | 320 | 240 | 6500KHz | 20 | 38 | 4 | 15 | 30 | 3 | | [[http://www.mcuzone.com:8080/shop/index.php?gOo=goods_details.dwt&goodsid=269&productname= | 480x272 ]] | 4.3"宽 | 480 | 272 | 9000KHz | 2 | 2 | 2 | 2 | 41 | 10| | VGA(640x480) | 5.6"横 | 640 | 480 | 25175KHz| 19 | 45 | 12 | 31 | 96 | 2 | | [[http://www.mcuzone.com:8080/shop/index.php?gOo=goods_details.dwt&goodsid=268&productname= | WVGA(800x480)]] | 5.0"横 | 800| 480 | 33000KHz| 40 | 40 | 29 | 13 | 48 | 3 | | SVGA(800x600) | 10"横 | 800 | 600 | 40000KHz| 220 | 36 | 12 | 22 | 10 | 1 | | 1024x600p60 | 7.0"横 | 1024 | 600 | 51200KHz| 140 | 160 | 20 | 12 | 20 | 3 | | 1024x600p52 | 7.0"横 | 1024 | 600 | 44400KHz| 140 | 160 | 20 | 12 | 20 | 3 | ===== 相关链接 ===== * [[http://www.mcuzone.com/bbs/dispbbs.asp?boardID=7&ID=7503&page=1|在Windows PC上建立Linux开发环境(ubuntu, VirtualBox)]] * [[http://www.at91.com/linux4sam/bin/view/Linux4SAM/ | 带有官方性质的SAM9 Linux专业网站]] * [[http://cid-d0e1c6b9c2f199d4.skydrive.live.com/self.aspx/Pub/Ubuntu.v8.10.on.VPC.pdf | ubuntu 8.10 on VirtualPC]] * [[http://www.oldlinux.org/download/CommentedLinuxKernel/clk011c.zip | Linux代码完全注释(赵炯)]] * [[http://www.defcon1.org/html/Software_Articles/Learning-CHMOD/Kernel-Problems/Bootup/tar-how-to.html | tar how to ]] * [[http://blog.csdn.net/bobshute/archive/2009/04/02/4044728.aspx | tar用法实例]] * [[ftp://mcuzone:mcuzone@www.mcuzone.com/download/ARM_Linux/ | 本站FTP上的SAM926x Linux资源(地址: ftp://www.mcuzone.com 用户名: mcuzone 密码: mcuzone 端口: 21)]] * [[http://book.opensourceproject.org.cn/embedded/oreillybuildembed/opensource/belinuxsys-chp-9-sect-5.html | U-boot usage]] * [[http://www.mcuzone.com/bbs/dispbbs.asp?boardID=7&ID=5771&page=1 | 为9263编译Linux ]] * [[http://220.189.255.38:8080/dokuwiki/doku.php/product:man_list | MCUzone提供的原创Application Note]] * [[http://www.ibm.com/developerworks/cn/linux/l-serials/index.html| Linux 下串口编程入门]] * [[http://www.faqs.org/docs/Linux-HOWTO/Serial-Programming-HOWTO.html | Serial Programming HOWTO, 经典的Linux下串口编程教程]] ===== 参考书籍 ===== * [[ http://book.csdn.net/bookfiles/130/1001304407.shtml|嵌入式Linux系统开发技术详解--基于ARM]] * [[http://book.csdn.net/bookfiles/132/1001324451.shtml |嵌入式Linux应用程序开发详解]] * [[ http://product.dangdang.com/product.aspx?product_id=20294821| 嵌入式Linux应用开发完全手册]]