搜索
bottom↓
回复: 29

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

[复制链接]

出0入54汤圆

发表于 2011-4-2 21:56:58 | 显示全部楼层 |阅读模式
在淘宝上买的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,本来有个同事做驱动这一块的,这次我也准备跟他学习一下,结果他要离辞了,我准备把这一块接下来,而自己手头刚好又有其他的事,哎,只有日以继夜的猛研究了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2011-4-2 22:12:31 | 显示全部楼层
http://www.at91.com/linux4sam 这个网站上有9260的所有linux东西, 照做一点问题都没有

出0入0汤圆

发表于 2011-4-2 22:19:34 | 显示全部楼层
回复【1楼】powercxz
http://www.at91.com/linux4sam 这个网站上有9260的所有linux东西, 照做一点问题都没有
-----------------------------------------------------------------------

有没有硬件方面的?

出0入0汤圆

发表于 2011-4-2 22:32:12 | 显示全部楼层
硬件用atmel的 9260 ek

出0入50汤圆

发表于 2011-4-2 22:41:21 | 显示全部楼层
马上也要玩9260了,标记一下,话说在nor上运行确实要慢不少

出0入0汤圆

发表于 2011-4-2 22:45:31 | 显示全部楼层
回复【3楼】powercxz
硬件用atmel的 9260 ek
-----------------------------------------------------------------------

请问是几层板?

出0入54汤圆

 楼主| 发表于 2011-4-2 23:39:53 | 显示全部楼层
我网上买的核心板是6层的,BGA封装的。

出0入0汤圆

发表于 2011-4-2 23:54:11 | 显示全部楼层
回复【6楼】lusson
我网上买的核心板是6层的,bga封装的。

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

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

出0入0汤圆

发表于 2011-4-3 11:16:12 | 显示全部楼层
不错,顶一下~

出0入0汤圆

发表于 2011-4-3 22:02:50 | 显示全部楼层
回复【7楼】eworker
回复【6楼】lusson  
我网上买的核心板是6层的,bga封装的。  
-----------------------------------------------------------------------
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------

2层板稳定么?

出0入0汤圆

发表于 2011-4-3 22:20:15 | 显示全部楼层
回复【9楼】eworker  
回复【7楼】eworker
回复【6楼】lusson  
我网上买的核心板是6层的,bga封装的。  
-----------------------------------------------------------------------
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------
2层板稳定么?
-----------------------------------------------------------------------

很不稳定

出0入0汤圆

发表于 2011-4-4 09:48:01 | 显示全部楼层
回复【10楼】powercxz
回复【9楼】eworker   
回复【7楼】eworker  
回复【6楼】lusson   
我网上买的核心板是6层的,bga封装的。   
-----------------------------------------------------------------------  
看网上有2层板,qfp封装的。
-----------------------------------------------------------------------
2层板稳定么?
-----------------------------------------------------------------------
很不稳定
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-4 23:24:41 | 显示全部楼层
ding

出0入0汤圆

发表于 2011-4-5 10:49:14 | 显示全部楼层
回复【11楼】eworker
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-5 17:03:32 | 显示全部楼层
回复【10楼】powercxz
-----------------------------------------------------------------------

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

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

出0入0汤圆

发表于 2011-4-6 09:29:17 | 显示全部楼层
回复【14楼】eworker
-----------------------------------------------------------------------

不错!

出0入0汤圆

发表于 2011-4-7 17:13:55 | 显示全部楼层
已经移植好atmel网站的uboot1.3.4和linux-2.6.30 呵呵  大家多多交流

出0入54汤圆

 楼主| 发表于 2011-4-9 18:22:37 | 显示全部楼层
我移的也是LINUX-2.6.30
UBOOT是2009.10,是在NOR上的
还没去移至NAND,先扔一边了
目前在先学习写驱动。

出0入54汤圆

 楼主| 发表于 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的设备节点,我们对该节点读写即可。

出0入54汤圆

 楼主| 发表于 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。

出0入54汤圆

 楼主| 发表于 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[10];


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[0] = start_addr<<4;
        memcpy(&bufp[1],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[0].buf = bufp;
        i2c_msgs[0].len = num+1;
        i2c_msgs[0].addr = 0x32;
        i2c_msgs[0].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[0] = 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[0].buf =&bufp[0] ;
        i2c_msgs[0].len = 1;
        i2c_msgs[0].flags = 0;
        i2c_msgs[0].addr = 0x32;

        i2c_msgs[1].buf = &bufp[1];
        i2c_msgs[1].len = num;
        i2c_msgs[1].flags = I2C_M_RD;
        i2c_msgs[1].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[1],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[100];
        if(arg==1)
                cmd = 1;
        else{
                arg --;
                cmd = 0;
                for(i=0;i<arg;i++)
                        buf = atoi(argv[i+1]);
        }
        if(cmd==0){
                addr = buf[0];       
                ret = write_rx8025_data(&buf[1],arg-1,addr);
        }else{
                        while(1){
                        usleep(100000);
                        ret = read_rx8025_data(buf,16,0);
                        if(temp_data!=buf[0]){
                                temp_data = buf[0];
                                printf("date:20%02x-%02x-%02x time:%02x:%02x:%02x\r\n",buf[6],buf[5],buf[4],buf[2]&0x1f,buf[1],buf[0]);
                        }
                }
        }
        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
........................

出0入0汤圆

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

出0入54汤圆

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

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

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

出0入0汤圆

发表于 2011-4-20 12:18:18 | 显示全部楼层
楼上能留个联系方式吗? 我也是在做集中器 jianfeng_2008@hotmail.com
8025驱动里边有的,选上就可以用啦

出0入54汤圆

 楼主| 发表于 2011-4-20 13:11:07 | 显示全部楼层
我不是做集中器的,有另外的同事做,我是在学习

出0入0汤圆

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

出0入54汤圆

 楼主| 发表于 2011-4-20 14:02:29 | 显示全部楼层
电力载波。
力合微,不知道你听过没。。

出0入0汤圆

发表于 2011-4-20 18:29:37 | 显示全部楼层
回复【27楼】lusson
电力载波。
力合微,不知道你听过没。。
-----------------------------------------------------------------------
   哦,想起来了,前段时间还在论坛招人来着,^_^

出0入17汤圆

发表于 2011-10-27 09:30:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-27 10:22:38 | 显示全部楼层
准备开动自己的9260核心板了,,最近又睡了很久,,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 06:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表