· USE CMSIS Cortex-M3 2.x & IAR
· AT91SAM926x定制kernel驱动menuconfig
· Bootstrap&u-boot Summary @SBC9261
2011-12-6 10:46:27 阅读17 评论0 62011/12 Dec6
ST的固件库中一直包含的是CMSIS 1.30的库,IAR升级的6.21后,Intrinsics.h和旧的CMSIS头文件冲突,要么将Intrinsics.h用5.x版本的替换,这样仍然使用CMSIS 1.3的版本。归咎冲突的原因,就是6.21的版本中包含了CMSIS 2.0的库,导致新旧版本头文件混合调用冲突。
既然更新了CMSIS 2.x的版本,那么就用新的呗,在Option中选中Use CMSIS,将自动包含IAR安装文件目录下的iar_cortexM3l_math.a,头文件core_cm3.h、core_cmFunc.hcore_cmInstr.h,新增了些功能函数。
然后将自己的工程文件中移除$PRJ_DIR$\..\Libraries\CMSIS\CoreSupport\,即取消core_cm3.h等包含。编译完成后,J-Link下载,可正常工作。
2011-11-28 11:54:52 阅读19 评论0 282011/11 Nov28
回顾总结一下自己定制menuconfig,这里只是简单举例说明,USE AT91SAM9261,比如对板型、驱动、yaffs2(NAND Flash的文件系统)支持,开门见山,只做抛砖引玉。JFFS2为NOR Flash文件系统。
一、板型
arm linux启动,需要bootloader与kernel的板号,即MACH_TYPE一致才能启动,Machine Type。
1、为内核添加可支持的自定义板子型号(u-boot中也需同步更改,才能是自己定制的板子正常启动)。
\arch\arm\mach-at91\Kconfig
在如下位置中插入(红色字体)
if ARCH_AT91SAM9261
comment "AT91SAM9261 Board Type"
config MACH_AT91SAM9261EK
bool "Atmel AT91SAM9261-EK Evaluation Kit"
select HAVE_AT91_DATAFLASH_CARD
select HAVE_NAND_ATMEL_BUSWIDTH_16
help
Select this if you are using Atmel's AT91SAM9261-EK Evaluation Kit.
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3820>
config MACH_PM9261
bool "SBC9261 Board"
select HAVE_AT91_DATAFLASH_CARD /*Support Dataflash Bootup*/
select HAVE_NAND_ATMEL_BUSWIDTH_16/*Support 16-bit Nand bus*/
help
Select this if you are using SBC9261 Board.
<http://link>
Endif
2、Makefile修改对新增板的支持:
\arch\arm\mach-at91\Makefile
添加
# AT91SAM9261 board-specific support
obj-$(CONFIG_MACH_AT91SAM9261EK) += board-sam9261ek.o
obj-$(CONFIG_MACH_AT91SAM9G10EK) += board-sam9261ek.o
obj-$(CONFIG_MACH_PM9261) += board-pm9261.o
3、board文件添加
\arch\arm\mach-at91\添加文件
.\board-pm9261.c,关于MACHINE定义做修改对PM9261的支持。
MACHINE_START(PM9261, "AT91SAM9261-SBC9261")
/* Maintainer: Atmel */
.phys_io = AT91_BASE_SYS,
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
.boot_params = AT91_SDRAM_BASE + 0x100,
.timer = &at91sam926x_timer,
.map_io = ek_map_io,
.init_irq = ek_init_irq,
.init_machine = ek_board_init,
MACHINE_END
4、增加MACH_TYPE定义
\arch\arm\tools\mach-types
如果没有找到MACH_TYPE_PM9261
在该文件最后一行添加:
pm9261 MACH_PM9261 PM9261 1187
注意此文件不要用写字板编辑,unicode被强制转换,编译通不过。还是建议用vi或者ultraedit。
5、报警提示
\arch\arm\kernel\vmlinux.lds
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
这两句话不要注释掉,如果板子没有定义,会提示出错,可以确定自己增加的板子是否添加成功,否则kernel与u-boot不一致仍然不能启动。
6、menuconfig图示
二、驱动
驱动添加:例如spi TSC2301
1、头文件添加在:
\include\linux\spi
tsc2301.h
2、源文件添加在:
\drivers\spi\
tsc2301.c
3、Kconfig中修改
comment "SPI Protocol Masters"下面添加:
config SPI_TSC2301
tristate "TSC2301 driver"
depends on SPI_MASTER
help
Say Y here if you have a TSC2301 chip connected to an SPI
bus on your board.
To compile this driver as a module, choose M here: the
module will be called tsc2301.
4、Makefile中添加:
# SPI slave controller drivers (upstream link)
obj-$(CONFIG_SPI_TSC2301) += tsc2301.o
tsc2301-objs := tsc2301-core.o
5、menuconfig图示
1、文件系统对yaffs2的支持
tar –xzvf cvs-root.tar.gz
cd csv/yaffs2/
./patch-ker.sh c /../../linux-2.6.33/ (c空格后面为自己存放linux的位置)
2、patch作用说明
给kernel打补丁,自动修改了Kconfig和Makefile文件,从而使的menuconfig对其支持。
3、menuconfig图示
2011-11-22 15:17:59 阅读17 评论0 222011/11 Nov22
Bootstrap总结:
使用dataflash cs0,bootstrap的功能就是将u-boot.bin文件从dataflash中复制到内存然后跳转到内存地址中运行。内存0x23f00000的地址\board\atmel\at91sam9263ek\config.mk(u-boot中定义的地址)。bootstrap其实挺简单,利用官方的源文件,选中的是cs0,按照这样的指向,编译生成,即完成它的使命。Why? As followed:
CPU-->cs0-->dataflash;(at45dbxxx spiflash源文件自带驱动);
CPU-->SDRAM内存是不需要驱动的,只要是按照指定的连线定义即可使用。
Done!
重要一点:配置好u-boot在dataflash中的地址,你把谁拦腰截取,他也活不了。
AT91SAM926x内部固化了一段Romboot的代码,这段代码用来检测bootstrap是否存在,如果存在将其载入内部SARM运行,bootstrap再将u-boot载入SDRAM运行,如下图:
u-boot总结:
功能就是那些无非是从tftp、dataflash、nandflash(norflash可以抹去了)复制or下载kernel和文件系统ramdisk or nfs/rootfs等fs。骨子里ramdisk和fs是一回事。使用dataflash,nandflash做文件系统的存储。
u-boot中定义了dataflash中代码的partition
以前的bootstrap、u-boot的数据分区:
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
{0x00000000, 0x00003FFF, FLAG_PROTECT_SET, 0, "Bootstrap"},
{0x00004000, 0x00007FFF, FLAG_PROTECT_CLEAR, 0, "Environment"},
{0x00008000, 0x00037FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
{0x00038000, 0x002FFFFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},//结束地址修改
{0x00300000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},//最后一行没有
};
最近的bootstrap、u-boot的数据分区
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
};
uImage存储在dataflash中,fs存储在nandflash中。
Bootstrap和u-boot配套使用,分区定义错了,比如bootstrap指向0x8000的u-boot,烧写定义的存储offset为0x8400的u-boot必定是不能工作的。不管怎样,不按partition定义,程序不正常。有的时候bootstrap和u-boot都能顺利引导,但是kernel每次uncompressed以后就出错,也是跟分区定义冲突有关。
kernel启动时提示:Error:unrecognized/unsupported machine ID (r1 = 0x00000350)
Alivable machine support:
ID(hex) NAME
000004a3 AT91SAM9261EK
这是由于SBC9261的u-boot-1.1.5中:(非标准mach定义)
#define MACH_TYPE_AT91SAM9261EK 1187;但是标准的u-boot mach定义例如u-boot-1.3.4中
#define MACH_TYPE_PM9261 1187,而
#define MACH_TYPE_AT91SAM9261EK 848。
所以冲突了,改一下u-boot中mach-types.h中的定义,或者重新编译较新版本的内核(which supports new defines)。linux中mach定义在:
location: \linux-x.x.xx\arch\arm\tools\mach-types
实际上linux中对MACH即Machine是有定义的,不可以随便更改 http://www.arm.linux.org.uk/developer/machines/ 到该链接查询,修改u-boot中的错误定义即可。
关于通用设备的驱动例如u-boot-1.3.4\drivers\下面有很多各种设备的文件夹,其实关心的就是SPI,MTD(spiflash,nandflash)、NET(ethernet)、serial(debug terminal),其他的就不说了,在自己的板中,将和ek demo板中不同的外设,如网卡,换成其他通用的网卡,去除掉已经包含的#define和头文件,加入要用的网卡.h头文件,源码都在u-boot中,包含指向对了,就能添加,能站在前人的肩膀上,为什么不能?
顺便说一句,当编译kernel时,需要添加自定义驱动时,将其纳入menuconfig中就要用到Kconfig了。SBC9261的板子用的是ronetix公司的PM9261,u-boot、kernel以及toolschain可以到http://www.ronetix.at/pm9261.html 来查找。
到这里已经没有什么可说的了,驱动用ek板的外设连接的话,比较简单。以前还觉得arm linux挺复杂的,最近突然觉得就走套路来说,已经差不多都清楚了。可能是要研究的方面比较多,每个方面都要积累,就像爬山,只顾低头默默的向上攀登,忽然有一天,就这一步到达了山顶,只是突然感到这山好像也不过如此。开发应用其实就是下山的道路,都是没有走过的路程,殊不知上山难,下山更难。
Ramdisk已经写过了,内核定制本来也是想写一下的,但是网上关于普通linux内核menuconfig选项介绍已经挺深刻的了,而且kernel不断向前发展更新,这个月11号linux-3.0.9发布,到今天22号linux-3.2已经发布,速度太快了,内核功能和选项变化也比较多,所以也不必要再总结什么了。年初的时候将linux-2.6.33的版本在at91sam9263上是定制成功了的。不过我发现,用crosstool-ng编译linux-2.6.38时,uImage的体积特别小,基本都不到2M,以前crosstool-0.43编译linux-2.6.33及2.6.25、26的时候size都挺大的,当然了跟选中的功能多少有关,这里只说简单的横向对比了。
gl hf
gg ((魔兽删了有一年了吧,好怀念在VS上22的时候。
2011-11-11 10:55:43 阅读10 评论0 112011/11 Nov11
一、编辑busybox嵌入式命令集合
编译busybox
make menuconfig
根据自己的arm linux所需要使用的命令详实选择,订制命令,不要贪多,命令太多,busybox文件太大。
编译当中,有几项需要选择:
make install
二、制作ramdisk
#mkdir ram_disk
#mount -o loop ramdisk ram_disk
#cd ram_disk
cp bin and sbin to ram_disk (delete original bin and sbin)
例如:增加hwclock的命令
只是在原来randisk.gz中新增添某些命令,如下:
将busybox新编的busybox.1复制到bin 在sbin里增加命令的连接
/sbin
ln -s ../bin/busybox.1 ./hwclock //注意该命令的指向hwclock->busybox.1这里是将新的命令链接到busybox.1这个二进制文件,以前存在的busybox仍然有效,这样只是追加新的命令。如果全部重新编译,则直接生成busybox,将旧的移除。
../ram_disk 运行
#umount ./ram_disk
#gzip ramdisk
got ramdisk.gz
生成ramdisk.gz下载到arm板中,命令即可使用。
其他使用的程序也可追加到ram_disk中然后卸载压缩生成ramdisk。
2011-11-9 8:47:21 阅读24 评论0 92011/11 Nov9
根据移植,按需分配修改:
SDRAM
DATAFLASH
NANDFLASH
Ethernet
编译环境:crosstools-0.43,arm-linux-gcc –version 3.4.5
通用外设驱动源文件:
\u-boot-1.3.4\drivers
u-boot的作用就是用来引导kernel,所以关键的驱动在:
1、 存储介质,如dataflash;
2、 调试使用tftp,需要网络:开发板用的是dm9161a;(\u-boot-1.3.4\drivers\net)
3、 程序在内存中运行SDRAM,根据自己定义的SDRAM,来设置连线等,一般SDRAM使用方法都差不多,初始化好后,CPU根据程序自动使用。
\u-boot-1.3.4\Makefile
定制自定义板子name_config,修改如下:
划线处名字须一致,在编译make at91sam9263ek_config时,使用
------------------------------custom board folder------------------------------------------------------------
at91sam9263ek_config : unconfig |
-------------------- |
@$(MKCONFIG) $(@:_config=) arm arm926ejs at91sam9263ek atmel at91sam9 |
------------- |
-------------------------------------------------------------------------------------------------------------------
u-boot作为系统引导的职能,用不着非要注重name_config,可以就用ek板的配置,修改变通的外设配置,这样减少生手的出错几率。
外设头文件:
\u-boot-1.3.4\include\
at45.h
dm9161.h
flash.h flash厂商的芯片id定义。
\u-boot-1.3.4\board\atmel\at91sam9263ek\ config.mk
TEXT_BASE = 0x23f00000该根据自己的板子来修改,和一级boot的定义的一致即可。
\u-boot-1.3.4\cpu\arm926ejs\at91sam9\
u-boot.lds
spi.c
ether.c
config.mk定义了链接的指向
新添加的nandflash.c放在\u-boot-1.3.4\board\atmel\at91sam9261ek\
然后将nandflash.h放在\u-boot-1.3.4\include\ .c文件中指定好.h的位置。
自定义led
\u-boot-1.3.4.ud\u-boot-1.3.4\board\atmel\at91sam9263ek\led.c
根据自己定义来修改引脚:
#define RED_LED AT91_PIN_PB7 /* this is the power led */
#define GREEN_LED AT91_PIN_PB8 /* this is the user1 led */
#define YELLOW_LED AT91_PIN_PC29 /* this is the user2 led */
Dataflash启动,选哪个CSx以及在dataflash中的程序分区
\u-boot-1.3.4.ud\u-boot-1.3.4\board\atmel\at91sam9263ek\partition.c
CSx:
AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
struct dataflash_addr cs[CFG_MAX_DATAFLASH_BANKS] = {
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, /* Logical adress, CS */
};
数据段定义,以及地址和大小:
/*define the area offsets*/
dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
{0x00000000, 0x000041FF, FLAG_PROTECT_SET, 0, "Bootstrap"},
{0x00004200, 0x000083FF, FLAG_PROTECT_CLEAR, 0, "Environment"},
{0x00008400, 0x00041FFF, FLAG_PROTECT_SET, 0, "U-Boot"},
{0x00042000, 0x00251FFF, FLAG_PROTECT_CLEAR, 0, "Kernel"},
{0x00252000, 0xFFFFFFFF, FLAG_PROTECT_CLEAR, 0, "FS"},
};
\u-boot-1.3.4\include\configs\at91sam9263ek.h
CPU name
#define AT91_CPU_NAME "AT91SAM9263"
外部High/Low晶振
#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 */
当前使用的SDRAM地址和大小:
/* SDRAM */
#define CONFIG_NR_DRAM_BANKS 1
#define PHYS_SDRAM 0x20000000
#define PHYS_SDRAM_SIZE 0x04000000 /* 64 megs */
Dataflash地址:
/* DataFlash */
#define CONFIG_HAS_DATAFLASH 1
#define CFG_SPI_WRITE_TOUT (5*CFG_HZ)
#define CFG_MAX_DATAFLASH_BANKS 1
#define CFG_DATAFLASH_LOGIC_ADDR_CS0 0xC0000000 /* CS0 */
#define AT91_SPI_CLK 15000000
#define DATAFLASH_TCSS (0x1a << 16)
#define DATAFLASH_TCHS (0x1 << 24)
CONFIG load地址:
#define CFG_LOAD_ADDR 0x22000000 /* load address */
使用dataflash时,u-boot的存储地址0x8400,环境变量偏移量0x4200,boot command
#ifdef CFG_USE_DATAFLASH
/* bootstrap + u-boot + env + linux in dataflash on CS0 */
#define CFG_ENV_IS_IN_DATAFLASH 1
#define CFG_MONITOR_BASE (CFG_DATAFLASH_LOGIC_ADDR_CS0 + 0x8400)
#define CFG_ENV_OFFSET 0x4200
#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 + CFG_ENV_OFFSET)
#define CFG_ENV_SIZE 0x4200
#define CONFIG_BOOTCOMMAND "cp.b 0xC0042000 0x22000000 0x210000; bootm"
#define CONFIG_BOOTARGS "console=ttyS0,115200 " \
"root=/dev/mtdblock0 " \
"mtdparts=at91_nand:-(root) "\
"rw rootfstype=jffs2"
u-boot运行时,显示的名字
#define CFG_PROMPT "U-Boot> "
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
U-boot-2011.09 u-boot结构发生变化
编译需要gcc version 4.4.3 crosstools-ng,
老版本的crosstool-0.43 gcc version 3.4.5报错linux/compiler-gcc3.hlinux/compiler-gcc3.h,将kernel中该文件复制过去,仍然会报错[u-boot] error 139。由于版本低导致。
Kernel 2.6.33以上版本编译crosstool-0.43也无法编译通过,所以升级工具链才是解决根本的解决办法。
u-boot-2011.09 编译口令
make at91sam9261ek_dataflash_cs0
make
u-boot-2011.09结构框架,比以前u-boot-2010.12等层次更加清晰:
.\u-boot-2011.09\boards.cfg,MAKEALL, rules.mk
命令
. \u-boot-2011.09\arch\arm\cpu\arm926ejs\at91\
At91sam9261ek_devices.c等cpu相关
.\u-boot-2011.09\board\atmel\at91sam9261ek\
At91sam9263.c
Led.c
Partition.c板子器件相关
.\u-boot-2011.09\drivers\
通用设备驱动,如serial,net,mtd,spi,gpio等等;
.\u-boot-2011.09\include\configs\
包含头文件位置没有变动。