lusson 发表于 2011-4-2 21:56:58

正在做linux for at91sam9260的一些移植工作,有一些疑问。也有一些收获

在淘宝上买的9260开发板,扔在一边快一年了。终于下定决心向ARM进发了,可以说基本从0开始,新买了个本本,这样上班也可以用自己电脑弄,不用拷来拷去麻烦。

先移植U-BOOT,板子是在NOR FLASH启动的,没成功,然后就用板自带的U-BOOT源码大概看了遍,大概步骤清楚了就扔一边了。板自带的是u-boot-2009.10

操作系统重新移植了下,还算比较简单,改个板子配置文件就行了。是linux-2.6.30。

然后按照说明,把JFFS2文件系统移植了,是NAND上的,这个也比较简单
因为是在NAND上建文件系统,似乎YAFFS2文件系统更合适,所以开始移植这个文件系统,在网上猛搜索,打了YAFFS2补丁,使用YAFFS2印象制作工具生成img文件,但下到板上发现出现错误,启动不了,在网上搜了下很多人出现,扔开了二天,后面看到增加U-BOOT的YAFFS2文件系统烧写功能,看了下自带的U-BOOT已经支持,只是配置文件屏蔽了,打开,OK。顺便启动起来了

现在开始研究下U-BOOT从NOR移植到NAND,应该不会难,自己分析的区别如下
从nor flash启动时ARM可以直接在NOR FLASH上执行代码,所以U-BOOT程序直接一体就行了,看了下源代码,也有把U-BOOT COPY到SDRAM上再运行,这里有点疑问,既然可以直接在NOR FLASH上执行代码,其实不用COPY到SDRAM也行的,难道是为了加快运行的速度吗??

从nand flash上启动,ARM会自动把NAND FLASH最前面4K拷到SRAM运行,这一段主要由汇编写的,主要的功能就是把完整的U-BOOT搬到SDRAM上运行。

主要的区别是搬U-BOOT这一段,一个是从NOR,一个是从NAND,还有NAND的U-BOOT需要把前面搬代码的程序单独生成4K的BOOTLOADER烧到NAND地址0处。
继续研究

如果大家有兴趣的也可以一起讨论。这次迫于压力了,公司刚准备把系统从2.4升到2.6及从9200升级到9260,本来有个同事做驱动这一块的,这次我也准备跟他学习一下,结果他要离辞了,我准备把这一块接下来,而自己手头刚好又有其他的事,哎,只有日以继夜的猛研究了。

powercxz 发表于 2011-4-2 22:12:31

http://www.at91.com/linux4sam 这个网站上有9260的所有linux东西, 照做一点问题都没有

eworker 发表于 2011-4-2 22:19:34

回复【1楼】powercxz
http://www.at91.com/linux4sam 这个网站上有9260的所有linux东西, 照做一点问题都没有
-----------------------------------------------------------------------

有没有硬件方面的?

powercxz 发表于 2011-4-2 22:32:12

硬件用atmel的 9260 ek

span42 发表于 2011-4-2 22:41:21

马上也要玩9260了,标记一下,话说在nor上运行确实要慢不少

eworker 发表于 2011-4-2 22:45:31

回复【3楼】powercxz
硬件用atmel的 9260 ek
-----------------------------------------------------------------------

请问是几层板?

lusson 发表于 2011-4-2 23:39:53

我网上买的核心板是6层的,BGA封装的。

eworker 发表于 2011-4-2 23:54:11

回复【6楼】lusson
我网上买的核心板是6层的,bga封装的。

-----------------------------------------------------------------------

看网上有2层板,QFP封装的。

lofeng 发表于 2011-4-3 11:16:12

不错,顶一下~

eworker 发表于 2011-4-3 22:02:50

回复【7楼】eworker
回复【6楼】lusson
我网上买的核心板是6层的,bga封装的。
-----------------------------------------------------------------------
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------

2层板稳定么?

powercxz 发表于 2011-4-3 22:20:15

回复【9楼】eworker
回复【7楼】eworker
回复【6楼】lusson
我网上买的核心板是6层的,bga封装的。
-----------------------------------------------------------------------
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------
2层板稳定么?
-----------------------------------------------------------------------

很不稳定

eworker 发表于 2011-4-4 09:48:01

回复【10楼】powercxz
回复【9楼】eworker   
回复【7楼】eworker
回复【6楼】lusson   
我网上买的核心板是6层的,bga封装的。   
-----------------------------------------------------------------------
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------
2层板稳定么?
-----------------------------------------------------------------------
很不稳定
-----------------------------------------------------------------------

taobao上有个太湖微控卖的开发板就是两层板,据说很稳定。

eworker 发表于 2011-4-4 23:24:41

ding

swi-5 发表于 2011-4-5 10:49:14

回复【11楼】eworker
-----------------------------------------------------------------------

为何TAOBAO上也有两层的9260开发板卖呢?关注!

eworker 发表于 2011-4-5 17:03:32

回复【10楼】powercxz
-----------------------------------------------------------------------

这里有一个两层板的PROTEL文件。

http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=1568984

armerok 发表于 2011-4-6 09:29:17

回复【14楼】eworker
-----------------------------------------------------------------------

不错!

zjf0000 发表于 2011-4-7 17:13:55

已经移植好atmel网站的uboot1.3.4和linux-2.6.30 呵呵大家多多交流

lusson 发表于 2011-4-9 18:22:37

我移的也是LINUX-2.6.30
UBOOT是2009.10,是在NOR上的
还没去移至NAND,先扔一边了
目前在先学习写驱动。

lusson 发表于 2011-4-16 18:50:35

I2C看了我将近2个星期,在网上不停的找资料,不停的看源代码,终于知道大概过程了,也能读写了。
AT91SAM9260在配置的时候我选择是IO模拟的方式。
在arch/arm/mach-at91/at91sam9260_device.c里面定义了at91_add_device_i2c函数,该函数实现platform_device的register
在drivers/i2c/busser/i2c-gpio.c,定义了platform_driver的register
在drivers/i2c/busses/i2c_dev.c定义了对I2C设备的读写等函数
在drivers/i2c/algos/algo_i2c_bit.c里定义了IO模拟I2C总线时序的函数。

系统起来后,在/dev/会生成I2C-0的设备节点,我们对该节点读写即可。

lusson 发表于 2011-4-16 18:55:57

ATMEL官网有个NAND FLASH启动的BOOTLOADER,但下到我板上去不能启动,之前扔在一边。
昨天晚上重新拿起来研究,下了源码来看,外加网上搜索,做了个很小的改动,原来需要添加自己板上NAND FLASH信息到/include/nand_ids.h里面,如下:
/* Supported NandFlash devices */
static struct SNandInitInfo NandFlash_InitInfo[] = {
{0xecda, 0x800, 0x20000, 0x800, 0x40, 0x0, "K9F2G08U0M\0"},
{0xecaa, 0x800, 0x20000, 0x800, 0x40, 0x0, "K9F2G08R0A\0"},
{0x2cca, 0x800, 0x20000, 0x800, 0x40, 0x1, "MT29F2G16AAB\0"},
{0x2cda, 0x800, 0x20000, 0x800, 0x40, 0x0, "MT29F2G08AAC\0"},
{0x20aa, 0x800, 0x20000, 0x800, 0x40, 0x0, "STMNAND02GR3B\0"},
{0x2caa, 0x800, 0x20000, 0x800, 0x40, 0x0, "MT29F2G08ABD\0"},
{0,}
};

我的是K9F1G08U0M,添加如下:
{0xecf1, 0x400, 0x20000, 0x800, 0x40, 0x0, "K9F1G08U0M\0"},
然后进到board/at91sam9260ek/nandflash/编绎生成nandflash_at91sam9260ek.bin,但我看大小超过了4K,于是把对另外几个NAND FLASH的定义去掉了,这下够了。
注意nandflash/目录里面的文件at91sam9260ek.h定义了板上NAND FLASH的引脚,U-BOOT存放位置以及大小等,需要修改成和板上一样。
然后用SAM-BA把BOOTLOADER和U-BOOT写到NAND FLASH,启动成功。我的U-BOOT就是原来在能直接在NOR FLASH上引导的U-BOOT。

lusson 发表于 2011-4-20 00:34:42

RX8025终于跑起来了,用的内核自带的驱动,GPIO模拟方式,所以我的驱动是应用层驱动了。程序如下:
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/delay.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>

#define I2C_DEV "/dev/i2c-0"

struct i2c_rdwr_ioctl_data i2c_data;
struct i2c_msg i2c_msgs;


int write_rx8025_data(__u8 *buf,unsigned char num,unsigned char start_addr)
{
        __u8 *bufp;
        int ret,fd;
        if(start_addr>0xf)
                start_addr %= 0x10;       
        if(num>0x10)
                num = 0x10;
        if(num==0)
                return 0;
        if((num+start_addr)>0x10)
                num = 0x10-start_addr;
        bufp = malloc(num*2);
        if(!bufp)
                return -1;
        memset(bufp,0,num*2);
        bufp = start_addr<<4;
        memcpy(&bufp,buf,num);
/*
I2C_M_TEN = 0                                                                //=1 ten bit slave_addr =0 seven bit slave_addr
I2C_M_RD                                                                                //=1 RD=0 WR
I2C_M_IGNORE_NAK = 0                                //=1 check NAK
I2C_M_NOSTART = 0                                                //=1 NO restart
-----------------------------------*/       
        i2c_msgs.buf = bufp;
        i2c_msgs.len = num+1;
        i2c_msgs.addr = 0x32;
        i2c_msgs.flags = 0;
        i2c_data.msgs = i2c_msgs;
        i2c_data.nmsgs = 1;
        fd = open(I2C_DEV,O_RDWR);
        if(fd<0){
                printf("can't open i2c-dev\r\n");
                return fd;
        }
        ret = ioctl(fd,I2C_RDWR,(unsigned long)&i2c_data);
        free(bufp);
        close(fd);
        return ret;
       
}


int read_rx8025_data(__u8 *buf,unsigned char num,unsigned char start_addr)
{
        int fd;
        __u8 *bufp;
        int ret,i;
        if(start_addr>0xf)
                start_addr %= 0x10;       
        if(num>0x10)
                num = 0x10;
        if(num==0)
                return 0;
        if((num+start_addr)>0x10)
                num = 0x10-start_addr;
        bufp = (__u8 *)malloc(num*2);
        memset(bufp,0,num*2);
        if(!bufp)
                return -1;
        bufp = start_addr<<4;
/*----------------------------------
I2C_M_TEN = 0                                                                //=1 ten bit slave_addr =0 seven bit slave_addr
I2C_M_RD                                                                                //=1 RD=0 WR
I2C_M_IGNORE_NAK = 0                                //=1 check NAK
I2C_M_NOSTART = 0                                                //=1 NO restart
-----------------------------------*/
        i2c_msgs.buf =&bufp ;
        i2c_msgs.len = 1;
        i2c_msgs.flags = 0;
        i2c_msgs.addr = 0x32;

        i2c_msgs.buf = &bufp;
        i2c_msgs.len = num;
        i2c_msgs.flags = I2C_M_RD;
        i2c_msgs.addr = 0x32;
        i2c_data.msgs = i2c_msgs;
        i2c_data.nmsgs = 2;
        fd = open(I2C_DEV,O_RDWR);
        if(fd<0){
                printf("can't open i2c-dev\r\n");
                return fd;
        }
        ret = ioctl(fd,I2C_RDWR,(unsigned long)&i2c_data);
        if(ret<0){
                printf("read fail!\r\n");
                goto exit0;
        }else
                memcpy(buf,&bufp,num);
exit0:
        free(bufp);
        close(fd);
        return ret;
}


int main(unsigned int arg,char **argv)
{
        int ret=0;
        unsigned char temp_data;
        unsigned int i,cmd,addr;
        unsigned int count;
        __u8 buf;
        if(arg==1)
                cmd = 1;
        else{
                arg --;
                cmd = 0;
                for(i=0;i<arg;i++)
                        buf = atoi(argv);
        }
        if(cmd==0){
                addr = buf;       
                ret = write_rx8025_data(&buf,arg-1,addr);
        }else{
                        while(1){
                        usleep(100000);
                        ret = read_rx8025_data(buf,16,0);
                        if(temp_data!=buf){
                                temp_data = buf;
                                printf("date:20%02x-%02x-%02x time:%02x:%02x:%02x\r\n",buf,buf,buf,buf&0x1f,buf,buf);
                        }
                }
        }
        return ret;
}

-----------------------------------------------------------
arm-linux-gcc main.c -o main
#./main
date:2012-04-20 time:12:33:59
date:2012-04-20 time:12:34:00
date:2012-04-20 time:12:34:01
date:2012-04-20 time:12:34:02
date:2012-04-20 time:12:34:03
date:2012-04-20 time:12:34:04
date:2012-04-20 time:12:34:05
date:2012-04-20 time:12:34:06
date:2012-04-20 time:12:34:07
date:2012-04-20 time:12:34:08
date:2012-04-20 time:12:34:09
date:2012-04-20 time:12:34:10
date:2012-04-20 time:12:34:11
........................

windy__xp 发表于 2011-4-20 08:46:06

回复【20楼】lusson
rx8025终于跑起来了,用的内核自带的驱动,gpio模拟方式,所以我的驱动是应用层驱动了。程序如下:
-----------------------------------------------------------------------
   莫非 LZ 做电力集抄的集中器?

lusson 发表于 2011-4-20 09:49:58

回复【21楼】windy__xp龙笑
回复【20楼】lusson
rx8025终于跑起来了,用的内核自带的驱动,gpio模拟方式,所以我的驱动是应用层驱动了。程序如下:
-----------------------------------------------------------------------
   莫非 lz 做电力集抄的集中器?

-----------------------------------------------------------------------

晕。。。这也被发现了。。

zjf0000 发表于 2011-4-20 12:18:18

楼上能留个联系方式吗? 我也是在做集中器 jianfeng_2008@hotmail.com
8025驱动里边有的,选上就可以用啦

lusson 发表于 2011-4-20 13:11:07

我不是做集中器的,有另外的同事做,我是在学习

windy__xp 发表于 2011-4-20 13:45:19

回复【25楼】lusson
我不是做集中器的,有另外的同事做,我是在学习
-----------------------------------------------------------------------
    同行哈,主要做载波的应用,还是无线的?这几年行情应该会不错的,我们做无线自组网的,主要用于电力抄表,集中器也有专门的工程师在做,一看 9260 8025 linux 就感觉差不多是了。

lusson 发表于 2011-4-20 14:02:29

电力载波。
力合微,不知道你听过没。。

windy__xp 发表于 2011-4-20 18:29:37

回复【27楼】lusson
电力载波。
力合微,不知道你听过没。。
-----------------------------------------------------------------------
   哦,想起来了,前段时间还在论坛招人来着,^_^

radar_12345 发表于 2011-10-27 09:30:50

mark

reloaded 发表于 2011-10-27 10:22:38

准备开动自己的9260核心板了,,最近又睡了很久,,
页: [1]
查看完整版本: 正在做linux for at91sam9260的一些移植工作,有一些疑问。也有一些收获