AT91SAM926x开发全流程

来源:互联网 发布:美工的职业规划 编辑:程序博客网 时间:2024/04/28 19:17
linuxflash编译器asynchronouswindowsstruct

目录(?)[+]

http://www.mcuzone.com:8080/dokuwiki/doku.php?id=product:sam9_linux#lcd_%E6%97%B6%E5%BA%8F

本页内容发表于MCUZone。

如果你对本页的技术内容有疑问,请到 MCUZone技术论坛 发帖。
如果你认为本页的内容侵害了你的权益,请与hotislandn@hotmail.com;hdapple_2000@hotmail.com 联系,我们会在确认后移除。

MCUZone旗下网站:
http://www.mcuzone.com—MCUZone是微控电子主力站点。
微控电子论坛—微控电子的技术/售后服务论坛。
http://www.atarm.com—ATARM为微控电子的第二品牌,主要进行ATARM的推广和芯片以及周边产品的销售。

SAM926x Linux HowTo

本文的目的在于帮助AT91SAM926x(以下简称为SAM926x)的软件开发工程师从零开始,为SAM926x建立Linux运行环境。
在进行SAM926x Linux开发之前,需要建立开发环境。
本文的行文不拘泥于一种形式,变化颇多,请谅解。
本文的部分内容来源于网络。
本文不会补充Linux的基本应用知识,请自行google。
本文涉及到的源码包都将收录于本站的 开发板配套光盘。

SAM926x Linux的基本组成:

  • Bootstrap
  • U-boot
  • Kernel
  • Rootfs

Bootstrap可以在Windows PC上编译,其余的在Linux PC上编译。
各部分组成如下图:

基础知识

  • AT91SAM926x是什么?

如果你还没有搞懂这个问题,请不要继续往下看。请先参观一下 本站论坛。

  • 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的源代码?

kernel source
linux4sam kernel patch

  • 什么是GPL?

通用性公开许可证(General Public License,简称GPL)。GPL同其它的自由软件许可证一样,许可社会公众享有运行、复制软件的自由;发行传播软件的自由;获得软件源码的自由,以及改进软件并将自己作出的改进版本向社会发行传播的自由。GPL还规定,只要这种修改文本的整体或者其某个部分来源于遵循GPL的程序,则该修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己做出的限制。因此,遵循GPL流通的程序不能同非自由的软件合并。GPL所表达的这种流通规则称为copyleft,表示与copyright(版权)的概念“相左”。

  • 哪里有GPL的许可证文本?

一般遵循GPL的软件都会在软件包内包含GPL许可证文本。
也可以到下面网站查看 GNU General Public License。

开发环境

开发Linux应用,需要:

  • 一台Linux PC(可以是虚拟机,以下简称为Linux开发机)

可以安装主流的Linux发行版本,比如 ubuntu,Fedora等等。 
:!:标准的发行版本可能并没有包括所有开发中需要的组件。开发过程中可以根据需要通过网络安装。
如果采用虚拟机方式,可以选择虚拟机软件如 Virtual PC,VMware, VirtualBox等。安装完成后需要”打通”虚拟机与宿主机的共享通道,可以使用Linux的samba或者使用虚拟软件提供的第三方工具。
:!:使用虚拟机,请保证虚拟机硬盘足够大。可以使用8GB硬盘作为第一硬盘,安装系统;而另外再虚拟一块硬盘,用于编译和工作。

  • 可用的网络

基于两个原因:
1. 开发初期使用NFS会比较方便。
2. Linux开发机安装组件。

  • 开发机上所需要的基本程序开发工具

比如gcc( GCC-HOWTO)等。

  • 目标板所用的交叉编译器

所谓交叉编译器,就是指在开发机上运行,编译结果在另外架构的平台上运行。
这里的交叉编译器指的就是ARM交叉编译器。编译器在Linux x86上将源代码编译成ARM体系结构适用的可执行文件。
Linux下可以使用的ARM交叉编译器很多,经过测试,本站推荐使用arm-none-linux-gnueabi,在下载页面选择GNU/Linux对应的软件包。
下载后在Linux开发机上解压缩,并将工具链bin文件夹(arm-none-linux-gnueabi-gcc所在文件夹)添加到系统PATH,即可完成安装。

  • 目标烧写(编程)工具

有了编译的输出,还需要编程工具将其固化到SAM926x的板子上运行。这个过程就是编程的过程。
由于SAM926x提供了SAM-BA工具,所以最基本的方式就是通过USB口利用SAM-BA软件下载。 SAM-BA软件使用教程。
如果对编程速度有高的要求,可以选择第三方编程器。

  • 硬件仿真器

可以用于对bootstrap与u-boot进行调试,方便定位可能的问题。
Linux下可以使用软件的方法debug,比如打log,或者使用 GDB。

SAM926x Linux 基础

启动过程

本文主要讲述从Data Flash上启动的过程,NAND flash启动,NOR Flash启动请参考相关文档。

  1. 处理器复位,根据BMS引脚的设置,选择从内部ROM启动(NOR Flash启动方式不在本文的讨论范围)。
  2. ROM中的代码开始运行,初始化处理器和必要的外设,比如DBGU,USB device port。然后开始从Data Flash或NAND的0地址检索合法(:?:具体参考数据手册的boot program的章节)的启动程序,也就是Bootstrap。
  3. 如果合理的Bootstrap存在,ROMBOOT将其复制到内部SRAM并跳转到Bootstrap运行。如果没有,检测其它支持启动的存储介质,如果都没有,则等待DBGU或者USB口的连接,这部分内容请参考SAM-BA手册。
  4. Bootstrap将初始化一些设备,主要是Data Flash或NAND与SDRAM,然后从Data Flash或NAND的特定位置(在Bootstrap源代码中指定)将U-boot复制到SDRAM的指定位置,然后跳转到U-boot开始位置运行。
  5. U-boot根据环境变量(bootcmd)加载Linux Kernel的image。加载完成后跳转到Kernel运行,并传递启动参数(bootargs)。
  6. Linux Kernel开始运行,加载相关驱动,并加载rootfs。其中的细节,可以参考Linux书籍。

Data Flash Boot Mem Map

  • :!: Internal Flash 在sam926x上是ROM
  • :!: Data Flash的分区在u-boot下指定,上图显示的是新分区,和现在的例子不同
  • :!: NAND FLASH(128MB)平均分为两个分区,分区0作为rootfs(JFFS2格式),分区1由用户定义

NAND Flash Boot Mem Map

  • 图中所示为页面大小为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代码

ATMEL bootstrap源代码
下载后展开压缩包。

Bootstrap源代码结构

Bootstrap源代码由共用的硬件驱动,比如SDRAM,NAND,DATA Flash等,库文件,头文件等组成。
新的Bootstrap代码中包含了一个PDF格式的说明文件,包含在doc文件夹下。
主要的地方在board文件夹下,也就是不同板子的项目所在。根据板子的启动配置不同,同一个板子的文件夹下有不同的目标配置,比如dataflash与nandflash。进入不同的目标配置文件就可以看到该目标配置的配置文件(*.h)及Makefile。

Bootstrap目标配置文件

以SAM9261 Data flash bootstrap为例说明配置文件的作用:
Bootstrap-v1.11\board\at91sam9261ek\dataflash\at91sam9261ek.h:

<span class="co2">#ifndef _AT91SAM9261EK_H</span><span class="co2">#define _AT91SAM9261EK_H</span> <span class="coMULTI">/* ******************************************************************* */</span><span class="coMULTI">/* PMC Settings                                                        */</span><span class="coMULTI">/*                                                                     */</span><span class="coMULTI">/* The main oscillator is enabled as soon as possible in the c_startup */</span><span class="coMULTI">/* and MCK is switched on the main oscillator.                         */</span><span class="coMULTI">/* PLL initialization is done later in the hw_init() function          */</span><span class="coMULTI">/* ******************************************************************* */</span><span class="co2">#defineMCK_100</span> <span class="co2">#ifdef MCK_100</span> <span class="co2">#define MASTER_CLOCK(198656000/2)</span><span class="co2">#define PLL_LOCK_TIMEOUT1000000</span> <span class="co2">#define PLLA_SETTINGS0x2060BF09</span><span class="co2">#define PLLB_SETTINGS0x10483F0E</span> <span class="coMULTI">/* AC characteristics */</span><span class="coMULTI">/* DLYBS = tCSS= 250ns min and DLYBCT = tCSH = 250ns */</span><span class="co2">#define DATAFLASH_TCSS(0x1a << 16)/* 250ns min (tCSS) <=> 12/48000000 = 250ns */</span><span class="co2">#define DATAFLASH_TCHS(0x1 << 24)/* 250ns min (tCSH) <=> (64*1+SCBR)/(2*48000000) */</span> <span class="co2">#else/* 133 MHz */</span> <span class="co2">#define MASTER_CLOCK(250000000/2)</span><span class="co2">#define PLL_LOCK_TIMEOUT1000000</span> <span class="co2">#define PLLA_SETTINGS0x20D8BF10</span><span class="co2">#define PLLB_SETTINGS0x10483F0E</span><span class="coMULTI">/*#define MASTER_CLOCK(266000000/2)#define PLL_LOCK_TIMEOUT1000000 #define PLLA_SETTINGS0x2064BF07#define PLLB_SETTINGS0x10483F0E*/</span><span class="co2">#define DATAFLASH_TCSS(0xf << 16)/* 250ns min (tCSS) <=> 12/48000000 = 250ns */</span><span class="co2">#define DATAFLASH_TCHS(0x2 << 24)/* 250ns min (tCSH) <=> (64*1+SCBR)/(2*48000000) */</span> <span class="co2">#endif</span> <span class="coMULTI">/* Switch MCK on PLLA output PCK = PLLA = 2 * MCK */</span><span class="co2">#define MCKR_SETTINGS(AT91C_PMC_PRES_CLK | AT91C_PMC_MDIV_2)</span><span class="co2">#define MCKR_CSS_SETTINGS(AT91C_PMC_CSS_PLLA_CLK | MCKR_SETTINGS)</span> <span class="coMULTI">/* ******************************************************************* */</span><span class="coMULTI">/* DataFlash Settings                                                  */</span><span class="coMULTI">/*                                                                     */</span><span class="coMULTI">/* ******************************************************************* */</span><span class="co2">#define AT91C_BASE_SPIAT91C_BASE_SPI0</span><span class="co2">#define AT91C_ID_SPIAT91C_ID_SPI0</span> <span class="coMULTI">/* SPI CLOCK */</span><span class="co2">#define AT91C_SPI_CLK 33000000</span> <span class="co2">#define DF_CS_SETTINGS (AT91C_SPI_NCPHA | (AT91C_SPI_DLYBS & DATAFLASH_TCSS) | (AT91C_SPI_DLYBCT & DATAFLASH_TCHS) | ((MASTER_CLOCK / AT91C_SPI_CLK) << 8))</span> <span class="coMULTI">/* ******************************************************************* */</span><span class="coMULTI">/* BootStrap Settings                                                  */</span><span class="coMULTI">/*                                                                     */</span><span class="coMULTI">/* ******************************************************************* */</span><span class="co2">#define AT91C_SPI_PCS_DATAFLASHAT91C_SPI_PCS0_DATAFLASH/* Boot on SPI NCS0 */</span> <span class="co2">#define IMG_ADDRESS 0x8400/* Image Address in DataFlash */</span><span class="co2">#defineIMG_SIZE0x33900/* Image Size in DataFlash    */</span> <span class="co2">#define MACH_TYPE       0x350       /* AT91SAM9261-EK */</span><span class="co2">#define JUMP_ADDR0x23F00000/* Final Jump Address       */</span> <span class="coMULTI">/* ******************************************************************* */</span><span class="coMULTI">/* Application Settings                                                */</span><span class="coMULTI">/* ******************************************************************* */</span><span class="co2">#undef CFG_DEBUG</span><span class="co2">#define CFG_DATAFLASH</span><span class="co2">#define CFG_HW_INIT</span><span class="co2">#define CFG_SDRAM</span> <span class="co2">#endif/* _AT91SAM9261EK_H */</span>
  • 根据data flash配置,设置时序及data flash片选
  • 设置被加载的代码(u-boot, for Linux)的加载源地址(data flash中),及加载目标地址(SDRAM中),以及代码加载长度

:!:加载的起始地址必须与分区表一致,代码长度也必须适合编译输出的u-boot。

  • 定义为Dataflash启动,不使用DEBUG的输出

下载Windows下的编译器arm-elf-gcc

WinARM:The gnu-toolchain and several tools and samples for ARM controller/processors for MS-Windows-Platforms
GNU ARM™ toolchain for CygWin, Linux and MacOS
YAGARTO GNU ARM toolchain
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:

<span class="co2">#define    CRYSTAL_16_36766MHZ1</span>

修改为

<span class="co2">#define    CRYSTAL_18_432MHZ    1</span>

修改代码后使用make即可编译生成板子适用的data flash bootstrap的代码。

Bootstrap for SAM9263 Nand

:!:由于官方默认时钟频率为16MHz,而板子上使用的是18MHz,因此需要修改源代码:Bootstrap-v1.11\board\at91sam9263ek\nandflash\at91sam9263ek.h:

<span class="co2">#define    CRYSTAL_16_36766MHZ1</span>

修改为

<span class="co2">#define    CRYSTAL_18_432MHZ    1</span>

修改代码后使用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能极大提高程序开发效率:

  1. U-boot可以在开发初期测试大部分外设
  2. U-boot可以使用网络,USB等方式加载kernel image,不需要每次都烧写,既节省时间,又避免flalsh/NAND的损坏
  3. 丰富的FLASH/NAND编程功能的支持,可以用于代码的烧写

下载U-boot源代码

  • U-boot源代码

该页面提供了一个FTP链接,直接从其FTP下载。
本文使用的U-boot版本为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的支持等。修改头文件就可以改变板子的配置。

  • 读9261的U-boot代码获得的函数调用关系
  • 使用AXD在9261上调试u-boot

更改U-boot源代码

  1. 修改Makefile以指定工具链

u-boot-2008.10/Makefile:
默认使用arm-linux-工具链:

ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-endif

修改为上面安装的arm-none-linux-gnueabi-工具链:

ifeq ($(ARCH),arm)CROSS_COMPILE = arm-none-linux-gnueabi-endif
  1. 针对本站的SAM926x开发板,必须修改源代码的一些相关配置部分,比如时钟频率(SAM9263),LCD时序参数(SAM9261,SAM9263)。

SAM9261

需要修改LCD时序参数,以适合本站的竖屏。
u-boot-2008.10\board\atmel\at91sam9261ek\at91sam9261ek.c:修改结构体:

vidinfo_t panel_info <span class="sy0">=</span> <span class="br0">{</span>vl_col<span class="sy0">:</span><span class="nu0">240</span><span class="sy0">,</span>vl_row<span class="sy0">:</span><span class="nu0">320</span><span class="sy0">,</span>vl_clk<span class="sy0">:</span><span class="nu0">4965000</span><span class="sy0">,</span>vl_sync<span class="sy0">:</span>ATMEL_LCDC_INVLINE_INVERTED <span class="sy0">|</span>ATMEL_LCDC_INVFRAME_INVERTED<span class="sy0">,</span>vl_bpix<span class="sy0">:</span><span class="nu0">3</span><span class="sy0">,</span>vl_tft<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_hsync_len<span class="sy0">:</span><span class="nu0">5</span><span class="sy0">,</span>vl_left_margin<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_right_margin<span class="sy0">:</span><span class="nu0">33</span><span class="sy0">,</span>vl_vsync_len<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_upper_margin<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_lower_margin<span class="sy0">:</span><span class="nu0">0</span><span class="sy0">,</span>mmio<span class="sy0">:</span>AT91SAM9261_LCDC_BASE<span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

vidinfo_t panel_info <span class="sy0">=</span> <span class="br0">{</span>vl_col<span class="sy0">:</span><span class="nu0">240</span><span class="sy0">,</span>vl_row<span class="sy0">:</span><span class="nu0">320</span><span class="sy0">,</span>vl_clk<span class="sy0">:</span><span class="nu0">4965000</span><span class="sy0">,</span>vl_sync<span class="sy0">:</span>ATMEL_LCDC_INVLINE_INVERTED <span class="sy0">|</span>ATMEL_LCDC_INVFRAME_INVERTED<span class="sy0">,</span>vl_bpix<span class="sy0">:</span><span class="nu0">3</span><span class="sy0">,</span>vl_tft<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_hsync_len<span class="sy0">:</span><span class="nu0">96</span><span class="sy0">,</span>vl_left_margin<span class="sy0">:</span><span class="nu0">48</span><span class="sy0">,</span>vl_right_margin<span class="sy0">:</span><span class="nu0">16</span><span class="sy0">,</span>vl_vsync_len<span class="sy0">:</span><span class="nu0">2</span><span class="sy0">,</span>vl_upper_margin<span class="sy0">:</span><span class="nu0">31</span><span class="sy0">,</span>vl_lower_margin<span class="sy0">:</span><span class="nu0">12</span><span class="sy0">,</span>mmio<span class="sy0">:</span>AT91SAM9261_LCDC_BASE<span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

SAM9263

  • 修改LCD时序参数:

u-boot-2008.10\board\atmel\at91sam9263ek\at91sam9263ek.c:

vidinfo_t panel_info <span class="sy0">=</span> <span class="br0">{</span>vl_col<span class="sy0">:</span><span class="nu0">240</span><span class="sy0">,</span>vl_row<span class="sy0">:</span><span class="nu0">320</span><span class="sy0">,</span>vl_clk<span class="sy0">:</span><span class="nu0">4965000</span><span class="sy0">,</span>vl_sync<span class="sy0">:</span>ATMEL_LCDC_INVLINE_INVERTED <span class="sy0">|</span>ATMEL_LCDC_INVFRAME_INVERTED<span class="sy0">,</span>vl_bpix<span class="sy0">:</span><span class="nu0">3</span><span class="sy0">,</span>vl_tft<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_hsync_len<span class="sy0">:</span><span class="nu0">5</span><span class="sy0">,</span>vl_left_margin<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_right_margin<span class="sy0">:</span><span class="nu0">33</span><span class="sy0">,</span>vl_vsync_len<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_upper_margin<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_lower_margin<span class="sy0">:</span><span class="nu0">0</span><span class="sy0">,</span>mmio<span class="sy0">:</span>AT91SAM9263_LCDC_BASE<span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

修改为:

vidinfo_t panel_info <span class="sy0">=</span> <span class="br0">{</span>vl_col<span class="sy0">:</span><span class="nu0">240</span><span class="sy0">,</span>vl_row<span class="sy0">:</span><span class="nu0">320</span><span class="sy0">,</span>vl_clk<span class="sy0">:</span><span class="nu0">4965000</span><span class="sy0">,</span>vl_sync<span class="sy0">:</span>ATMEL_LCDC_INVLINE_INVERTED <span class="sy0">|</span>ATMEL_LCDC_INVFRAME_INVERTED<span class="sy0">,</span>vl_bpix<span class="sy0">:</span><span class="nu0">3</span><span class="sy0">,</span>vl_tft<span class="sy0">:</span><span class="nu0">1</span><span class="sy0">,</span>vl_hsync_len<span class="sy0">:</span><span class="nu0">96</span><span class="sy0">,</span>vl_left_margin<span class="sy0">:</span><span class="nu0">48</span><span class="sy0">,</span>vl_right_margin<span class="sy0">:</span><span class="nu0">16</span><span class="sy0">,</span>vl_vsync_len<span class="sy0">:</span><span class="nu0">2</span><span class="sy0">,</span>vl_upper_margin<span class="sy0">:</span><span class="nu0">31</span><span class="sy0">,</span>vl_lower_margin<span class="sy0">:</span><span class="nu0">12</span><span class="sy0">,</span>mmio<span class="sy0">:</span>AT91SAM9263_LCDC_BASE<span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>
  • 时钟频率

u-boot-2008.10\include\configs\at91sam9263ek.h:
从16MHz

<span class="coMULTI">/* ARM asynchronous clock */</span><span class="co2">#define AT91_CPU_NAME"AT91SAM9263"</span><span class="co2">#define AT91_MAIN_CLOCK199919000/* from 16.367 MHz crystal */</span><span class="co2">#define AT91_MASTER_CLOCK99959500/* peripheral = main / 2 */</span><span class="co2">#define CFG_HZ1000000/* 1us resolution */</span> <span class="co2">#define AT91_SLOW_CLOCK32768/* slow clock */</span>

修改为18MHz:

<span class="coMULTI">/* ARM asynchronous clock */</span><span class="co2">#define AT91_CPU_NAME"AT91SAM9263"</span><span class="co2">#define AT91_MAIN_CLOCK(198656000)/* from 18.432 MHz crystal */</span><span class="co2">#define AT91_MASTER_CLOCK(198656000/2)/* peripheral = main / 2 */</span><span class="co2">#define CFG_HZ1000000/* 1us resolution */</span> <span class="co2">#define AT91_SLOW_CLOCK32768/* slow clock */</span>

编译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检查)。
mkimage使用详解

U-boot环境变量

U-Boot通过环境变量(env)为用户提供一定程度的可配置性,这些环境变量包括串口终端所使用的波特率(baudrate)、启动操作系统内核的参数(bootargs)、本地IP地址(ipaddr)、网卡MAC地址(ethaddr)等等.
环境变量可以固化到非易失性存储介质中,使用printenv / saveenv命令来查看和修改。

Kernel

现在的Linux Kernel源码包很大,包含了各种体系架构,板级支持包,设备驱动。
编译Kernel源代码需要一些必要的基础支持,推荐大家google。
下面的描述以 Linux-2.6.27为例。

下载Kernel源代码

  • linux-2.6.27.tar.bz2
  • 2.6.27-at91.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:

<span class="coMULTI">/* * NAND flash */</span><span class="kw4">static</span> <span class="kw4">struct</span> mtd_partition __initdata ek_nand_partition<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Bootstrap"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> SZ_4M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 1"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> <span class="nu0">60</span> <span class="sy0">*</span> SZ_1M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 2"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> MTDPART_SIZ_FULL<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

本站的板子将128MB NAND平均分为两个分区,分区0作为rootfs,分区1未使用:
:!:如果分区不同,在使用本站的一些例子时会出现VFS mount fail错误。

<span class="coMULTI">/* * NAND flash */</span><span class="kw4">static</span> <span class="kw4">struct</span> mtd_partition __initdata ek_nand_partition<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 1"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> <span class="nu0">64</span> <span class="sy0">*</span> SZ_1M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 2"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> MTDPART_SIZ_FULL<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>
  • 修改LCD时序

linux-2.6.27\arch\arm\mach-at91\board-sam9261ek.c:

<span class="coMULTI">/* TFT */</span><span class="kw4">static</span> <span class="kw4">struct</span> fb_videomode at91_tft_vga_modes<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"TX09D50VM1CCA @ 60"</span><span class="sy0">,</span>.<span class="me1">refresh</span><span class="sy0">=</span> <span class="nu0">60</span><span class="sy0">,</span>.<span class="me1">xres</span><span class="sy0">=</span> <span class="nu0">240</span><span class="sy0">,</span>.<span class="me1">yres</span><span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">,</span>.<span class="me1">pixclock</span><span class="sy0">=</span> KHZ2PICOS<span class="br0">(</span><span class="nu0">4965</span><span class="br0">)</span><span class="sy0">,</span> .<span class="me1">left_margin</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span>.<span class="me1">right_margin</span><span class="sy0">=</span> <span class="nu0">33</span><span class="sy0">,</span>.<span class="me1">upper_margin</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span>.<span class="me1">lower_margin</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">hsync_len</span><span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">,</span>.<span class="me1">vsync_len</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span> .<span class="me1">sync</span><span class="sy0">=</span> FB_SYNC_HOR_HIGH_ACT <span class="sy0">|</span> FB_SYNC_VERT_HIGH_ACT<span class="sy0">,</span>.<span class="me1">vmode</span><span class="sy0">=</span> FB_VMODE_NONINTERLACED<span class="sy0">,</span><span class="br0">}</span><span class="br0">}</span><span class="sy0">;</span>

修改为本站的竖屏时序:

<span class="coMULTI">/* TFT */</span><span class="kw4">static</span> <span class="kw4">struct</span> fb_videomode at91_tft_vga_modes<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"TX09D50VM1CCA @ 60"</span><span class="sy0">,</span>.<span class="me1">refresh</span><span class="sy0">=</span> <span class="nu0">60</span><span class="sy0">,</span>.<span class="me1">xres</span><span class="sy0">=</span> <span class="nu0">240</span><span class="sy0">,</span>.<span class="me1">yres</span><span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">,</span>.<span class="me1">pixclock</span><span class="sy0">=</span> KHZ2PICOS<span class="br0">(</span><span class="nu0">4965</span><span class="br0">)</span><span class="sy0">,</span> .<span class="me1">left_margin</span><span class="sy0">=</span> <span class="nu0">48</span><span class="sy0">,</span>.<span class="me1">right_margin</span><span class="sy0">=</span> <span class="nu0">16</span><span class="sy0">,</span>.<span class="me1">upper_margin</span><span class="sy0">=</span> <span class="nu0">31</span><span class="sy0">,</span>.<span class="me1">lower_margin</span><span class="sy0">=</span> <span class="nu0">12</span><span class="sy0">,</span>.<span class="me1">hsync_len</span><span class="sy0">=</span> <span class="nu0">96</span><span class="sy0">,</span>.<span class="me1">vsync_len</span><span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">,</span> .<span class="me1">sync</span><span class="sy0">=</span> FB_SYNC_HOR_HIGH_ACT <span class="sy0">|</span> FB_SYNC_VERT_HIGH_ACT<span class="sy0">,</span>.<span class="me1">vmode</span><span class="sy0">=</span> FB_VMODE_NONINTERLACED<span class="sy0">,</span><span class="br0">}</span><span class="br0">}</span><span class="sy0">;</span>
  • 添加ttyS*

linux-2.6.27\arch\arm\mach-at91\board-sam9261ek.c:

<span class="kw4">static</span> <span class="kw4">void</span> __init ek_map_io<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span><span class="coMULTI">/* Initialize processor: 18.432 MHz crystal */</span>at91sam9261_initialize<span class="br0">(</span><span class="nu0">18432000</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Setup the LEDs */</span>at91_init_leds<span class="br0">(</span>AT91_PIN_PA13<span class="sy0">,</span> AT91_PIN_PA14<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* DGBU on ttyS0. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* set serial console to ttyS0 (ie, DBGU) */</span>at91_set_serial_console<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span><span class="br0">}</span>

注册USART0到ttyS1, USART1到ttyS2:

<span class="kw4">static</span> <span class="kw4">void</span> __init ek_map_io<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span><span class="coMULTI">/* Initialize processor: 18.432 MHz crystal */</span>at91sam9261_initialize<span class="br0">(</span><span class="nu0">18432000</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* Setup the LEDs */</span>at91_init_leds<span class="br0">(</span>AT91_PIN_PA13<span class="sy0">,</span> AT91_PIN_PA14<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* DGBU on ttyS0. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* USART0 on ttyS1. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span>AT91SAM9261_ID_US0<span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* USART1 on ttyS2. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span>AT91SAM9261_ID_US1<span class="sy0">,</span> <span class="nu0">2</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* set serial console to ttyS0 (ie, DBGU) */</span>at91_set_serial_console<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span><span class="br0">}</span>

:!:USART2的TXD与RXD所在引脚被NAND占用,因此不可使用。
添加后Linux启动时的信息提示:

atmel_usart.0: ttyS0 at MMIO 0xfefff200 (irq = 1) is a ATMEL_SERIALatmel_usart.1: ttyS1 at MMIO 0xfffb0000 (irq = 6) is a ATMEL_SERIALatmel_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:

<span class="coMULTI">/* * NAND flash */</span><span class="kw4">static</span> <span class="kw4">struct</span> mtd_partition __initdata ek_nand_partition<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Bootstrap"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> SZ_4M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 1"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> <span class="nu0">60</span> <span class="sy0">*</span> SZ_1M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 2"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> MTDPART_SIZ_FULL<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

修改为:

<span class="coMULTI">/* * NAND flash */</span><span class="kw4">static</span> <span class="kw4">struct</span> mtd_partition __initdata ek_nand_partition<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 1"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> <span class="nu0">64</span> <span class="sy0">*</span> SZ_1M<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"Partition 2"</span><span class="sy0">,</span>.<span class="me1">offset</span><span class="sy0">=</span> MTDPART_OFS_NXTBLK<span class="sy0">,</span>.<span class="me1">size</span><span class="sy0">=</span> MTDPART_SIZ_FULL<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>
  • 修改LCD时序

linux-2.6.27\arch\arm\mach-at91\board-sam9263ek.c:

<span class="coMULTI">/* * LCD Controller */</span><span class="co2">#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)</span><span class="kw4">static</span> <span class="kw4">struct</span> fb_videomode at91_tft_vga_modes<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"TX09D50VM1CCA @ 60"</span><span class="sy0">,</span>.<span class="me1">refresh</span><span class="sy0">=</span> <span class="nu0">60</span><span class="sy0">,</span>.<span class="me1">xres</span><span class="sy0">=</span> <span class="nu0">240</span><span class="sy0">,</span>.<span class="me1">yres</span><span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">,</span>.<span class="me1">pixclock</span><span class="sy0">=</span> KHZ2PICOS<span class="br0">(</span><span class="nu0">4965</span><span class="br0">)</span><span class="sy0">,</span> .<span class="me1">left_margin</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span>.<span class="me1">right_margin</span><span class="sy0">=</span> <span class="nu0">33</span><span class="sy0">,</span>.<span class="me1">upper_margin</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span>.<span class="me1">lower_margin</span><span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">,</span>.<span class="me1">hsync_len</span><span class="sy0">=</span> <span class="nu0">5</span><span class="sy0">,</span>.<span class="me1">vsync_len</span><span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">,</span> .<span class="me1">sync</span><span class="sy0">=</span> FB_SYNC_HOR_HIGH_ACT <span class="sy0">|</span> FB_SYNC_VERT_HIGH_ACT<span class="sy0">,</span>.<span class="me1">vmode</span><span class="sy0">=</span> FB_VMODE_NONINTERLACED<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>

修改为:

<span class="coMULTI">/* * LCD Controller */</span><span class="co2">#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)</span><span class="kw4">static</span> <span class="kw4">struct</span> fb_videomode at91_tft_vga_modes<span class="br0">[</span><span class="br0">]</span> <span class="sy0">=</span> <span class="br0">{</span><span class="br0">{</span>.<span class="me1">name</span><span class="sy0">=</span> <span class="st0">"TX09D50VM1CCA @ 60"</span><span class="sy0">,</span>.<span class="me1">refresh</span><span class="sy0">=</span> <span class="nu0">60</span><span class="sy0">,</span>.<span class="me1">xres</span><span class="sy0">=</span> <span class="nu0">240</span><span class="sy0">,</span>.<span class="me1">yres</span><span class="sy0">=</span> <span class="nu0">320</span><span class="sy0">,</span>.<span class="me1">pixclock</span><span class="sy0">=</span> KHZ2PICOS<span class="br0">(</span><span class="nu0">4965</span><span class="br0">)</span><span class="sy0">,</span> .<span class="me1">left_margin</span><span class="sy0">=</span> <span class="nu0">48</span><span class="sy0">,</span>.<span class="me1">right_margin</span><span class="sy0">=</span> <span class="nu0">16</span><span class="sy0">,</span>.<span class="me1">upper_margin</span><span class="sy0">=</span> <span class="nu0">31</span><span class="sy0">,</span>.<span class="me1">lower_margin</span><span class="sy0">=</span> <span class="nu0">12</span><span class="sy0">,</span>.<span class="me1">hsync_len</span><span class="sy0">=</span> <span class="nu0">96</span><span class="sy0">,</span>.<span class="me1">vsync_len</span><span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">,</span> .<span class="me1">sync</span><span class="sy0">=</span> FB_SYNC_HOR_HIGH_ACT <span class="sy0">|</span> FB_SYNC_VERT_HIGH_ACT<span class="sy0">,</span>.<span class="me1">vmode</span><span class="sy0">=</span> FB_VMODE_NONINTERLACED<span class="sy0">,</span><span class="br0">}</span><span class="sy0">,</span><span class="br0">}</span><span class="sy0">;</span>
  • 修改时钟频率

linux-2.6.27\arch\arm\mach-at91\board-sam9263ek.c:
从16MHz

<span class="kw4">static</span> <span class="kw4">void</span> __init ek_map_io<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span><span class="coMULTI">/* Initialize processor: 16.367 MHz crystal */</span>at91sam9263_initialize<span class="br0">(</span><span class="nu0">16367660</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* DGBU on ttyS0. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */</span>at91_register_uart<span class="br0">(</span>AT91SAM9263_ID_US0<span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> ATMEL_UART_CTS <span class="sy0">|</span> ATMEL_UART_RTS<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* set serial console to ttyS0 (ie, DBGU) */</span>at91_set_serial_console<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span><span class="br0">}</span>

修改为18MHz:

<span class="kw4">static</span> <span class="kw4">void</span> __init ek_map_io<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">{</span><span class="coMULTI">/* Initialize processor: 16.367 MHz crystal */</span>at91sam9263_initialize<span class="br0">(</span><span class="nu0">18432000</span><span class="br0">)</span><span class="sy0">;</span> <span class="co1">// 16367660</span> <span class="coMULTI">/* DGBU on ttyS0. (Rx & Tx only) */</span>at91_register_uart<span class="br0">(</span><span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="sy0">,</span> <span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */</span>at91_register_uart<span class="br0">(</span>AT91SAM9263_ID_US0<span class="sy0">,</span> <span class="nu0">1</span><span class="sy0">,</span> ATMEL_UART_CTS <span class="sy0">|</span> ATMEL_UART_RTS<span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* set serial console to ttyS0 (ie, DBGU) */</span>at91_set_serial_console<span class="br0">(</span><span class="nu0">0</span><span class="br0">)</span><span class="sy0">;</span><span class="br0">}</span>

配置Kernel源代码

Linux内核配置选项详解

SAM9261

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

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

busybox 源代码下载
926x开发板文档——使用busybox制作根文件系统

开发资料

LCD 时序

LCD类型LCD尺寸xresyrespixclockleft_marginright_marginupper_marginlower_marginhsync_lenvsync_lenQVGA(240x320)3.5”竖2403204965KHz48161231962480x2724.3”宽4802729000KHz22224110VGA(640×480)5.6”横64048025175KHz19451231962WVGA(800x480)5.0”横80048033000KHz40402913483

相关链接

  • 在Windows PC上建立Linux开发环境(ubuntu, VirtualBox)
  • 带有官方性质的SAM9 Linux专业网站
  • ubuntu 8.10 on VirtualPC
  • Linux代码完全注释(赵炯)
  • tar how to
  • tar用法实例
  • 本站FTP上的SAM926x Linux资源(地址: ftp://www.mcuzone.com 用户名: mcuzone 密码: mcuzone 端口: 21)
  • U-boot usage
  • 为9263编译Linux
  • MCUzone提供的原创Application Note
  • Linux 下串口编程入门
  • Serial Programming HOWTO, 经典的Linux下串口编程教程

参考书籍

  • 嵌入式Linux系统开发技术详解--基于ARM
  • 嵌入式Linux应用程序开发详解
  • 嵌入式Linux应用开发完全手册
0 0
原创粉丝点击