显示下一条  |  关闭

我想我可以

Forgotten as the past...

 
 
 
 
 
 

北京市 海淀区 巨蟹座

 发消息  写留言

 
不玩游戏了。
 
近期心愿都好好的。
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 

日历

 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
 

USE CMSIS Cortex-M3 2.x & IAR

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,新增了些功能函数。

USE CMSIS Cortex-M3 2.x IAR - [T.BN]9527 - 我想我可以
 

然后将自己的工程文件中移除$PRJ_DIR$\..\Libraries\CMSIS\CoreSupport\,即取消core_cm3.h等包含。编译完成后,J-Link下载,可正常工作

USE CMSIS Cortex-M3 2.x IAR - [T.BN]9527 - 我想我可以

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IAR src @ Atmel for at91sam9261
昨晚用atmel官网的iar_project调试了一下pm9261bootstrap,以前u-boot-2010.xx系列的u-boot总是启动不了,个人感觉是参数传递出了问题,MACH定义不一致,起不来,就u-boot-1.x.x系列的似乎不验证这个,所以可以顺利引导。
以后的注意力应该转移到内核及驱动方面。现在回过头来,看看老早以前买的那些嵌入式
linux书籍,比如《嵌入式linux应用开发完全手册》、《ARM嵌入式常用模块与综合系统设计实例精讲》、《零基础学ARM9嵌入式linux系统开发》、《嵌入式设计及linux驱动开发指南——基于arm9处理器(第三版)》等,这些作者都是抄袭,在无关痛痒的地方吹毛求疵,总是谈不到要害,远不及看bootloaderkernel源代码里关于archboard等的源文件收效显著。不过看源码也有弊端,没有前辈指引,面对庞大的代码和文件数量,有点盲人摸象的感觉。linux就不是一个人能玩转的东西,GPL的东西集思广益,海纳百川,更新的速度太快,结构体系变化也很快,导致时令的发行书籍,很多都已过期,用处和参考价值不大。哎,前路漫漫,路遥知马力不足,日久见人心叵测,这就是中国的现状。

作者  | 2011-12-6 10:46:27 | 阅读(17) |评论(0) | 阅读全文>>

AT91SAM926x定制kernel驱动menuconfig

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图示

定制kernel驱动menuconfig - [T.BN]9527 - 我想我可以


二、驱动

驱动添加:例如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图示

 定制kernel驱动menuconfig - [T.BN]9527 - 我想我可以
三、文件系统yaffs2

1、文件系统对yaffs2的支持

tar –xzvf cvs-root.tar.gz

cd csv/yaffs2/

./patch-ker.sh c /../../linux-2.6.33/ (c空格后面为自己存放linux的位置)

2、patch作用说明
kernel打补丁,自动修改了KconfigMakefile文件,从而使的menuconfig对其支持。
3、
menuconfig图示

定制kernel驱动menuconfig - [T.BN]9527 - 我想我可以

四、summary
make uImage -j4现在都是多核CPU,-j4即开启4线程同时编译,这样可以免得一个CPU处于100%使用,其余的没有干活。这样能大大的提高编译效率。
平时做好工作总结备忘,增强对学习工作成功的巩固。有道是,人若无名,便可专心练剑。十年磨一剑。

作者  | 2011-11-28 11:54:52 | 阅读(19) |评论(0) | 阅读全文>>

Bootstrap&u-boot Summary @SBC9261

2011-11-22 15:17:59 阅读17 评论0 222011/11 Nov22

Bootstrap总结:

使用dataflash cs0bootstrap的功能就是将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-bootdataflash中的地址,你把谁拦腰截取,他也活不了。
AT91SAM926x内部固化了一段Romboot的代码,这段代码用来检测bootstrap是否存在,如果存在将其载入内部SARM运行,bootstrap再将u-boot载入SDRAM运行,如下图:

Bootstrapu-boot Summary @SBC9261 - [T.BN]9527 - 我想我可以
 

u-boot总结:

功能就是那些无非是从tftpdataflashnandflash(norflash可以抹去了)复制or下载kernel和文件系统ramdisk or nfs/rootfsfs。骨子里ramdiskfs是一回事。使用dataflashnandflash做文件系统的存储。

u-boot中定义了dataflash中代码的partition

以前的bootstrapu-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"},//最后一行没有

};

最近的bootstrapu-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不断向前发展更新,这个月11linux-3.0.9发布,到今天22linux-3.2已经发布,速度太快了,内核功能和选项变化也比较多,所以也不必要再总结什么了。年初的时候将linux-2.6.33的版本在at91sam9263上是定制成功了的。不过我发现,用crosstool-ng编译linux-2.6.38时uImage的体积特别小,基本都不到2M,以前crosstool-0.43编译linux-2.6.332.6.2526的时候size都挺大的,当然了跟选中的功能多少有关,这里只说简单的横向对比了。
gl hf
gg ((魔兽删了有一年了吧,好怀念在VS上22的时候。

作者  | 2011-11-22 15:17:59 | 阅读(17) |评论(0) | 阅读全文>>

编辑busybox定制自己的ramdisk based on busybox1.18.3

2011-11-11 10:55:43 阅读10 评论0 112011/11 Nov11

一、编辑busybox嵌入式命令集合

编译busybox

make menuconfig

根据自己的arm linux所需要使用的命令详实选择,订制命令,不要贪多,命令太多,busybox文件太大。
编译当中,有几项需要选择:

busybox.conf
编辑busybox定制自己的ramdisk based on busybox1.18.3 - [T.BN]9527 - 我想我可以
Don't use usr/
编辑busybox定制自己的ramdisk based on busybox1.18.3 - [T.BN]9527 - 我想我可以
show verbose applet usage message
编辑busybox定制自己的ramdisk based on busybox1.18.3 - [T.BN]9527 - 我想我可以
 build busybox as a static binary 这个必须要选择!要编入ramdisk中,所以的命令都指向busybox这个二进制文件。
编辑busybox定制自己的ramdisk based on busybox1.18.3 - [T.BN]9527 - 我想我可以
 订制命令,根据需要选择,然后make

make install

二、制作ramdisk

    #mkdir ram_disk

    #mount -o loop ramdisk ram_disk

    #cd ram_disk


Busybox中得到_instal/bin and sbin folders

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-11 10:55:43 | 阅读(10) |评论(0) | 阅读全文>>

Transplant u-boot-1.3.4 & latest u-boot-2011.09

2011-11-9 8:47:21 阅读24 评论0 92011/11 Nov9

根据移植,按需分配修改:

SDRAM

DATAFLASH

NANDFLASH

Ethernet

编译环境:crosstools-0.43arm-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,环境变量偏移量0x4200boot 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.cfgMAKEALL rules.mk

命令

. \u-boot-2011.09\arch\arm\cpu\arm926ejs\at91\

At91sam9261ek_devices.ccpu相关

.\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\

包含头文件位置没有变动。

作者  | 2011-11-9 8:47:21 | 阅读(24) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注