This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【89美金 BeagleBone 板子等您拿】- 社区周年有奖征文活动开始啦- TI Sitara 和我的设计之路

Other Parts Discussed in Thread: MSP430F149, AM3359, LM3S811, MSP430G2231, CC2540, AM3517, AM3505, TPS65910, ISO1050, DP83848C, AM3715, AM1808, DM3730, OMAP-L138, MSP430F449, SYSCONFIG, LM3S6432

【89美金 BeagleBone 板子等您拿】-
社区周年有奖征文活动开始啦-
TI Sitara 和我的设计之路
Texas Instruments
2012 年 8 月 8 日 TI 中文社区上线一周年啦 ! 为感谢广大客户对 TI Sitara 产品的关注和支持,从 8 月 2 日到 10 月 7 日,我们诚邀您来分享您在学习或工作中关于应用 TI Sitara 产品的设计心得

我们相信业内同仁的分享和交流为彼此提供宝贵的经验借鉴,同时真诚希望 TI 官方社区成为大家共同学习和探讨技术的一个网上家园!
   
发贴要求(不符合下面要求将不具备获奖资格)
每篇主题不少于 300 字
内容要求清晰详细写出设计心得的具体过程(例如设计中使用哪款产品碰到的问题及其解决的方法和步骤。)
发表以跟贴形式,需为原创贴 (最好同时配上合适的图片或视频)
奖项设置
征文奖交由 TI 技术专家团队评选,取前十名为优秀分享奖
优秀分享奖(10名)- 89 美元 BeagleBone 开源硬件平台 (附图)+ 16G U盘
阳光普照奖 (100名) – TI 16G U盘
 
优秀分享奖(10名)
89 美元 BeagleBone 开源硬件平台
+ 16G U盘

阳光普照奖 (100名)
TI 16G U盘

 

 

 

  • Beaglebone开发环境的搭建

    1  装好Linux后,开启相应的服务及软件,包括:tftp,NFS,Samba,使用apt-get install安装即可。
       

          安装ti-sdk-am335x-evm-05.03.02.00-Linux-x86-Install 后,可运行其中的setup.sh

          装好后即设置交叉编译链的环境变量:vi ~/.bashrc 后面添加

         export PATH=$PATH:/home/bblpp/ti-sdk-am335x-evm-05.03.02.00/linux-devkit/bin
         
          运行 .  ~/.bashrc ,然后输入arm- 就可以得到arm-linux交叉编译链啦
    2  /etc/xinetd.d/tftp 为tftp的配置文件,默认配置为/tftpboot目录。

       beaglebone开发板中已经支持tftp命令了,所以网络配置好后就可以使用tftp来down一应用程序
         tftp 192.168.1.16 -g -r main

     

    3    NFS:  PC端装好NFS服务,/etc/init.d/nfs-kernel-server 
           编辑/etc/exports 添加:/work/nfsroot *(rw,sync,no_root_squash) 目录。
          beaglebone板子 mount -t nfs 的时候貌似提示不知道的文件系统 无法挂载,想起之前在DM3730的时候也遇到过这样的问题,内核通过NFS启动,但是启动后无法挂载NFS,参考英码的说明文档,用opkg安装了两个文件,就ok了。
    opkg install 先portmap,再nfs。



    挂载的时候使用命令:

    mount -t nfs 192.168.1.85:/work /mnt/nfs -o nolock,proto=tcp,nfsvers=3

    貌似后面不输入那些参数依然无法挂载,也可能是我在局域网中的原因。
    4   配置samba

         apt-get install samba后,增加一个samba的用户名,也可以是登录的用户名

         sudo smbpasswd –a bblpp将用户加到samba用户组中,设置密码后,编辑/etc/samba/sab.conf文件,找到security 项,将其设置为 usersecurity = user,确定下面这项没有被注释:

      passdb backend = tdbsam

         然后在文件最后面增加目录相关设置。可参考如下。
    重启samba服务:service smbd restart(有的是service samba restart)

    5 至此可hello world啦:

    #include "stdio.h"

    int main()

    {

         printf("hello world!\n");

         return 1;

    }

    arm-arago-linux-gnueabi-gcc -o main main.c  生成main

    然后使用tftp命令:tftp 192.168.1.16 -g -r main 即可down进开发板中,增加可执行权限:+x即可
    重启samba服务:service smbd restart(有的是service samba restart)

    smb.zip
  • 基于BeagleBone和DS18B20的温度测量

    作者:chenzhufly QQ:36886052 ( 转载请注明出处) 

    1.  硬件连接
    BeagleBone的P8第6脚GPIO1_3接DS18B20的数据脚,连接关系如下图所示:
    2. 代码修改
    主要修改board-am335xevm.c

    1) 增加头文件
    复制内容到剪贴板
    1. #include <linux/w1-gpio.h>


    2) 增加管脚定义和w1设备
    复制内容到剪贴板
    1. #define BEAGLEBONE_W1_GPIO GPIO_TO_PIN(1, 3)  //P8_6
    2. static struct w1_gpio_platform_data bone_w1_gpio_pdata = {
    3.  .pin                = BEAGLEBONE_W1_GPIO,
    4.  .is_open_drain        = 0,
    5. };
    6. static struct platform_device bone_w1_device = {
    7.  .name                        = "w1-gpio",
    8.  .id                        = -1,
    9.  .dev.platform_data        = &bone_w1_gpio_pdata,
    10. };


    3) 增加初始化函数bonew1_gpio_init
    复制内容到剪贴板
    1. static void bonew1_gpio_init(int evm_id, int profile )
    2. {
    3.  int err;
    4.  err = platform_device_register(&bone_w1_device);
    5.  if (err)
    6.   pr_err("failed to register w1-gpio\n");
    7.  else
    8.   pr_info("w1-gpio connected to P8_6\n");
    9. }


    4) 添加到beaglebone的配置函数
    复制内容到剪贴板
    1. /* Beaglebone Rev A3 and after */
    2. static struct evm_dev_cfg beaglebone_dev_cfg[] = {
    3.         {mii1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
    4. {bonew1_gpio_init, DEV_ON_BASEBOARD, PROFILE_ALL},


    3. 测试结果:
    查看启动信息:

    查看DS18B20的温度值
     
    转换成摄氏度以后的值

  • AM1808 StarterWare软件使用笔记

    本文记录了TI的StarterWare软件包的使用过程,包括bootloader代码移植,CCS5使用,小工具应用,代码烧写。

    StarterWare软件包是TI为其CPU提供的一套软件包,内有bootloader,底层驱动,网络,usb开发包,例程,工具等,内容十分丰富,对于应用软件的快速开发有很大的帮助。

    软件使用CCS5开发,选择Project->Import Existing CCS Eclipse Project选项,弹出如下界面:

     

    点击Browse按钮,选择StarterWare的安装路径,点"确定",弹出下面窗口:

     

    选中bootloader_armv5_am1808_evmAM1808,点击"Finish"按钮,把bootloader项目添加到当前工作区。可以看到,这个bootloader是针对TI的EVM开发板的,针对其硬件开发的。要在hawk板子上跑起来,需要一番修改。

    由于hawk开发板使用的是NANDflash,而工程中默认是SPI Flash,在CCS5界面菜单中,选择project->properties->build->TMS470Compiler ->Predefined Symbols中修改预定义的宏,把SPI改为NAND。

    然后去掉工程中的bl_spi.c,添加bl_nand.c文件,添加nand.lib文件,然后编译。这样的bootloader就可以支持NAND Flash引导了。

    EVM开发板使用mobileDDR存储区,可是hawk板使用DDRII存储器,两者代码不兼容,要修改程序使之支持DDRII。

    • 1. 在bl_platform.h中定义的#define VTPIO_CTL_HIGH 0x00080000有问题,该位在寄存器的第15位,可是程序中定义到了第19位,这是一个明显的bug。
    • 2. 修改bl_platform.c文件中的函数DDRInit(),该函数初始化DDRRAM,原型是初始化Mobile DDR,需要改为支持DDRII RAM。
    • 3. 按照bootandflash 软件包中的device.c文件中的初始化函数DEVICE_ExternalMemInit()修改:

    在bl_platform.h文件中,预定义了DDR_132MHZ的宏,定义了mobile DDR的参数,取消#define DDR_132MHZ,建立#define DDRII_150MHZ宏定义,加入以下宏定义参数:

    #elif defined(DDRII_150MHZ)

          /* Fix DDRII timing values/refresh rates */

      #define DDR2_SDTIMR1               0x264A3209

      #define DDR2_SDTIMR2               0x3C14C722

      #define DDR2_SDRCR                 0xC0000492

      #define DDR2_SDRCR_CLEAR           0xC0000000

      #define DDR2_SDCR                  0x00134832

      #define DDR2_PHYC1R           0X000000C5

      #define VTPIO_CTL_HIGH             0x00008000

    • 4. 主要设置SDCR寄存器,根据AM1808 TRM和UBL的初始化函数DEVICE_ExternalMemInit(),修改DDRInit()函数如下:
    • 5. DDRInit()函数:

    static void DDRInit(void)

    {

        unsigned int sdcr;

        PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_DDR2_MDDR,

                                  0, PSC_MDCTL_NEXT_ENABLE);

        if (HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) &

                                                    SYSCFG1_VTPIO_CTL_POWERDN)

        {

             /* Set IOPWRDN bit, powerdown enable mode */

            HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) |=

                                              SYSCFG1_VTPIO_CTL_IOPWRDN;

             /* Clear POWERDN bit (enable VTP) */

            HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) &=

                                              ~SYSCFG1_VTPIO_CTL_POWERDN;

            //CLRZ seque is 101

            /* Set CLRZ bit */

        HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) |=

                                                   SYSCFG1_VTPIO_CTL_CLKRZ;

             /* Clear CLRZ bit */

        HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) &=

                                              ~SYSCFG1_VTPIO_CTL_CLKRZ;

        /* CLRZ bit should be low at least for 2ns */

            Delay(4);

            /* Set CLRZ bit */

        HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) |=

                                               SYSCFG1_VTPIO_CTL_CLKRZ;

            /* Poll ready bit in VTPIO_CTL Untill it is high */

        while (!(( HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) &

                                                         VTPIO_CTL_HIGH ) >> 15));

            /* Set Lock bit for static mode */

        HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) |= SYSCFG1_VTPIO_CTL_LOCK;

            /* set PWRSAVE bit to save Power */

        HWREG(SOC_SYSCFG_1_REGS + SYSCFG1_VTPIO_CTL) |=

                                              SYSCFG1_VTPIO_CTL_PWRSAVE;

        /* VTP Calibration ends */

        }

        //sdcr取预设的值

        sdcr = DDR2_SDCR;

        //sdcrbootlocktimlock先置位,再写0和各自控制的位域。

        sdcr = sdcr |(DDR2_MDDR_SDCR_BOOTUNLOCK);

        sdcr = sdcr |(DDR2_MDDR_SDCR_TIMUNLOCK);

        /* Set SDCR */

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDCR) |= (sdcr & (~DDR2_MDDR_SDCR_BOOTUNLOCK));

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDCR) |= (sdcr & (~DDR2_MDDR_SDCR_TIMUNLOCK));

        /* Set EXT_STRBEN and PWRDNEN bit of DDR PHY control register,

                                       assign desired value to the RL bit */

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_DRPYC1R) = DDR2_PHYC1R;

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDTIMR1) = DDR2_SDTIMR1;

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDTIMR2) = DDR2_SDTIMR2;

        /* CLEAR TIMINGUNLOCK */

        //HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDCR) &= ~DDR2_MDDR_SDCR_BOOTUNLOCK;

        /*  IBANK_POS set to 0 so this register does not apply */

        //mobile DDR才需要设置这个寄存器

        //HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDCR2 ) = DDR2_MDDR_SDCR_IBANK_ONE;

        /* SET the refreshing rate */

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR) = DDR2_SDRCR;

        /* SyncReset the Clock to SDRAM */

        PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_DDR2_MDDR,

                                  0,PSC_MDSTAT_STATE_SYNCRST);

        /* Enable clock to SDRAM */

        PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_DDR2_MDDR, 0,PSC_MDCTL_NEXT_ENABLE);

        /* Disable Self refresh rate */

        HWREG(SOC_DDR2_0_CTRL_REGS + DDR2_MDDR_SDRCR ) &= ~DDR2_SDRCR_CLEAR;

    }

    再次检查,写-读一个DDR内存,数据无误,说明修改DDRII ram成功。

    烧写bootloader和应用程序:

    从TI网站上下载安装aisTools工具包。会安装两个程序,一个是AISgen,一个是Uart Boot Host,前一个是生产AIS格式的工具,后一个是串口引导工具,这个工具不能烧写,只能从串口下载一个程序运行。

    拷贝BootandFlash 包中的sfh_OMAP-L138.exe程序,starterware Tools工具中的out2rprc.exe程序到、cygwin/flash/目录。

    把boot.out和rtcClock.out拷贝到/cygwin/flash/目录下,运行AISgen for D800K800.在General页面选择ARM,NAND Flash选项,其它默认,打开boot.out文件,如下图所示:

     

    点击GenerateAIS按钮,输出boot.ais文件。这个文件就是要烧写到NAND Flash中的bootloader。

    运行Cygwin,进入flash目录,运行./out2rprc.exe rtcClock.out rtc.bin,生产应用程序的二进制文件。

    使用BootandFlash 包中的sfh_OMAP-L138.exe程序,首先擦除flash:

    ./ sfh_OMAP-L138.exe -erase -targetType AM1808 -flashType NAND -p COM1

    把开发板设置为UART引导模式,启动开发板,完成擦除。

    烧写flash,AM18081内部的RBL程序对UBL要求的格式是AIS,所以boot程序需要格式化为AIS格式,而应用程序就不需要AIS格式了,但是要格式化为bin格式。

    ./ sfh_OMAP-L138.exe -flash boot.ais rtc.bin -targetType AM1808 -flashType NAND -p COM1

    复位开发板完成烧写。

    然后把开发板的启动模式设置为NAND引导,重新上电启动,出现以下界面:

     

    可以看到,StarterWare 的bootloader已经引导起来,并运行应用程序。

    AM1808 StarterWare软件使用笔记.doc
  • GMPC的片寻和数据输出

          最近研究AM3730的GPMC与FPGA的通信,主要是涉及到GPMC这一块,之前就没有Linux基础,刚开始的时候进展很慢。前一个月用来熟悉Linux和摸清一个方向,摸清GPMC在内核的目录之后,开始真正的GPMC之旅。 GPMC相比于我以前所做过的单片机,主要有两点大的区别。第一是GPMC的片选寻址机制,第二是GPMC的数据输出时的写法。
          首先来讲讲GPMC的片寻,GPMC总共有八个片寻CS0-CS7,其中CS0-1是用来做flash的,和FPGA通信可以从CS2-CS7里面选。在GPMC的寄存器里,一般用到的也就是CONFIG1-CONFIG7这七个配置寄存器,关于片寻的在CONFIG7里。CONFIG7的意义在于,当处理器检测到你往一个地址里写数据,如果这个地址在GPMC的地址范围内的话(对AM3730是0x00000000-0x40000000),它就将地址送到GPMC的地址解码器,在地址解码器里,它将这个地址与各个CONFIG7里的掩码位相与,如果相与后得到的新地址与CONFIG7的base address相同,则相应的片寻位置位,就是变成低电平。
          理解了片寻的置位过程后,再来讲讲GPMC数据输出。以前做单片机的时候,单片机总会为你提供一个data寄存器或者输出端口的地址,往这两个的地址里写好数据它会自动按规则将数据送到端口输出,依照这样的思路我在3730的技术手册里不断的找GPMC数据寄存器或者是输出端口的地址地址,找了好久没找到,后来我分析网口和flash的代码时发现,他们对硬件地址的写入操作只涉及到CONFIG1-7这七个寄存器,并没有特定的地址寄存器或者端口地址,然后直接往CONFIG7申请好的地址里写数据就行了,以此我就猜测GPMC的地址数据输出都是由硬件自动完成的,根本不需要有特定的数据寄存器,或者可以理解为申请好的与片寻对应的地址空间都是数据寄存器,往这些地址里写数据就能直接在输出的数据端口检测到,同时地址线的输出也是由3730的硬件自动完成的,只要是在片寻地址空间内的地址,他都会往GPMC的地址线上输出。后来用示波器来检测确实证实了我这一猜想,对我来说这有点像是颠覆了我对数据口控制的认识,只能说硬件的设计越来越智能化,很多协议和时序上的东西越来越多由硬件自己就完成,而减少了开发人员在硬件上所耗费的时间。
          理解了这两点,其实GPMC就做的差不多了,接下来的就只是在时序上与下位机的匹配问题,调一调时序就基本上能通信了。

  •       最近在开发Beaglebone板,在这里我分享一下自己的开发过程及经验,希望大家共同学习,共同进步。我的经验分享包括三个部分:Beaglebone嵌入式平台搭建、D_CAN开发、MCSPI开发。附件的文档《我的beaglebone开发之路》是我开发的经验总结,自己的摸索难免有误,也希望各位专家以及开发者给予指导!

    我的Beaglebone开发之路.pdf
  •  

      官网如下:http://beagleboard.org/static/beaglebone/latest/README.htm

    目前使用TI提供的linux开发环境作为开发平台。需要有一台运行能运行linux环境的计算机。

    首先需要到TI官网下载最新的sdk:http://software-dl.ti.com/dsps/dsps_public_sw/am_bu/sdk/AM335xSDK/latest/index_FDS.html   下载ti-sdk-am335x-evm-05.05.00.00-Linux-x86-Install 然后运行这个文件:

    1  sudo chmod a+x ti-sdk-am335x-evm-05.04.01.00-Linux-x86-Install

    2 ./ti-sdk-am335x-evm-05.04.01.00-Linux-x86-Install

    按提示一路执行下来即可。

    安装后找到ti-sdk-am335x-evm-05.04.01.00文件夹,运行setup.sh,如果你用的系统不是ubuntun 10.04lts,它会提示环境不支持安装,这真是个狗屁的设定,我用的系统是ubuntu11.04,结果不通过,唯有分析一下setup.sh干了些啥事。

    找到bin目录下setup-host-check.sh,如果不想换系统(ubuntun 10.04lts),可以尝试修改一下脚本,我把它改成了下面那样,哈哈。

    之后,再用 运行命令 sudo ./setup.sh  一路回车即可。

    这个setup.sh的脚本做了些什么东西呢?

    看源码可以知道,它为我们安装了nfs,tftp,minicom,uboot环境。完成了上述工作后,让我们看看TI为我们提供了什么东西吧

     

     

    board-support目录放了linux源码,u-boot源码,额外驱动,和已经编译好的u-boot,uImage,MLO(MLO是用来从micro SD里面引导u-boot用的)。

    docs是其相关文档

    inux-devkit是开发用的一些工具,交叉工具链在其bin目录,最好在path里面加入其路径。

    在/etc/environment 中修改

    如图:

    之后重启一下虚拟机新的PATH即可生效。

    有了交叉工具链,就可以开始编译uboot和kernel了。

    编译uboot时,输入如下指令:

    等编译完成时,在am3359x下可以得到uboot.img和MLO.

    接下来就是编译内核:

    生成 .config 文件,可以使用如下命令:

    配置内核:

    开始编译内核,生成uImage

    编译内核时,需要安装有库 ncurses  library

    Ubuntu下可以如下安装:

    Sudo apt-get install libncurses5-dev 

    制作uImage也需要mkimage这个工具,ubuntu下安装方法:

    Sudo apt-get install uboot-mkimage

    编译好uImage之后,到了生成模块ko

    生成的ko分散在不同的地方,可以用如下命令复制到文件系统相应的地方:

    至此,需要的ubootkerne已经编译完成,接下来的就是制作我们的TF卡啦。

    开始

    我准备的环境:

       1 虚拟机Vmware8

       2 ubuntu11.04

       3 安装好的ti-sdk-am335x-evm-05.04.01.00

       4 一张4G的TF 卡

    格式化TF

    插上TF卡时,通常三FAT32格式的,但在linux下,我们需要一个ext3文件系统,又因为beaglebone没有nandflash,只能把文件系统放在tf卡上,所以我们需要格式化tf卡,让其拥有一个ext3的文件系统。

    操作方法:

    转到ti-sdk-am335x-evm-05.04.01.00/bin:

    然后如图:

    接下来选择分区数目,我选择了两个分区,一个boot的分区,用于存放ubootkernel的映像文件,另一个rootfs分区,用于存放根文件系统。

    然后继续执行:

    选择n退出脚本,选择自己构建文件系统。

    先到uboot目录下复制文件,如图:

    2再到linux目录复制kernel

    3解压TI为我们制作好的文件系统到tf卡的rootfs分区:


    4把之前编译好的ko放到文件系统中:

    至此,我们的tf算是制作完成了,卸载后,插入beaglebone中,看运行效果吧 :)

    上点后,倒计时结束后,uboot开始引导linux,过了大概10秒钟,就可以看到登陆界面:

    Enjoy!!

    利用做好的系统,利用手头的GPS模块做了个串口的实验,

    GPS  - > UART4 

    UART4对应/dev/ttyO4. 硬件连接如图:

    把编译好的测试程序下载到rootfs中,运行bone,看到:

    然后 输入命令 ./uart_test  即开始接受GPS数据,并保存在指定的文件中。根据提示  输入 “quit”即可退出程序。 在后面附上源程序,有兴趣的可以试一下 :) 

    再附上几份我学习的资料和一个基于beaglebone设计的扩展板分享给大家。一个回复只能有一个附件吗~~ 好吧,在楼下接着吧。

     

    my_serial.zip
  • 忘记写标题了,上面是一个手把手教你制作TF卡的教程(写了两天 .. )

    再接着附上一份用于小车项目的一个扩展板原理图pdf,涉及视频传输及显示,重力传感器遥控等

     

    bone_cable.pdf
  • 还有几份学习资料,有同学需要的再上传吧,不占版面了  :)   最后希望能拿个属于自己的狗板吧!

  • AM3517板整个开发过程记录

    最近时间一直在做一个新项目,同时也是对旧项目的硬件平台进行一个升级,所以用了sitara am3517 Cortex-A8做了一块主板。以下简单介绍一下整个开发过程的建立以及在中间遇到的一些问题及其解决方法。

    1、平台硬件资源简介

    CPU:TI Sitara AM3517+

    DDR2:SAMSUNG K4T1G164QE-HCE7

    Nand:SAMSUNG K9F1g08UOD

    PHY:NS DP83848C

    建立TFTP Server

    1、安装相关软件包:Ubuntu tftp(服务端),tftp(客户端),xinetd

    root@xf:/# apt-get install tftpd tftp xinetd

    正在读取软件包列表... 完成

    正在分析软件包的依赖关系树      

    正在读取状态信息... 完成      

    下列【新】软件包将被安装:

     tftp tftpd xinetd

    升级了 0 个软件包,新安装了 3 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。

    需要下载 185kB 的软件包。

    解压缩后会消耗掉 578kB 的额外空间。

    获取:1 mirrors.sohu.com/ubuntu karmic/universe tftp i386 0.17-17ubuntu1 [17.6kB]

    获取:2 mirrors.sohu.com/ubuntu karmic/main xinetd i386 1:2.3.14-7ubuntu2 [151kB]

    获取:3 mirrors.sohu.com/ubuntu karmic/universe tftpd i386 0.17-17ubuntu1 [16.5kB]

    下载 185kB,耗时 2秒 (79.6kB/s)

    选中了曾被取消选择的软件包 tftp。

    (正在读取数据库 ... 系统当前共安装有 173693 个文件和目录。)

    正在解压缩 tftp (从 .../tftp_0.17-17ubuntu1_i386.deb) ...

    选中了曾被取消选择的软件包 xinetd。

    正在解压缩 xinetd (从 .../xinetd_1%3a2.3.14-7ubuntu2_i386.deb) ...

    选中了曾被取消选择的软件包 tftpd。

    正在解压缩 tftpd (从 .../tftpd_0.17-17ubuntu1_i386.deb) ...

    正在处理用于 man-db 的触发器...

    正在处理用于 ureadahead 的触发器...

    正在设置 tftp (0.17-17ubuntu1) ...

    正在设置 xinetd (1:2.3.14-7ubuntu2) ...

    * Stopping internet superserver xinetd                                                                              

    [ OK ]

    * Starting internet superserver xinetd                                                                              

    [ OK ]

    正在设置 tftpd (0.17-17ubuntu1) ...

    Note: xinetd currently is not fully supported by update-inetd.

         Please consult /usr/share/doc/xinetd/README.Debian and itox(8).

    2、建立配置文件

    在/etc/xinetd.d/下建立一个配置文件tftp

    sudo vim tftp

    在文件中输入以下内容:

    service tftp

    {

    socket_type = dgram

    protocol = udp

    wait = yes

    user = root

    server = /usr/sbin/in.tftpd

    server_args = -s /tftpboot

    disable = no

    per_source = 11

    cps = 100 2

    flags = IPv4

    }

    保存退出。

    3、建立Ubuntu tftp服务文件目录(上传文件与下载文件的位置),并且更改其权限

    sudo mkdir /tftpboot

    sudo chmod 777 /tftpboot -R

    4、重新启动服务

    sudo /etc/init.d/xinetd restart

    至此Ubuntu tftp服务已经安装完成了,下面可以对其进行一下测试。(在当前目创建2.c,在tftpboot目录下创建1.c和2.c,且

    tftpboot目录下2.c权限为777)

    执行get命令时,保证tftpboot目录下的文件权限为777,

    执行put命令时,必须先在tftpboot目录下新建一个和上传文件同名的文件且权限为777.

    root@xf:/home# tftp 127.0.0.1

    tftp> get 1.c

    Received 7 bytes in 0.1 seconds

    tftp> put 2.c

    Sent 10 bytes in 0.0 seconds

    tftp> quit

    qt4编译

    make confclean

    ./configure -xplatform /qws/xxxx  -embedded arm -static -little-endian/-big-endian

    2、编译

    安装ubuntu10.04,toolchain等相应环境。

    export PATH=$PATH:/opt/4.4.3/bin/

    编译x-loader

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- am3517evm_config

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    ./signGP x-load.bin

    编译u-boot

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- am3517_evm_config

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-

    编译kernel

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- am3517_evm_defconfig

    make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage

    setenv bootargs 'mem=256M console=ttyS2,115200n8 noinitrd root=/dev/mtdblock4 rw rootfstype=jffs2 omapfb.rotate=1 omapfb.rotate_type=1 omap_vout.vid1_static_vrfb_alloc=y;'

    3、利用busybox制作root file system

    编译busybox

    make menuconfig

    (1)

    (2)

    (3)

    make

    make install

    构建框架

    cd /home/user/

    mkdir rootfs

    cd rootfs

    mkdir –p dev lib etc sys proc mnt var tmp data

    chmod 777 *

    添加内容

    /bin与/sbin目录

    cp –rf busybox-1.17.2/_install/bin ./

    cp –rf busybox-1.17.2/_install/sbin ./

    /dev目录

    mknod dev/console c 5 1

    mknod dev/null c 1 3

    chmod 777 dev/*

    /lib目录

    cp /opt/4.4.3/arm-none-linux-gnueabi/lib/* ./lib/

    /etc目录

    fstab:指明需要挂载的文件系统

    inittab:init进程的配置文件

    profile:用户环境配置文件

    init.d目录:启动文件目录,该目录中有个名为rcS的文件,里面存放了系统启动时配置以及自启动加载的进程等。

    /proc、/mnt、/var、/tmp目录

    基本都是空目录。

    /mnt一般用做临时挂载某个文件系统,比如说u盘。

    /tmp用于存放临时文件,我挂载为了ramfs,用于下载文件,应用程序放置,内存文件系统访问速度相当快,不比nand,加快了访问速度,而且增强了nand寿命。

    /data目录

    挂载为了yaffs2文件系统,可以用于读写,用于存储一些需要保存的数据。

    4、制作jffs2

    mkfs.jffs2 -r ./rootfs -o rootfs.jffs2 -e 0x20000 -p=0x1000000 -n

    5、烧写程序

    uboot下烧写x-loader

    mw.b 0x80000000 0xff 0x100000

    tftp 0x80000000 192.168.0.100:x-load.bin.ift

    nand erase 0 40000

    nandecc hw

    nand write.i 0x80000000 0 40000

    烧写u-boot

    mw.b 0x80000000 0xff 0x100000

    tftp 0x80000000 192.168.0.100:u-boot.bin

    nand erase 80000 1c0000

    nandecc sw

    nand write.i 0x80000000 80000 1c0000

    烧写kernel

    mw.b 0x80000000 0xff 0x500000

    tftp 0x80000000 192.168.0.100:uImage

    nand erase 280000 500000

    nandecc sw

    nand write.i 0x80000000 280000 300000

    6、测试ramdisk

    nfs

    setenv bootargs 'console-ttyS2,115200n8 noinitrd rw ip=192.168.0.250:192.168.0.103:192.168.0.1:255.255.255.0::eth0:off eth=00:40:01:2B:64:60 root=/dev/nfs  nfsroot=192.168.0.103:/home/realtimedsp/workdir/am3517/filesys,nolock,mem=256M'

    tftp

    tftp 0x81000000 ramdisk.gz

    setenv bootargs mem=256M console=ttyS2,115200n8 root=/dev/ram0 initrd=0x81000000,40M ramdisk_size=40960;

    setenv bootcmd 'nand read.i 0x80000000 280000 500000;bootm 0x80000000'

    boot

    更新root

    flash_eraseall -j /dev/mtd4

    mkdir -p /mnt/nand

    mount -t jffs2 /dev/mtdblock4 /mnt/nand

    cd /mnt/nand

    mkdir -p /mnt/data

    mount -t jffs2 /dev/mtdblock5 /mnt/data

    cd /mnt/data

    tftp -r flashImage.tar -g 192.168.0.103

    tar zxvf flashImage.tar

    分区表

    x-loader 0-0x80000

    uboot    0x80000-0x240000

    param    0x240000-0x280000

    kernel   0x280000-0x780000

    root      0x780000-0x1b80000

    7、空板烧录

    在使用flash V1.6烧录时,注意根据使用的flash型号修改以下的几个配置文件

    因为我们使用的是Sumsung K9F1G08.故修改以下信息

    omapflash2nd.txt

    修改CUSTOM_AM35XX_BOARD dnld_startup_omap3_gp_1g.2nd

    configuration_custom_am35xx.txt

    烧写x-loader

    memory NANDINFO1BITBOOT   driver Targets\Flash-Drivers\nand_onfi_16bit_8bit.bin parameters gpmc 0x6E000000 cs 0 address 0x30000000 bberase 0 onfi 0 bpp 2048 sbpp 64 ppb  

    64 bpl 1024 l 1 acv 0x22 f 0x0018 eccoffset 2

    烧写uboot

    memory NANDINFOSWECC      driver Targets\Flash-Drivers\nand_onfi_16bit_8bit.bin parameters gpmc 0x6E000000 cs 0 address 0x30000000 bberase 0 onfi 0 bpp 2048 sbpp 64 ppb 64  

    bpl 1024 l 1 acv 0x22 f 0x0018 swecc 1 eccoffset 40

    烧写kernel

    memory NANDINFOSWECC      driver Targets\Flash-Drivers\nand_onfi_16bit_8bit.bin parameters gpmc 0x6E000000 cs 0 address 0x30000000 bberase 0 onfi 0 bpp 2048 sbpp 64 ppb 64  

    bpl 1024 l 1 acv 0x22 f 0x0018 swecc 1 eccoffset 40

    GPMC_CONFIG1_0       0x00000800 bit12-13是表示是8bit 还是16bit k9f1g08是8bit flash

    f为什么是0x0018,因为bit0,为1时代表是16bit flash,为0时,代表8bit flash

    出现如下错误提示时,请使用erase all ,在烧写每个软件时,请先擦除,再写入

    hwecc 1bit ecc格式

    Texas Instruments X-Loader 1.45 (Dec  8 2009 - 22:58:46)

    ECC Failed, page 0x00080000

    QT编译

    processors.wiki.ti.com/.../Building_Qt

    ./configure -prefix /home/realtimedsp/workdir/Mike/qt-everywhere-opensource-src-4.6.2/MikeQT -embedded arm –release –opensource –static –fast -no-largefile -platform qws/linux-x86-g++ -xplatform qws/linux-am3517-g++ -depths 16 –no-phonon –no-phonon-backend –no-svg –no-webkit –no-javascript-jit –no-script –no-scripttools –no-declarative -no-mmx -no-3dnow -no-sse -no-sse2 -no-glib -no-cups -no-accessibility –qt-gif -no-openssl -no-gtkstyle -little-endian

    -qt-mouse-pc -qt-mouse-linuxtp

    -qt-mouse-linuxinput -plugin-mouse-linuxtp -plugin-mouse-pc -fast

    到目前为止,xloader,uboot,kernel,rootfs已经成功运行,但是网络与音频驱动还未调试成功,还需继续前进,附上一块实物图,因需要保密,故上传一部分AM3517主板实物图。

    加油,加油。争取早日把主板完整调好。

  • 所要实现功能描述 AM335x智能家居控制器:主要应用于设备的控制,代替目前通用的智能家居控制板。实现设备自动控制。

    时间安排/项目实施细则 9.19前,提交初步原理图和功能描述

    计划:

    9.18~9.26 继续熟悉BeagleBone有关的资料(包括LINUX和其他资料)和画图。

    9.27~10.19画好板。PCB制板。弹性写出多篇心得文章(有关电路的)

    10.19-11.31。调试驱动和电路。并完成多篇有关心得文章。

    预期成果 完成一个基本的可以跑起来的加工设备控制板。并公布有关结果和经过及代码。和电路

    个人补充说明 DIY的快乐就是相互学习。

    AM335x智能家居控制板设计

    电路:

    1,  主控制电路

    2,  显示电路,显示屏触摸屏

    3,  按键电路(可选)

    4,多路信号输入电路

    5,多路输出继电器电路

    6,通信电路(以太网)

    7,RS232 扩展传感器用(如加热传感器等)

    8,RS485(扩展传感器或通讯用)

    9,CAN 接口(通讯用,原理图还没画上,后面修改)

    10,FLASH存储电路

    11,电源电路

    12,无线通讯电路

    电路采用BeagleBone已有电路,外加底板的形式。电路在后面贴上。

    软件:

    1,  LINUX 平台移植

    2,  显示驱动(移植BeagleBone自带的)

    3,  按键驱动

    4,  GPIO输入信号驱动

    5, GPIO输出驱动

    6, RS485驱动修改

    7, FLASH驱动

    8, 智能家居的一个整体应用软件。

  • 基于MSP430内嵌温度传感器的温度告警系统

    A Temperature Alarm System Based on the Embedded Thermal Sensor of MSP430

    摘 要:MSP430微控制器的诸多系列中都有内嵌的温度传感器。本文提出了一种基于这个传感器的温度报警系统的方案。然后分析了产生虚警和漏警的原因,并提出了减小这两种概率的办法,最后给出了以MSP430F449为例的C语言程序。

    关键词:MSP430;温度传感器;告警

    1. 系统的总体方案

    MSP430微控制器MCU(Micro Controller Unit)是TI公司推出的一款具有丰富片上外围的强大功能的超低功耗16位混合信号处理器。其中包括一系列的器件,可以应用在不同的场合。MSP430与MCS-51的一个显著不同就是它在片内集成了模数转换(ADC)模块,使得A/D转换得以容易的实现。其中在MSP430的13x、14x、43x、44x系列器件中,都有内嵌的温度传感器。它的输出送入ADC12模块的通道10,然后对其进行A/D转换,进而可以测量芯片内的温度。在本告警系统中就是采用这个温度传感器的输出来实现温度的实时告警。

    图1 基于MSP430F449内嵌温度传感器的温度告警系统原理图

    本系统的基本方案是这样的:ADC12模块的通道10对芯片的温度进行测量,当测量温度高于或者低于预设告警值时,便通过I/O端口的输出来驱动LED,显示告警状态。芯片在整个过程中处于低功耗模式。本系统的原理比较简单,图1给出其简单的原理图。

    2. 温度传感器的测温原理和过程

    MSP430内嵌的温度传感器实际上就是一个输出电压随环境温度而变化的温度二极管,表1是它的一些基本电气特性。按照TI公司提供的资料,这个温度二极管输出的电压和对应的温度近似成简单的线性关系。所测温度可由的公式(1)求出:

    (1)

    其中,T:测量到温度,单位℃;

    VST :ADC模块的通道10测量到的电压,单位mV;

    V0℃ :0℃时传感器的输出的电压,单位mV;

    TC SENSOR :传感器的传感电压,即输出电压随温度的变化情况,单位mV/℃。数值上等于温度每升高1℃,增加的输出电压。

    对于12位的ADC模块,VST可以通过下面的A/D转换公式求得:

    (2)

    其中,ADC12CH10:通道10所测得的温度传感器的12位A/D值;

    VR+:正参考电压,可以取内部参考VREF+ 、AVcc或者外部参考VeREF+ ,单位mV;

    VR-:负参考电压,单位mV。通常取VR-=AVss,在这种情况下,求VST的公式进一步简化为:

    (3)

    由(1)式和(3)式可见,把A/D转换所得的结果VST经过简单转换就可得到对应的温度。

    表1:MSP430微控制器温度传感器电气特性表

    参数 测试条件 最小值 典型值 最大值 单位

    V0℃ Vcc= 2.2V/3V 986 - 5% 986 986 + 5% mV

    TCSENSOR Vcc= 2.2V/3V,TA=0℃ 3.55 -3% 3.55 3.55 +3% mV/℃

    tSENSOR Vcc= 2.2V/3V 30 μs

    3. 测量误差及其减小办法

    很容易发现这个温度传感器具有较大的测量误差,实验也证明了这一点。这将导致较大的虚警概率或漏警概率。因此要想实用它,必须要进行误差校正,以减小这两个概率。产生误差的原因主要有以下几个方面:

    3.1 0℃基准参考电压误差

    由表1可见,V0℃的最大误差可达5%。所以由它导致的最大误差为: 。这么大的误差,无疑会导致很大的虚警或者漏警概率,所以必须要对它进行校准。

    用TRT 表示室温,VRT表示室温下温度传感器的输出电压,则由公式(1)可得:

    (4)

    由式(1)减式(4)可得:

    (5)

    因为MSP430是低功耗的,所以在开机的一段时间内,它的片内外温度可以认为是一样的。因此我们可以用温度计测量出开机时的室温TRT,将开机时测得的VST作为VRT,然后将VRT和TRT代入(5)式进行温度计算。这样就消除(至少是减小)了由V0℃不准确而导致的测量误差,从而减小了虚警和漏警概率。

    3.2 传感电压误差

    对于工业级标准,工作温度范围为:-20℃ ~ +85℃。而对于一个实际的系统,绝大多数时间工作在0℃ ~ +50℃之间。因此,用 做基准参考会导致较大的积累误差。从表1可以看出,由传感电压引入的最大误差约为 。如果待测温度为50℃,用0℃作参考,则最大误差为: ℃;而用室温(假定TRT = 25℃)作参考,则误差为: ℃,比用0℃作参考时减小了一半。因此采用室温作为温度参考,是减小积累误差的一个较好的方案。不过由传感电压引入的误差相对于 来说还是比较小的。

    3.3 A/D转换引入的误差

    由芯片资料可见,对于12位A/D,因漏电流引入的误差 1LSB,这个误差可以忽略不记。但是由于布线技术和电源和地线等的不良而导致的电源线、地线上的纹波和噪声脉冲对转换结果的影响却不能不考虑。如图1所示,如果数字地DVss和模拟地AVss是分开供电的,则可以在这两点之间接入反相并接的二极管对,以消除700mV的电压差。另外如果参考电压(VR+ - VR-)较小,那么纹波的影响会变得更明显,从而影响转换精度。因此,电源的清洁无噪声对A/D转换的精度有很大的影响。当然在可能的情况下还是要尽量采用较大的(VR+ - VR- )。还有就是尽量不要采用内部参考,内部参考不太稳定,会影响转换的精度。仔细安排各自接地点的旁路电容对于减小噪声的影响也是很有用的。图1给出了一种典型的退耦电容配置方式,在芯片的电源以及外接参考电压(图中没有画出)的引脚上并接一个10uF的钽电容和一个0.1uF的瓷片电容能够较好的起到抑制噪声的作用。

    采用内嵌温度传感器测量温度,要受到很多方面的影响。除了上面讨论的方法,还有减小误差的一般方法,比如多次测量取平均等。所以要综合考虑各方面的因素,才能取得满意的效果。

    4. 软件描述

    MSP430另一个突出优点就是用C语言编写程序简捷而且编译效率很高。下面就以MSP430F449为例来简要描述这个系统的软件实现。图3为程序流程。

    #include "msp430x44x.h" // 包含头文件

    #include <math.h> //包含数学运算头文件

    #define Trt 25 //预先测量到的室温

    #define Th 50 //高温告警温度

    #define Tl 0 //低温告警温度

    int i=0, k=0,Vrt; //定义全局变量

    int ADC_Result[16];

    float T; //测量到的温度

    void init(void); //初始化函数

    void ADC12(void); //A/D转换函数

    void Alarm(float t); //告警处理函数

    void init(void)

    {

    TACTL=TASSEL1+TACLR+MC_1; //定时器初始化,工作在"up"模式

    CCTL0|=CCIE; //使能CCR0中断

    CCR0=0x0FF; //设定定时值

    _EINT(); //打开中断

    P2DIR|=BIT0+BIT1; //P2.0和P2.1为告警输出;

    }

    void ADC12(void)

    {

    ADC12CTL0 &=~ ENC; //在进行设置时首先复位ADC的转换使能

    ADC12CTL0 = ADC12ON+REF2_5V+SHT0_8; //采用内部2.5V参考,打开通道10REFON自动打开

    ADC12CTL1 = SHP+ADC12SSEL_2; //上升沿采样,主时钟,MEM0

    ADC12MCTL0 = EOS + INCH_10+SREF_1; //选择通道10,Vref+为参考电压,进行温度测量

    ADC12CTL0 |= ENC;

    ADC12CTL0 |= ADC12SC; // 开始转换

    if ((ADC12IFG & BIT0)==1) //如果转换完毕,读走数据

    ADC_Result[i]=ADC12MEM0;

    }

    void Alarm(float t)

    {

    if(t>=Th)

    P2OUT|=BIT1; //高温告警

    else if(t<=Tl)

    P2OUT|=BIT0; //低温告警

    else

    P2OUT&=~(BIT0+BIT1); //无告警

    }

    interrupt[TIMERA0_VECTOR] void Timer_A (void) //中断处理子程序//

    {

    int ADC_Sum=0;

    float Vst;

    for (i=0;i++;i<16) //连续进行16次转换,提高精度

    {

    ADC12();

    ADC_Sum +=ADC_Result[i]; //求和

    i++;

    }

    ADC_Sum>>=4; //将ADC_Sum右移4位,相当于除以16.得到平均的结果;

    Vst=( ADC_Sum /4095.0)*2500; //完成转换,得到电压值

    k++;

    #ifndef Trt

    T=(Vst-986)/3.35; //测出用0度作基准的温度

    #else

    if (k==1) Vrt=Vst; //如果定义Trt,则将第一次的转换结果作为室温下的Vrt

    T=(Vst-Vrt)/3.35+Trt; //测出用室温作基准时的温度

    #endif

    Alarm(T); //告警处理

    }

    void main (void)

    {

    init(); //初始化

    LPM1; //进入低功耗模式1;

    }

    5. 结束语

    本文只是对告警部分进行了描述,若是再加上液晶就可以实时显示温度,加上键盘就可以对室温、告警温度进行预设,再对上述程序进行一些改进就是一个实用的系统了。因这两部分相对比较简单和成熟,文中没有进行进一步讨论。

    参考文献

    1. MSP430x4xx Family User's Guide (SLAU056B).

    2. MSP430x44x datasheets (SLAS344). 2002. 1.

    3. 魏小龙. MSP430系列单片机接口及系统设计实例. 北京航空航天大学出版社, 2002. 11.

    4. 谭浩强. C程序设计(第二版).清华大学出版社,1999,12.

  • 基于MSP430 Timer_B的D/A 转换

    摘 要本文分析了利用MSP430的Timer_B 在比较模式下输出的脉宽调制(PWM)

    波来实现D/A 转换的工作原理介绍了利用MSP430F449的Timer_B 的PWM 输

    出产生正弦波和直流电平的方法并给出了对应的硬件电路和C 语言源程序  

    关键词 MSP430F449 脉宽调制D/A 转换  

    D/A Conversion Based on MSP430 Timer_B

    Abstract This paper analyses the principle of utilizing the PWM to realize D/A

    when the MSP430 Timer_B is working in compare mode. It describes the

    method of using the PWM of MSP449F449's Timer_B to create a sine wave

    and a DC level. At last, it gives the corresponding hardware circuit and C

    language program.  

    Key words: MSP430F449; PWM; D/A conversion  

    1 . 1 .1 . 1 . 简介  

    1.1 MSP430 单片机介绍  

    虽然目前在国内市场上应用较多的单片机仍然是8 位单片机但是由美国德州仪

    器TI 公司推出的16 位单片机MSP430具有处理能力强运行速度快低功耗

    指令简单等优点并采用了JTAG技术FLASH 在线编程技术BOOTSTRAP 等诸多

    先进技术因此具有很高的性价比在欧洲市场已得到了非常广泛的应用虽然

    MSP430进入国内市场的时间不是很长但是因其具有以上所述的卓越品质一

    进入国内市场就被众多电子工程师所青睐其中MSP430F449具有7 个工作模式

    可选8 10 12 16 的16 位计数器用其比较模式产生的PWM 可以实现D/A 转

    换D/A conversion  

    1.2 PWM D/A简介  

    很多嵌入式的微控制器microcontroller 应用都需要产生模拟信号这种情

    况下往往是采用集成的或者是分立的数模转换器DAC digital-to-analog

    converter 来实现但是采用脉宽调制PWM pulse-width modulated 信号来

    实现D/A 转换简写为PWM D/A 也是一种常用的方法可以用PWM 信号产生所

    需的直流或交流信号这篇文章以MSP430F449的Timer_B 输出的PWM 为例来产

    生一个200Hz 的正弦波和一个0.5VCC的直流电平实际上类似的方法可以用于

    Timer_A 以及MSP430其它型号的单片机  

    2.  用PWM 实现DAC 的原理  

    2.1 基本原理  

    PWM 信号是一种具有固定周期T 不定占空比   的数字信号如图1所示

    如果PWM 信号的占空比随时间变化那么通过滤波之后的输出信号将是幅度变化

    的模拟信号因此通过控制PWM 信号的占空比就可以产生不同的模拟信号在

    MSP430F449中就是采用CCR0来控制周期T 而用与定时器对应的CCRx寄存器来

    控制可变占空比 进而实现D/A 转换  

    2.2 分辨率  

    基于Timer_B PWM的DAC 分辨率就等于计数

    器的长度通常是CCR0寄存器的值PWM DAC

    的最低有效位是一个计数值分辨率是总的

    计数值  

    Rcounts = Lcounts  

    其中Rcounts是以计数值为单位的分辨率Lcounts是计数器的总计数值例如对8-bit

    DAC 计数器的长度为8 bits 或者256 个计数值那么分辨率也就是8 bits

    或者256  

    更一般的情况下基于PWM 定时器和滤波器的PWM DAC的分辨率等于产生模拟信

    号的PWM 信号的分辨率PWM 信号的分辨率决定于计数器的长度和PWM 计数器能

    够实现的最小占空比用数学表达式如下  

    R counts  =  

    其中 = L

    counts C 是最小占空比

    比特分辨率用下式计算  

    如果PWM 计数器的长度为512 个计数值最小的占空比为2 个计数值那么PWM

    DAC 的分辨率就为 或者以比特表示

    2.3 系统频率  

    PWM 信号需要的输出频率等于DAC 的更新频率因为PWM 信号占空比的每一次变

    化等效于一次DAC 抽样PWM 定时器所需的频率取决于PWM 信号频率和所需的分

    辨率如下所示  

    图1 PWM信号示意图

    在这儿 是所需的PWM 定时器频率 是PWM 信号的频率也就是DAC

    的更新频率n  是所需的比特分辨率下文即将描述怎样采用8-bit PWM DAC

    来同步产生一个200Hz 的正弦波由抽样定理可得最低的抽样频率应该为

    400Hz 但是通常情况下PWM 信号的频率要远高于Nyquist 抽样速率这是因

    为PWM 信号的频率越高对滤波器的阶数就要求越低合适的滤波器越容易实现

    通常抽样速率取Nyquist 速率的16 或者32倍  

    2.4 所需的MSP430资源  

    文中的例子是用MSP430F449的Timer_B 再加外部滤波器来产生一个200Hz 的正

    弦波和一个0.5VCC的直流电平的将Timer_B 配置为16-bit up模式在这种

    模式下计数器计数至CCR0 然后复位从0 开始重新计数给CCR0赋值255 也就

    意味着计数器的长度为8bits CCR1和 TB1用于产生正弦波 CCR2和TB2 用于

    产生直流电平输出模式都选为模式7 即PWM 复位/置位模式如图2 所示

    在这种模式下复位后每一个定时器的输出都为高电平直到计数器达到各自的

    CCRx值时变为低电平当计数器达到CCR0时再置位也就是说CCRx的值决定

    了各自正脉冲的宽带若CCRx的值是变化的就可以产生可变宽度的脉冲下

    文中的正弦波就是用这种办法产生的若不变则产生的是固定宽度的脉冲下文

    中的直流电平就是这样产生的最后SMCLK 用作Timer_B 的时钟源系统采用

    32768Hz 的钟表晶振通过采用内部硬件锁频环FLL frequency-locked-loop

    来校准DCO Digital Control Oscillator 频率为系统提供MCLK/SMCLK时钟  

    图2  输出模式7 PWM 复位/置位示意图

    3.  实现电路  

    用Timer_B PWM实现DAC 外围电路比较简单如图3 所示实际上外围电路就是

    晶振电路和RC低通滤波器  

    图3 MSP430F449 实现D/A 电路图

    3.1 正弦信号的产生  

    在这个例子中一个正弦波用32个抽样值生成正弦波的频率为200Hz 所以

    每秒要抽样200 32=6400 次也就是说 =6.4KHz 每完成一次抽样要计数

    2

    8

    所以所需的时钟频率为 抽样值包

    含在程序开始的一个正弦表中通过调用中断函数在每个PWM 周期结束时将

    新的正弦波抽样值载入捕获/比较寄存器CCR1中 因此产生的PWM 信号的脉冲宽

    度就决定了正弦波在每一个时刻的抽样值将这个PWM 信号经过低通滤波即得

    所需的正弦波  

    3.2 直流电平的产生  

    直流电平产生比较简单因为它对应的PWM 占空比是一定的直流电平直接正比

    于PWM 信号的占空比要产生0.5VCC的直流电平PWM 的占空比显然是50% 考

    虑到损耗实际应大一些 只需要简单地将CCR2的值设置为128 并且无须

    变化就可以得到50%占空比的PWM 信号将得到的PWM 信号通过RC网络进行低

    通滤波即可得到0.5VCC的直流电平  

    3.3 滤波器设计  

    对两路输出都采用了结构简单

    的RC滤波器如图3 所示之

    所以采用这种结构一是因为

    RC滤波器结构简单二是为了

    实现低功耗尽量避免采用有

    源器件  

    用于交流信号的滤波器是一个

    双极点级联RC滤波器如果滤

    波器阶数过高可以采用提高

    的抽样频率的办法来降低滤波

    器阶数滤波器的截至频率f c

    由下式来计算

    当R2 ? R1 时滤波器的响应较

    好但是如果截至频率很接近信号带宽边沿将会导致相当大的衰减因此为了

    减小滤波器的衰减截至频率应该大于信号带宽边沿但是要远小于PWM 信号的

    频率  

    用于产生直流电平的滤波器仅仅是用来储存电荷的而不像交流信号滤波器那样

    用来滤波因此采用了一个简单的单极RC滤波器  

    4.程序流程  

    用MSP430F449的Timer_B 的PWM 来产生正弦波和直流电平的程序比较简单流

    程如图4 所示MSP430F449自身有FLL 可用它来实现DCO 的频率校准但是

    DCO 的频率只能锁定在ACLK的整数倍上所以对于没有FLL 的器件或者所需

    频率不是ACLK整数倍的情况下要用Timer_A 或者其它的定时器进行DCO 频率

    校准这也就是所谓的"软锁频" 事实上实际的D/A 转换常常是一些随时间变化

    的非周期信号它们对时钟的精度要求不是很高因此大多数情况下硬件FLL

    是可以胜任的  

    5.  程序清单  

    MSP430的另外一个特点是用C 语言编写程序简单而且效率较高本例就采用C

    语言编写了程序清单如下  

    #include <msp430x44x.h>  

    #include <math.h>  

    int SampleTimes=0;  

    //***定义正弦表,并用32个抽样值初始化正弦表,不要用"0"抽样***//  

    int

    SinTable[]={255,254,246,234,219,199,177,153,128,103,79,57,37,22,10,2,  

                   1,2,10,22,37,57,79,103,128,153,177,199,219,234,246,25

    5};  

    void main(void)  

    图4  软件流程

    {  

    int i;  

    WDTCTL = WDTPW +WDTHOLD;        // 禁止看门狗定时器  

    //***初始化端口***//  

    P2DIR |= 0x0C;        // P2.2 和P2.3为输出  

    P2SEL |= 0x0C;        // P2.2 和P2.3分别为TB1和 TB2  

    //***设置系统时钟***//  

    FLL_CTL0 = XCAP18PF;        // 设置XTAL1的负载电容  

    SCFQCTL = 50-1;        // 1.6384MHz/32768Hz = 50,fDCO=MCLK=1.6384MHz  

    for (i = 50000; i; i--);        // 晶振初始化延时  

    //***设置Timer_B***//  

    TBCTL = TBSSEL1 + TBCLR;        // 选择SMCLK 为时钟定时器清除  

    TBCTL|=MC_1+CNTL_0+TBCLGRP_0;        //选择up,16 位模式  

    TBCCTL0=CCIE;        //将CCR0设为比较模式,中断允许  

    TBCCR0=256-1;        //PWM的周期为256,也就是DAC 为8bit  

    TBCCTL1=OUTMOD_7+CLLD_1;        //将CCRx设为比较模式,中断禁止  

    TBCCTL2=OUTMOD_7+CLLD_1;        //选择输出模式7,当TBR 计数到0 时CCRx

    数据加载到TBCTLx  

    TBCCR1=SinTable[SampleTimes];        //将正弦表加载到CCR1  

    TBCCR2=128;        //PWM的占空比为50%,产生0.5VCC的直流电平  

    _EINT();        //中断允许  

    for (;;)  

    { _BIS_SR(LPM0_bits);        //CUP进入低功耗模式  

    _NOP();  

    }  

    }  

    //调用中断函数  

    interrupt [TIMERB0_VECTOR] void Timer_B(void)  

    {  

    SampleTimes=(SampleTimes+1)%32;  

    TBCCR1=SinTable[SampleTimes];        //将新的抽样值装入CCR1  

    }  

    参考文献  

    1  MSP430x4xx Family User's Guide (SLAU056B).  

    2  Mike Mitchell, Using PWM Timer_B as a DAC(SLAA116).  

    3  胡大可, MSP430 系列FLASH 型超低功耗16 位单片机. 北京航空航天大学出

    版社, 2001.  

  • arm9处理器at91rm9200调试心得
    硬件环境:1>自制at91rm9200开发板 2>Multi ICE仿真器

     软件环境:1>集成开发环境ADS1.2 2>仿真工具AXD

    首先将BMS下拉,让CPU执行flash中的程序;假如BMS上拉执行跳'C'xmodem内部程序,那么程序中在ice仿真时PLL设置第一次将无效,重装axd之后才能正常 , 不过假如flash中的程序不能让cpu正常工作,那么BMS下拉情况下的仿真axd始终提示[gliethttp]:

    1."Target processor would not enter debug state when requested.Do you want to try asserting System Reset with a breakpoint on address 0?This will affect the other processor in a multi-processer system."

    2."Fatal AXD Error::RDI Severe Error 00259:Unable to stop target processeor.Check the server configureation matches the target system,the target is powered up,not inreset and can operate at the TCK setting used."

    在flash中有错误的程序或者flash空无程序的时候,AXD调试最好使用[BMS上拉执行跳'C'xmodem内部程序]方式,但是该方式下at91rm9200的PLL时钟始终为48054857Hz,假如startup启动程序试图改变PLL,那么at91rm9200内部整个PLL系统都会出现混乱,DBGU因为PLL时钟不准而不能正常输出数据,所以使用[BMS上拉执行跳'C'xmodem内部程序]方式时,不需要axd调试程序初始化PLL,PLL默认就已经被跳C内部代码初始化为48054857Hz了,这种内部跳C初始化的PLL并不会因为jtag复位或硬复位之类的复位而改变,就像9527是你的终身代号一样,48054857Hz就是跳C情况下调试程序PLL的终身代号. 字串8 正常的axd调试现象: 将能够正常运行的程序烧写到flash中[不要让cpu出现异常的程序],之后BMS下拉,这样正确的硬件仿真环境已经搭建完毕. 1.不论startup配置为什么PLL,即使和烧写到flash中的程序一样,当运行到while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) && (tmp < DELAY_MAIN_FREQ) );这句时axd就会停止,当axd停止后,将axd关闭,重新再启动一次axd,或者"Reload current Image" [在没有Command Line for non-ARM debugger jtag控cpu文件时{gliethttp}]那句就可以顺利通过,调试就ok了,这个现象对于at91rm9200来说是正常现象. 2.只有上面的这个现象才是正常的调试现象,否则可能是硬件存在问题.

    3.假如运行axd全速运行之后,不能停下来,那么可能因为PC6脚作为IO口使用了,不知什么原因只要PC6和一个固定电平连接之后,程序读取flash时 ARM 就会永远退不出来,从文档上来看PC6的ASR外设为NWAIT总线等待信号,linux下s1d13xxxfb.c驱动中使用该nwait信号与外部控制芯片的总线进行 信号同步,但是有明确的ASR外设功能指配语句,nnd老子没有把PC6指定为ASR外设,也没有在其他地方找到对PC6赋值成ASR外设的语句,并且再n多 地方将PC6显式的指定为input-io类型,它就仍然死活不能操作flash,也不是完全不能操作flash,对于4字节数据的flash读取还是可以通过的 就是1字节flash数据读取操作,只要ldrb r2,[r0],#1读取外部flash语句一执行,cpu就永远回不来了,down掉了.用PC15代替PC6,把PC6悬空,flash操作ok.

    (另附:Sitara_ARM9_集中器方案)

     

     

    Sitara_ARM9_集中器方案.vsd
  • 在beaglebone上实现AM3359与FPGA的GPMC通信

    1. 参考资料

    《AM335x ARM® Cortex™-A8 Microprocessors Technical

    Reference Manual》

    《BeagleBone_revA3_SCH.pdf》

    《BeagleBone_revA3_SRM.pdf》

    《BeagleBone_revA3_BOM.xls》

    2. 测试的硬件环境: Beaglebone

    + EE_FPGA

    3. 硬件连接图:用的是GPMC to 16-Bit Nonmultiplexed Memory

    4. 设计思路

    初始化GPMC相关引脚

    完成GPMC驱动设计

    完成GPMC应用设计

    5. 初始化相关代码,主要修改并编译

    /linux-3.1.0-psp04.06.00.03.sdk/arch/arm/mach-omap2/board-am335xevm.c

    配置相关引脚

    /* Pin mux for fpga module */

    static struct pinmux_config fpga_pin_mux[] = {

           {"gpmc_ad0.gpmc_ad0",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad1.gpmc_ad1",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad2.gpmc_ad2",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad3.gpmc_ad3",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad4.gpmc_ad4",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad5.gpmc_ad5",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad6.gpmc_ad6",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad7.gpmc_ad7",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad8.gpmc_ad8",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad9.gpmc_ad9",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad10.gpmc_ad10",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad11.gpmc_ad11",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad12.gpmc_ad12",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad13.gpmc_ad13",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad14.gpmc_ad14",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"gpmc_ad15.gpmc_ad15",          OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},

           {"lcd_data0.gpmc_a0",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                  | AM33XX_PULL_DISA},                        

     {"lcd_data1.gpmc_a1",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data2.gpmc_a2",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data3.gpmc_a3",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data4.gpmc_a4",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data5.gpmc_a5",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data6.gpmc_a6",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data7.gpmc_a7",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_vsync.gpmc_a8",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_hsync.gpmc_a9",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_pclk.gpmc_a10",                OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_ac_bias_en.gpmc_a11",        OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data8.gpmc_a12",        OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data9.gpmc_a13",        OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data10.gpmc_a14",        OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                    | AM33XX_PULL_DISA},                        

     {"lcd_data11.gpmc_a15",        OMAP_MUX_MODE1 | AM33XX_PIN_OUTPUT

                                                  | AM33XX_PULL_DISA},                        

           {"gpmc_advn_ale.gpmc_advn_ale",  OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {"gpmc_oen_ren.gpmc_oen_ren",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {"gpmc_wen.gpmc_wen",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {"gpmc_ben0_cle.gpmc_ben0_cle",         OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {"gpmc_csn1.gpmc_csn1",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {"gpmc_clk.gpmc_clk",          OMAP_MUX_MODE0 | AM33XX_PULL_DISA},

           {NULL, 0},

    };

    static void evm_fpga_init(int evm_id, int profile)

    {

           setup_pin_mux(fpga_pin_mux);

    }

    /* Beaglebone Rev A3 and after */

    static struct evm_dev_cfg beaglebone_dev_cfg[] = {

           {mii1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

           {usb0_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

           {usb1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

           {mmc0_init,        DEV_ON_BASEBOARD, PROFILE_NONE},

           {evm_fpga_init, DEV_ON_BASEBOARD, PROFILE_NONE},

           {NULL, 0, 0},

    6. GPMC驱动设计

    /*

     Char device driver fpga.

     Do a global replace of 'fpga' with your driver name.

    */

    #include <linux/init.h>

    #include <linux/module.h>

    #include <linux/fs.h>

    #include <linux/cdev.h>

    #include <asm/uaccess.h>

    #include <linux/string.h>

    #include <linux/kernel.h>

    #include <linux/device.h>

    #include <linux/slab.h>

    #include <plat/gpmc.h>

    #include "plat/gpio.h"

    #include "plat/dma.h"

    #include "asm/uaccess.h"

    #include "asm/io.h"

    #include "asm/atomic.h"

    #define USER_BUFF_SIZE 128

    struct fpga_dev {

           dev_t devt;

           struct cdev cdev;

           struct semaphore sem;

           struct class *class;

           char *user_buff;

    };

    static struct fpga_dev fpga_dev;

    unsigned long  mem_base;

    static void __iomem *fpga_base;

    static void __iomem *gpmc_base;

    /* GPMC register offsets */

    #define GPMC_REVISION                0x00

    #define GPMC_SYSCONFIG                0x10

    #define GPMC_SYSSTATUS                0x14

    #define GPMC_IRQSTATUS                0x18

    #define GPMC_IRQENABLE                0x1c

    #define GPMC_TIMEOUT_CONTROL        0x40

    #define GPMC_ERR_ADDRESS        0x44

    #define GPMC_ERR_TYPE                0x48

    #define GPMC_CONFIG                0x50

    #define GPMC_STATUS                0x54

    #define GPMC_PREFETCH_CONFIG1        0x1e0

    #define GPMC_PREFETCH_CONFIG2        0x1e4

    #define GPMC_PREFETCH_CONTROL        0x1ec

    #define GPMC_PREFETCH_STATUS        0x1f0

    #define GPMC_ECC_CONFIG                0x1f4

    #define GPMC_ECC_CONTROL        0x1f8

    #define GPMC_ECC_SIZE_CONFIG        0x1fc

    #define GPMC_ECC1_RESULT        0x200

    #define GPMC_ECC_BCH_RESULT_0        0x240

    #define GPMC_BASE_ADDR          0x50000000

    #define GPMC_CS                        1

    #define GPMC_CS0                0x60

    #define GPMC_CS_SIZE                0x30

    #define STNOR_GPMC_CONFIG1        0x28601000

    #define STNOR_GPMC_CONFIG2        0x00011001

    #define STNOR_GPMC_CONFIG3        0x00020201

    #define STNOR_GPMC_CONFIG4        0x08031003

    #define STNOR_GPMC_CONFIG5        0x000f1111

    #define STNOR_GPMC_CONFIG6        0x0f030080

    static const u32 gpmc_nor[7] = {

           STNOR_GPMC_CONFIG1,

           STNOR_GPMC_CONFIG2,

           STNOR_GPMC_CONFIG3,

           STNOR_GPMC_CONFIG4,

           STNOR_GPMC_CONFIG5,

           STNOR_GPMC_CONFIG6, 0

    };

    static ssize_t fpga_write(struct file *filp, const char __user *buff,

                   size_t count, loff_t *f_pos)

    {

           ssize_t status;

           size_t len = USER_BUFF_SIZE - 1;

           int i,tmp;

           if (count == 0)

                   return 0;

           if (down_interruptible(&fpga_dev.sem))

                   return -ERESTARTSYS;

           if (len > count)

                   len = count;

           memset(fpga_dev.user_buff, 0, USER_BUFF_SIZE);

           if (copy_from_user(fpga_dev.user_buff, buff, len)) {

                   status = -EFAULT;

                   goto fpga_write_done;

           }

           /* do something with the user data */

       printk("fpga_write \n");

       for (i = 0; i < len; i=i+2) {

           tmp = fpga_dev.user_buff | fpga_dev.user_buff[i+1] << 8;      

           writew(tmp,fpga_base+i);

       }

       for (i = 0; i < len; i++) {

           printk("0x%x ",fpga_dev.user_buff);      

       }

       printk("\n");

    fpga_write_done:

           up(&fpga_dev.sem);

           return status;

    }

    static ssize_t fpga_read(struct file *filp, char __user *buff,

                                   size_t count, loff_t *offp)

    {

           ssize_t status;

           size_t len;

    //        int i,tmp;

           /*

           Generic user progs like cat will continue calling until we

           return zero. So if *offp != 0, we know this is at least the

           second call.

           */

           if (*offp > 0)

                   return 0;

           if (down_interruptible(&fpga_dev.sem))

                   return -ERESTARTSYS;

           strcpy(fpga_dev.user_buff, "fpga driver data goes here\n");

           len = strlen(fpga_dev.user_buff);

           if (len > count)

                   len = count;

           if (copy_to_user(buff, fpga_dev.user_buff, len)) {

                   status = -EFAULT;

                   goto fpga_read_done;

           }

    fpga_read_done:

           up(&fpga_dev.sem);

           return status;        

    }

    static int fpga_open(struct inode *inode, struct file *filp)

    {        

           int status = 0;

           if (down_interruptible(&fpga_dev.sem))

                   return -ERESTARTSYS;

           if (!fpga_dev.user_buff) {

                   fpga_dev.user_buff = kmalloc(USER_BUFF_SIZE, GFP_KERNEL);

                   if (!fpga_dev.user_buff) {

                           printk(KERN_ALERT "fpga_open: user_buff alloc failed\n");

                           status = -ENOMEM;

                   }

           }

           up(&fpga_dev.sem);

           return status;

    }

    static const struct file_operations fpga_fops = {

           .owner = THIS_MODULE,

           .open =        fpga_open,        

           .read =        fpga_read,

           .write = fpga_write,

    };

    static int __init fpga_init_cdev(void)

    {

           int error;

           u32 val;

           fpga_dev.devt = MKDEV(0, 0);

           error = alloc_chrdev_region(&fpga_dev.devt, 0, 1, "fpga");

           if (error) {

                   printk(KERN_ALERT "alloc_chrdev_region() failed: %d\n", error);

                   return error;

           }

           cdev_init(&fpga_dev.cdev, &fpga_fops);

           fpga_dev.cdev.owner = THIS_MODULE;

           error = cdev_add(&fpga_dev.cdev, fpga_dev.devt, 1);

           if (error) {

                   printk(KERN_ALERT "cdev_add() failed: %d\n", error);

                   unregister_chrdev_region(fpga_dev.devt, 1);

                   return error;

           }

           printk("Getting Chip Select\n");

    //        val =         0xf64;

    //        gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, val);

           //gpmc_base = ioremap(GPMC_BASE_ADDR, SZ_4K);

           val = gpmc_read_reg(GPMC_REVISION);

           printk("GPMC revision %d.%d\n", (val >> 4) & 0x0f, val & 0x0f);

           gpmc_write_reg(GPMC_IRQENABLE, 0);

           gpmc_write_reg(GPMC_TIMEOUT_CONTROL, 0);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG1, gpmc_nor[0]);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG2, gpmc_nor[1]);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG3, gpmc_nor[2]);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG4, gpmc_nor[3]);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG5, gpmc_nor[4]);

           gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG6, gpmc_nor[5]);

           val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);

           printk("GPMC_CS_CONFIG7 value 0x%x\n", val);

           if (gpmc_cs_request(GPMC_CS, SZ_2K, (unsigned long *)&mem_base) < 0) {

                   printk(KERN_ERR "Failed request for GPMC mem for usrp_e\n");

                   return -1;

           }

           printk("Got CS0, address = %lx\n", mem_base);

           if (!request_mem_region(mem_base, SZ_2K, "mem_fpga")) {

                   printk(KERN_ERR "Request_mem_region failed.\n");

                   gpmc_cs_free(GPMC_CS);

                   return -1;

           }

           fpga_base = ioremap(mem_base, SZ_2K);        

           return 0;

    }

    static int __init fpga_init_class(void)

    {

           struct device *device;

           fpga_dev.class = class_create(THIS_MODULE, "fpga");

           if (IS_ERR(fpga_dev.class)) {

                   printk(KERN_ALERT "class_create(fpga) failed\n");

                   return PTR_ERR(fpga_dev.class);

           }

           device = device_create(fpga_dev.class, NULL, fpga_dev.devt, NULL,

                                                           "fpga");

           if (IS_ERR(device)) {

                   class_destroy(fpga_dev.class);

                   return PTR_ERR(device);

           }

           return 0;

    }

    static int __init fpga_init(void)

    {

           printk(KERN_INFO "fpga_init()\n");

           memset(&fpga_dev, 0, sizeof(struct fpga_dev));

           sema_init(&fpga_dev.sem, 1);

           if (fpga_init_cdev())

                   goto init_fail_1;

           if (fpga_init_class())

                   goto init_fail_2;

           return 0;

    init_fail_2:

           cdev_del(&fpga_dev.cdev);

           unregister_chrdev_region(fpga_dev.devt, 1);

    init_fail_1:

           return -1;

    }

    module_init(fpga_init);

    static void __exit fpga_exit(void)

    {

           printk(KERN_INFO "fpga_exit()\n");

           device_destroy(fpga_dev.class, fpga_dev.devt);

             class_destroy(fpga_dev.class);

           cdev_del(&fpga_dev.cdev);

           unregister_chrdev_region(fpga_dev.devt, 1);

           release_mem_region(mem_base, SZ_2K);

           gpmc_cs_free(GPMC_CS);

           iounmap(fpga_base);

           if (fpga_dev.user_buff)

                   kfree(fpga_dev.user_buff);

    }

    module_exit(fpga_exit);

    MODULE_AUTHOR("chenzhufly");

    MODULE_DESCRIPTION("fpga driver");

    MODULE_LICENSE("Dual BSD/GPL");

       MODULE_VERSION("0.1");

    7. GPMC应用程序设计,目前只实现了beaglebone向FPGA写的流程

    #include <stdio.h>

    #include <stdlib.h>

    #include <fcntl.h>

    #include <errno.h>

    #define FPGA_DEV  "/dev/fpga"

    #define PAGE_SIZE 10

    int main(void)

    {

     int fd,i,res;

     unsigned char buf[PAGE_SIZE];

     printf("GPMC Test version 1.0-BeagleBone Build on %s %s\n\r",__DATE__,__TIME__);

     fd=open(FPGA_DEV,O_RDWR);

     if(fd<0)

     {

       printf("Can't Open %s !!!\n\r",FPGA_DEV);

       return -1;

     }

     for(i=0;i<sizeof(buf);i++)

     {

       buf = i;

     }

     write(fd,&buf,PAGE_SIZE);

     close(fd);

     return 0;

    }

    8. FPGA相关设计

    FPGA简要代码如下所示:

    module interface_test

    (

           input clk,        

           input ebgcs,

           input eboe,  

           input ebwe,

           input [11:0]ebaddr,

           input [15:0]ebdata,

           output led,

           output led1

    );

    wire [15:0] ram_q;

    wire ram_wren;

    wire ram_rden;

    assign ram_wren = ((ebgcs == 1'b0) && (ebwe == 1'b0)) ? 1'b1 : 1'b0;

    assign ram_rden = ((ebgcs == 1'b0) && (eboe == 1'b0)) ? 1'b1 : 1'b0;

    TestRam        testram_inst (

           .clock ( clk),

           .data ( ebdata[15:0] ),

           .rdaddress ( ebaddr[11:1] ),

           .rden ( ram_rden ),

           .wraddress ( ebaddr[11:1] ),

           .wren ( ram_wren ),

           .q ( ram_q[15:0] )

           );

    wire ARM_READ_REG_EN;

    assign ARM_READ_REG_EN = ((ebgcs == 1'b0) && (eboe == 1'b0) && (ebaddr[11:1] == 11'b111_1111_1111))        ?  1'b1 : 1'b0;

    assign led1 = ARM_READ_REG_EN ? 1'b1 :

                 ram_rden ? ram_q[0] : 1'bz;

    endmodule

    FPGA管脚分配如下所示:

    set_location_assignment PIN_89 -to ebaddr[0]

    set_location_assignment PIN_90 -to ebaddr[1]

    set_location_assignment PIN_87 -to ebaddr[2]

    set_location_assignment PIN_88 -to ebaddr[3]

    set_location_assignment PIN_84 -to ebaddr[4]

    set_location_assignment PIN_86 -to ebaddr[5]

    set_location_assignment PIN_81 -to ebaddr[6]

    set_location_assignment PIN_82 -to ebaddr[7]

    set_location_assignment PIN_63 -to ebaddr[8]

    set_location_assignment PIN_67 -to ebaddr[9]

    set_location_assignment PIN_64 -to ebaddr[10]

    set_location_assignment PIN_68 -to ebaddr[11]

    set_location_assignment PIN_60 -to ebdata[0]

    set_location_assignment PIN_59 -to ebdata[1]

    set_location_assignment PIN_28 -to ebdata[2]

    set_location_assignment PIN_30 -to ebdata[3]

    set_location_assignment PIN_58 -to ebdata[4]

    set_location_assignment PIN_57 -to ebdata[5]

    set_location_assignment PIN_24 -to ebdata[6]

    set_location_assignment PIN_27 -to ebdata[7]

    set_location_assignment PIN_47 -to ebdata[8]

    set_location_assignment PIN_40 -to ebdata[9]

    set_location_assignment PIN_41 -to ebdata[10]

    set_location_assignment PIN_45 -to ebdata[11]

    set_location_assignment PIN_39 -to ebdata[12]

    set_location_assignment PIN_37 -to ebdata[13]

    set_location_assignment PIN_44 -to ebdata[14]

    set_location_assignment PIN_43 -to ebdata[15]

    set_location_assignment PIN_61 -to ebgcs

    set_location_assignment PIN_33 -to eboe

    set_location_assignment PIN_35 -to ebwe

    set_location_assignment PIN_23 -to clk

    set_location_assignment PIN_31 -to led

    set_location_assignment PIN_34 -to led1

    9. 测试结果

    BeagleBone向EE_FPGA写0,1,2,3,4,5,6,7,8,9;通过signaltap抓的结果。(l略)

  • 刚好以前做过个通信项目:基于BeagleBone的WIFI通信,用 BeagleBone在linux系统下通过TL-WN321G+无线网卡实现WIFI通信,当初做这个课题项目时由于对协议的分析有错,导致配置了好久都没通信成功,后来在老师和学长的指导下,终于成功啦!不得不说BeagleBone性能很强大,下次争取把图形界面做好,搞个大彩屏,做个能上网的BeagleBone!废话不多说,传上设计步骤:

     

    硬件环境: BeagleBone

    无线网卡: TL-WN321G+

    操作系统: linux-3.1.0-psp04.06.00.03.sdk

    1. Linux-3.1.0内核已经支持RT73的驱动,所以配置一下内核就可以了,主要由以下两个步骤:

      1) 无线网络协议栈的配置

    引用:
    Networking support   —> 

     

    • Wireless   —>  Generic IEEE 802.11 Networking Stack
      (mac80211)

     

    如果没有配置MAC80211,是看不到RT73的驱动的

      2) 选择RT73 USB无线网卡驱动

    引用:
    Device Drivers —> Network device support
     —> Wireless LAN  —> Ralink driver support —> <*>
    Ralink rt2501/rt73(USB) support

     

    2. 接着Make uImage,把内核映像文件拷贝到SD卡中

    3. 安装wireless_tools

    引用:

    opkg install wireless-tools_29-r4_armv7a.ipk

     

    可从附件下载

     

    4. 插入USB无线网卡,查看USB设备

     

    引用:root@beaglebone:/etc# lsusb

     Bus 001 Device 001: ID

    1d6b:0002 Linux Foundation 2.0 root hub

    Bus 001 Device 003: ID
    148f:2573 Ralink Technology, Corp. RT2501USB Wireless Adapter

    Bus 002 Device 001: ID
    1d6b:0002 Linux Foundation 2.0 root hub

     

     

     

    5. 激活网卡

     

    引用:root@beaglebone:~# ifconfig

    wlan0 up

    root@beaglebone:~# ifconfig

    lo        Link encap:Local Loopback 

    inet addr:127.0.0.1  Mask:255.0.0.0

    UP LOOPBACK RUNNING  MTU:16436 
    Metric:1

     RX packets:4 errors:0 dropped:0 overruns:0

    frame:0

    TX packets:4 errors:0 dropped:0

    overruns:0 carrier:0

    collisions:0 txqueuelen:0

    RX bytes:280 (280.0 B)  TX bytes:280 (280.0 B)

    wlan0     Link encap:Ethernet  HWaddr 00:25:86:AD:C2:D5 

     UP BROADCAST MULTICAST  MTU:1500 
    Metric:1

      RX packets:0 errors:0 dropped:0
    overruns:0 frame:0

          TX packets:0 errors:0 dropped:0
    overruns:0 carrier:0

        collisions:0 txqueuelen:1000

    RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    6. 扫描可用的无线网络

    引用:
    iwlist wlan0 scan

     

    7. 配置wpa.conf

     

    新建文件 /etc/wpa.conf

     

    引用:

     ctrl_interface=/var/run/wpa_supplicant

    network={

            ssid="无线网路名称"

            psk="密码"

    }


    8. 连接wlan0到网络

     

    引用:
    wpa_supplicant -B -i wlan0 -c /etc/wpa.conf 
    -B Background 在后台以daemon 运行

    -i interface 

    -c 
    配置文件

     

    不要用 iwconfig wlan0来连接网络哦,这个是对WEP加密方式的无线网络

    9. 设置IP

     

    引用:
    ifconfig wlan0 192.168.10.125

     


    10. 执行ping

     

    引用:

    root@beaglebone:/etc# ifconfig
    wlan0 192.168.10.125

    root@beaglebone:/etc# ping
    192.168.10.105



    PING 192.168.10.105
    (192.168.10.105) 56(84) bytes of data.



    64 bytes from 192.168.10.105:
    icmp_req=1 ttl=64 time=1133 ms



    64 bytes from 192.168.10.105:
    icmp_req=2 ttl=64 time=126 ms



    64 bytes from 192.168.10.105:
    icmp_req=3 ttl=64 time=11.1 ms


    到此无线网卡安装成功,可以无线通信了!

     

     

    wireless-tools_29-r4_armv7a.zip
  • 调试中遇到的一些问题:一:把工程文件从桌面换到了E盘中,结果打开是报错,说打不开桌面上的一个文件!开玩笑! 问题出在了:eide>> preference>>build setting中!!!把build before running里改成 never就可以了!!!图中还有上些东东,可以看一下! 还有一种情况: 就是有一些存储记忆,要用project>> remove object code一下就可以了!

     二、还有一关于仿真的问题: 在AXD中,file>>load image >>加入你事先生成的.axf文件,可以对相应工程仿真。 其中生成仿真文件.axf文件是事先设置好的,在编译时同步生成的。 8.3 用AXD进行代码调试 AXD(ARM eXtended Debugger)是ADS软件中独立于CodeWarrior IDE的图形软件,打开AXD软件,默认是打开的目标是ARMulator。这个也是调试的时候最常用的一种调试工具,结合ARMulator介绍在AXD中进行代码调试的方法和过程,对AXD的调试有初步的了解。《AXD,选择Option中的Configure Target,出现的选项中,选择ARMUL》 要使用AXD必须首先要生成包含有调试信息的程序,已经生成的ledcircle.axf或main.axf就是含有调试信息的可执行ELF格式的映像文件。 1. 在AXD中打开调试文件 在菜单File中选择“Load image…”选项,打开Load Image对话框,找到要装载的.axf映像文件,点击“打开”按钮,就把映像文件装载到目标内存中了。 在所打开的映像文件中会有一个蓝色的箭头指示当前执行的位置,打开映像文件后, 在axd下打开映像文件 在菜单Execute中选择“Go”,将全速运行代码。要想进行单步的代码调试,在Execute菜单中选择“Step”选项,或用F10即可以单步执行代码,窗口中蓝色箭头会发生相应的移动。 有时候,用户可能希望程序在执行到某处时,查看一些所关心的变量值,此时可以通过断点设置达到此要求。将光标移动到要进行断点设置的代码处,在Execute菜单中,选择“Toggle Breakpoint”或按F9,就会在光标所在位置出现一个实心圆点,表明该处为断点。 还可以在AXD中查看寄存器值,变量值,某个内存单元的数值等等。 下面就结合本章中的例子,介绍在AXD中调试过程。 2. 查看存储器内容 在程序运行前,可以先查看两个宏变量IOPMOD和IOPDATA的当前值。方法是:从Processor Views菜单中选择“Memory”选项,查看存储器内容 在Memory Start address选择框中,用户可以根据要查看的存储器的地址输入起始地址,在下面的表格中会列出连续的64个地址。因为I/O模式控制寄存器和I/O数据控制寄存器都是32位的控制寄存器,所以从0x3ff5000开始的连续四个地址空间存放的是I/O模式控制寄存器的值,可以读出该控制寄存器的值开始为0xE7FF0010,I/O数据控制寄存器的内容是从地址0x3FF5008开始的连续四个地址空间存放的内容。从图8.11中可以看出IODATA中的初始值为0x E7FF0010,注意因为用的是小端模式,所以读数据的时候注意高地址中存放的是高字节,低地址存放的是低字节。 现在对程序进行单步调试,当程序运行到for循环处时,可以再一次查看这两个寄存器中的内容,运行后的存储器内容,可以看出运行完两个赋值语句后,两个寄存器的内容的确发生了变化,在地址0x3FF5000作为起始地址的连续四个存储单元中,可以读出I/O模式控制寄存器的内容为0xFFFFFFFF,在地址0x3FF5008开始的连续的四个存储单元中,可以读出I/O数据控制寄存器的内容为0x00000001。 3. 设置断点 可以在for循环体的“Delay(10);”语句处设置断点,将光标定位在该语句处,使用快捷键F9在此处设置断点,按F5键,程序将运行到断点处,如果读者想查看子函数Delay是如何运行的,可以在Execute菜单中选择“Step In”选项,或按下F8键,进入到子函数内部进行单步程序的调试。如图8.13所示。 4. 查看变量值 在Delay函数的内部,如果用户希望查看某个变量的值,比如查看变量i的值,可以在Processor Views菜单中选择“Watch”,然后用鼠标选中变量i,点击鼠标邮件,在快捷菜单中选中“Add to watch”,这样变量i默认是添加到watch窗口的Tab1中。程序运行过程中,用户可以看到变量i的值在不断的变化。默认显示变量数值是以十六进制格式显示的,如果用户对这种显示格式不习惯的话,可以通过在watch窗口点击鼠标右键,在弹出的快捷菜单中选择“Format”选项,用户可以选择所查看的变量显示数据的格式。如果用户想从Delay函数中跳出到主函数中去,最简单的方法就是将光标定位到你想跳转到的主函数处,在Execute菜单中选择“Run to Cursor”选项,则程序会从Delay函数中跳转到光标所在位置。

  • bbs.eeworld.com.cn/viewthread.php    基于BeagleBone的WIFI通信

    bbs.eeworld.com.cn/viewthread.php    在beaglebone上实现AM3359与FPGA的GPMC通信

    抄袭可耻。

  • bbs.eeworld.com.cn/viewthread.php  基于BeagleBone和DS18B20的温度测量

    都是在eeworld的发表的原创,看不下去了。

    电子界的方舟子,奖个U盘吧亲。

  • AM3558的外围读取,模拟量,数字量,利用node.js平台开发的简单网页显示物理量的页面。

    效果图:

    代码:

    // 本程序从外围读取模拟量、数字量,并在网页中显示。
    // 打开浏览器;输入http://IP:3000
    //=======================================
    /require('bonescript');

    //数字量、模拟量读取并显示在网页上。
    var analogPin = P9_39;
    var digitalPin = P9_42;
    var analog_result = 0;  //从AIN0-P9.39读取的模拟量
    var digital_result = 0; //从GPIO0_7-P9.42读取的数字量
       
    pinMode(analogPin, INPUT);
    pinMode(digitalPin, INPUT);       

    var http = require('http');
    var s = http.createServer(
        function(req, res) {
            analog_result = analogRead(analogPin);
            digital_result = digitalRead(digitalPin);
           
            res.writeHead(200, { 'Content-type' : 'text/plain'} );
            res.write("Hello, beaglebone!");
            res.write("\n analog_result is " + analog_result);
            res.write("\n digital_result is " + digital_result);
            res.end("\n================\n");
           
            console.log("Beaglebone server answered  a request");
            console.log("the analog_result is " + analog_result);
            console.log("the digital_result is " + digital_result);
        }
    );   
        s.listen(8000);

  • 支持原创哦。。。学了一下node.js,很是牛叉啊。 可以做很多事情。网页服务器只是很简单的一个东东。 牛人已经用processing.js(client)和node.js(Server)做出了网页示波器, 强悍啊。

  • 感谢各位网友的参与!我们期待大家更多的分享!此活动延期至10月7日。

  • 申明一下,这两篇文章我分别写于2012年9月19日和20日,发表于eeworld论坛dsp板块,复制过来参加征文活动 。

    BeagleBone 学习笔记01_2012_09_19

    晚上加完班,看了下ti的资源:
    1)先安装这个ti-sdk-am335x-evm-05.05.00.00-Linux-x86-Install
     

    2)运行serup.sh(默认支持10.04),需要修改部分内容支持我的版本10.10

    修改前(请备份下,这是好习惯):


    修改后如下:



    其他的,实在没时间加描述了,要回去睡觉了,有时间补点说明吧,总之ti的资源很全,很容易开发。

    ———————————————————————————————————————————————

    早上到公司还比较早,写点简单的图片说明吧:

    1)查看挂载的nfs是否成功,哈哈我有两个路径,一个是beaglebone用的,一个是at91sam9260用的。

     

    2)看看安装之后有一个ti-sdk-am335x-evm-xxxx的文件夹的吧。

     

    3)进到文件夹里面看看都有些啥,自己看啦,不描述了。

     

    4)进到nfs的路劲看看,安装的时候选择从nfs启动,好智能啊,做选择题一样。

     

    5)进到ti-sdk-am335x-evm-xxxx 目录下的board-support看看吧。

     

    6)进到ti-sdk-am335x-evm-xxxx 目录下的linux-devkits看看吧,都是些工具什么的,交叉编译器的路径就在这里啦。

     


    嗯,差不多了,基本的都有了。顺便改了个标题,有个循序渐进的过程。

    BeagleBone 学习笔记02_2012_09_20

    嗯,趁着中午大伙都在睡觉,继续开贴说ti的资源包,ti很人性化。

    1、u-boot编译
    1)u-boot make target 表,在编译命令时需要指定目标板类型。
     

    2)u-boot编译命令,注意这个路径啊,不然没有make规则的。
    简单解释:O=xxx指定生成的文件夹名称,ARCH=arm + target

     

    3)编译完成之后的结果,能够看到MLO和u-boot.img两个需要的文件啦。


    2、kernel编译
    1)kernel make defconfig表,在编译之前需要配置内核(所谓裁剪吧),可以手动配置也可以使用default配置。


    2)使用menuconfig用户自定义配置的命令。
     

    3)自定义配置命令运行之后出现如下图形配置菜单,这个都熟悉的吧。
     

    4)这里为了演示我使用的默认def配置,记得对照上面的表。

     

    5)安装libncurses5-dev(我之前装过啦,这里也写出来,照顾新手)。
     

    6)安装uboot-mkimage,这个我也安装过了,同上解释(要问这是干嘛的请google)。

     

    7)kernel编译命令
     

    8)内核编译结束,注意看生成的镜像位置。
     

    9)内核编译结果,可以看到在arch/arm/boot下面有uImage,哈哈到此基本完成了。


    10)modules制作,便于后面开发,两个过程一个生成、一个安装。
     

     

    Ok基本上就这样啦,剩下来的就是等有个板子把这两个东西搞到tf卡里面去。其次就是rootfs。

    嗯,下一篇说说这个rootfs吧,这个基本用ti现成的就可以啦。
    eeworld论坛上文章地址:

  • 再来发一篇,也申明一下这篇文章是我2012年2月05日发表于百度经验,收录于:百度经验>电脑>操作系统 目录下。

    简介

     

     

    这几天上班都是泡在ti的官网上,算是第三方支持网站吧(wiki网),看了各种应用报告并亲自做了实践,得出以下结论,希望你们少走弯路。搞这玩意我linux版本都换了两个fedora和ubuntu都装了。

     

    总结出AM1808烧写kernel内核以及rootfs文件系统的方法,主要是参考wiki网和lsd的国网集中器使用说明书一文。

     

     

     

     

     

     

    AM1808烧写kernel内核以及rootfs文件系统方法

    工具/原料

    • VMware-workstation-full-7.0.1.227600.exe

    • am180x-sdk-bin-04.01.00.00.tar.gz

    • am180x-sdk-src-04.01.00.00.tar.gz

    • arago-am1x-demo-image-glibc-ipk-2010.03-da850-omapl138-evm.rootfs.tar.gz

    • DaVinci-PSP-SDK-03.20.00.12.gz

    • OMAP-L138_FlashAndBootUtils_2_23.tar.gz

    • am180x-evm-qsg.pdf

    • AM1x_1_10_00_01_release_notes.pdf

    • 1016316A_AM1808_BSL.rar

    • ubuntu-9.10-desktop-i386.iso

    步骤/方法

    1. 一、在uart2启动模式下,通过sfh_OMAP-L138.exe烧写ubl.bin和u-boot.bin文件至nandflash中;

      1、sfh_OMAP-L138.exe -erase -targetType INTDEV0 -flashType NAND -p COM1
      2、sfh_OMAP-L138.exe -flash -targetType INTDEV0 -flashType NAND -v -p COM1 ubl_INTDEV0_NAND.bin u-boot.bin

    2. 二、在linux环境中安装配置好tftp、nfs服务器,并拷贝kernel内核文件至tftp服务器文件夹中,拷贝fs.tar.gz文件至zx目录中;

      1、nfs安装配置:

      HOST $ sudo apt-get install portmap nfs-kernel-server 
      HOST $ sudo apt-get install portmap nfs-common

      HOST $ sudo gedit /etc/exports 
      在该文件末尾加上下面这一条语句 /home/toby/toby_nfs *(rw,sync,no_root_squash)

      HOST $ sudo /etc/init.d/portmap restart 
      HOST $ sudo /etc/init.d/nfs-kernel-server restart

      测试方式:
      HOST $ showmount -e

      HOST $ sudo mount 192.168.14.22:/home/zx/zx_nfs/ /mnt

      cd到mnt目录下看是否出现zx_nfs目录下面的文件。

      HOST $ sudo umount /mnt

      2、tftp安装配置:

      HOST $ cd /home/zx/ 
      HOST $ mkdir zx_tftp 
      HOST $ chmod 777 zx_tftp 
      HOST $ sudo apt-get install xinetd tftpd-hpa tftp-hpa

      HOST $ cd /etc/xinetd.d/
      HOST $ sudo touch tftpd

      HOST $ sudo gedit /etc/xinetd.d/tftpd

      service tftp 

      disable = no 
      socket_type = dgram 
      wait = no 
      user = root 
      protocol = udp 
      server = /usr/sbin/in.tftpd 
      server_args = -s /home/zx/zx_tftp 
      log_on_success = PID HOST DURATION 
      log_on_failure = HOST 
      }


      HOST $ sudo gedit /etc/inetd.conf 
      然后加入以下代码 
      tftp dgram udp wait 
      root /usr/sbin/in.tftpd /usr/sbin/in.tftpd - 
      s /home/zx_tftp/zx_tftp


      HOST $ sudo gedit /etc/default/tftpd-hpa 
      修改成以下代码 
      #Defaults for tftpd-hpa 
      RUN_DAEMON="yes" 
      OPTIONS="-l -s /home/zx/zx_tftp"


      HOST $ sudo /etc/init.d/xinetd restart 
      HOST $ sudo /etc/init.d/tftpd-hpa restart

      测试方式:
      在zx_tftp目录下面新建一个空的test文件

      串口终端中输入 tftp 0xc0700000 test


      3、通过cp命令拷贝kernel内核文件至zx_tftp目录下,拷贝fs.tar.gz至zx目录下。

    3. 三、在nandflash启动器模式下,通过串口超级终端使用setevn命令设置系统参数(在nand flash指定的区域),并通过saveevn命令保存并使用reset命令重启;

      输入以下系统参数设置命令:

      U-Boot> setenv ethaddr 00:ff:ff:ff:ff:00 
      U-Boot> setenv nfshost 192.168.14.22
      U-Boot> setenv rootpath /home/zx/zx_nfs 
      U-Boot> setenv serverip 192.168.14.22 
      U-Boot> setenv ipaddr 192.168.14.20
      U-Boot> setenv netmask 255.255.255.0 
      U-Boot> setenv bootfile uImage 
      U-Boot> setenv bootcmd 'tftp 0xc0700000 uImage;bootm'
      U-Boot> setenv bootargs console=ttyS2,115200n8 noinitrd rw ip=192.168.14.20:192.168.14.22:192.168.14.22:255.255.255.0 root=/dev/nfs nfsroot=${nfshost}:${rootpath},nolock mem=32M

      U-Boot> saveenv 
      U-Boot> reset


      备注:如果需要擦除参数区,并设置为默认参数,可以使用命令 
      U-Boot> nand erase 0 2000 
      U-Boot> reset

    4. 四、在串口终端中使用tftp传输内核镜像文件至内存中再通过nand write.e命令写入nand falsh指定的地址并通过reset重启系统;

      进入uboot命令行

      U-Boot> tftp 0xc0700000 uImage

      U-Boot> nand erase 0x200000 0x230000 
      U-Boot> nand write.e 0xc0700000 0x200000 0x230000

      U-Boot> reset

    5. 五、拷贝文件系统镜像fs.bin文件至nfs服务器文件夹中,在串口终端中用root登陆,并使用mtd-util相关命令烧写文件系统至对应的nand flash区域,最后reboot重启系统;

      1、拷贝fs文件系统fs.bin至zx_nfs目录下。


      2、在linux的终端中运行一下命令

      HOST $ cd /home/zx 
      HOST $ sudo tar -zxvf fs.tar.gz (sudo tar xvfi fs.tar.bz2)
      HOST $ sudo rm -r zx_nfs 
      HOST $ sudo mv fs zx_nfs 
      HOST $ sudo chmod 777 zx_nfs


      3、用root登陆之后,在串口终端中执行以下命令:

      TARGET# flash_eraseall /dev/mtd4

      TARGET# cd / 
      TARGET# nandwrite /dev/mtd4 fs.bin

      TARGET# reboot


      备注:使用命令前用cat /proc/mtd 查看一下mtdchar字符设备

    6. 六、在u-boot之后通过setenv命令设置从nand falsh启动,保存之后使用reset命令重启系统,耐心等待进入即可完成。

      重启板子,按空格,出现u-boot命令行之后运行一下命令:

      U-Boot> setenv bootargs console=ttyS2,115200n8 noinitrd root=/dev/mtdblock4 rootfstype=jffs2 rootwait rw 
      ip=192.168.14.20:192.168.14.22:192.168.14.22:255.255.255.0 init=/sbin/init 
      U-Boot> setenv bootcmd 'nboot.e 0xc0700000 0 0x200000; bootm' 
      U-Boot> saveenv

      U-Boot> reset

    注意事项

    • 烧写完成之后超级终端打印的内容:

      INIT:Enteringrunlevel:5Startingtelnetdaemon.Startingsyslogd/klogd:done.-------.||.-.|||-----.-----.-----.||.----..-----.-----.|||__|---'|'--.|.-'|||||||||---||--'|||'||||'---'---'--'--'--.|-----''----''--''-----'-'-'-'-'|'---'TheAngstromDistributionhawkboard.orgttyS2Hawkboard.org2009.03hawkboard.orgttyS2hawkboard.orglogin:rootroot@hawkboard:~#

      opulating dev cachemv: cannot rename '/tmp/uname': No such file or directory
      logger: mount: mount point /proc/bus/usb does not exist
      ALSA: Restoring mixer settings...
      /usr/sbin/alsactl: load_state:1608: NOT configuring network interfaces: / is an
      NFS mount
      No soundcards found...
      Tue May 4 05:40:00 UTC 2010
      INIT: Entering runlevel: 5
      Starting telnet daemon.
      modprobe: FATAL: Could not open 'kernel/net/ipv6/ipv6.ko': No such file or direc
      tory

      Starting syslogd/klogd: done
      Starting thttpd.
      ti_omapl_pru_suart ti_omapl_pru_suart.1: firmware: requesting PRU_SUART_Emulatio
      n.bin
      ti_omapl_pru_suart ti_omapl_pru_suart.1: fw size 3172. downloading...
      ti_omapl_pru_suart.1: ttySU0 at MMIO 0x1d00000 (irq = 3) is a suart_tty
      ti_omapl_pru_suart.1: ttySU1 at MMIO 0x1d00000 (irq = 4) is a suart_tty
      ti_omapl_pru_suart.1: ttySU2 at MMIO 0x1d00000 (irq = 5) is a suart_tty
      ti_omapl_pru_suart.1: ttySU3 at MMIO 0x1d00000 (irq = 6) is a suart_tty
      ti_omapl_pru_suart.1: ttySU4 at MMIO 0x1d00000 (irq = 7) is a suart_tty
      ti_omapl_pru_suart.1: ttySU5 at MMIO 0x1d00000 (irq = 8) is a suart_tty
      ti_omapl_pru_suart.1: ttySU6 at MMIO 0x1d00000 (irq = 9) is a suart_tty
      ti_omapl_pru_suart.1: ttySU7 at MMIO 0x1d00000 (irq = 10) is a suart_tty
      ti_omapl_pru_suart ti_omapl_pru_suart.1: ti_omapl_pru_suart device registered(pr
      u_clk=150000000, asp_clk=150000000)
      Starting lierda_am1808_jzq applicationinsmod: error inserting '/lib/modules/2.6.
      33-rc4/kernel/drivers/serial/omapl_pru/suart_emu.ko': -1 File exists
      .

      ############################################################################

      # #

      # #

      # #

      # # ### ### # # # # ### ### ### ### # #

      # # # # # # # # ## ## ## # # # # # # # # ## #

      # # # # # # # ## ## # # # # # # # # # # # # #

      # # ### # # # # # # # # # ### # # ### # # # #

      # # # # # ## ##### # # # # # # # # # # # ## # # # #

      # # # # # # # # # # # # # # # # # # # # # # #

      # ##### ### ### # # # # # # ### ### ### ### # #

      # #

      # #

      ############################################################################

      http://www.lierda.comlierda ttyS2

      lierda 2010.12 lierda ttyS2

      lierda login: root
      root@lierda:~# cd /dev

    参考资料

  • 本人所在eeworld、baidu的ID都为:lyzhangxiang    ti论坛注册如系统显示。

  • 再来一篇有关AM1808启动分析,之前网关项目中总结的。

     

    AM1808提供两个外部存储器的接口:外存支持NORNANDSDRAM 内存支持DDR2 Mobile DDR AM1808核心板采128MNand Flash512MDDR2

     

    AM1808启动过程分析:


     


    1、 开机上电,用户在 BOOT 管脚上配置的启动方式被锁定采样到 SYSCFG 模块的BOOTCFG寄存器,从而确定处理器的启动方式。

    2、 第一次检测启动模式,如果为非Nor Flash启动模式则统一进入RBL(固化在ROM中的一段bootloader)

    3、 RBL做一些初始化后,再次根据 BOOTCFG 寄存器的设定,从指定的地方读取用于启动 U-Boot Bootloader,即 U-Boot BootLoader简称 UBLUBL 可以放在 NandFlash 或者通过串口下载等方式取得。值得说明的是,这里的 UBL (AIS Application ImageScript ) 格式,而不是通常的 BIN 格式。

    4、 Uart2启动模式下,重启板子会返回BootMeUart2,此时可以通过相关工具下载UBLU-Boot至处理器的RAM或者NandFlash(通过slh_OMAP-L138.exe下载到RAM中,而通过sfh_OMAP-L138.exe下载到Flash)

    5、 RBL读取到 UBL后就根据 AIS 格式中的命令初始化、加载并运行UBL。然后就是 UBL 加载运行 U-BootU-Boot根据启动参数启动 LinuxLinux 根据启动参数加载根文件系统。

     

    引入RBLUBL的原因:

    由于RBL的加载过程是将UBL拷贝到ARM的内部RAM中,因此对于UBL的大小限制在14 KB以内,但是在嵌入式环境常用的U-BOOTViVi等的大小都远超过这个限制,因此需要多级加载,一级引导程序主要做系统的初始化,然后将二级引导程序(我们采用U-BOOT)NAND Flash中读取到RAM中,然后启动它,由U-BOOT负责操作系统的引导。于是整个NAND Flash上系统构建的关键问题包括如何移植UBL,以使其能够正常初始化系统,正常加载二级引导程序U-BOOTRAM中。

     

  • 我还是一个在校的大学生,还只是一个菜鸟。暑假的时候报名参加了”TI杯全国大学生电子设计大赛“,整个暑假都在紧张的备战中。此次的开发平台是Launchpad G2,首次接触430单片机的时候,有些别扭,因为和51系列有些不同吧。这样一个暑假下来之后,430单片机学习的差不多了。在学习的过程中,得知430单片机的功耗特别的低,只是由于我们在平时设计的时候都不是很注意低功耗的应用,尤其是在实验室基本上不考虑功耗的问题。但是在前几天刚刚结束的”TI杯大学生电子设计大赛山东赛区“的比赛过程中,让我对430单片机的低功耗有了更深入的了解。我们选的题目是C题:超低功耗倾角测量仪,要求用2200uF的电容为整个系统供电,持续尽可能长的时间,发挥部分要求用100uF的电容为整个系统供电,持续尽可能长的时间。在这道题目当中必须要充分利用430单片机低功耗的特点,比且要很好的考虑电源降压电路的设计,提高电源转换的效率。在评比的现场,看到有的牛人用100uF的电容为整个系统供电长达5分钟,真是佩服得很啊。

    关于TI Sitara ,自己以前没怎么接触过,也不是很了解,不过想想也应该是很不错的开发板,毕竟用过的TI的板子都是很不错的。

  • 支持,希望有大家有很好的资料

  • 延迟到10月7号,板子可以多备点啊:)  大部分同志们还是希望能拿到一个块板子体验一下的。

  • 没用过Sitara,密切关注。

  • 虽然没有用Sitara芯片设计产品量产,但评估过。

    产品是以太网远程电源控制器,评估

    过一些方案,基于性价比,和可靠性,选用的是LM3S6432,

    但最终由于客户市场推广的原因,没有量产,开发前期工作也进行了一部分。

    发点资料吧。

     

    LSD-S2E21-01A_V1.0.pdf
  • Sitara比较高端吧,我现在还在用三星的ARM9,接下来准备向A8进军了

  • ARM裸机设计

    在论坛里见到好多朋友学习裸机的时候都有一个习惯——做裸机开发时,过度依赖天嵌的裸机测试程序。

    文全刚的《汇编语言程序设计——基于ARM体系结构》(这本书主要介绍的是ARM的指令和ARM的架构,没有讲基于ARM的开发)(北航出版)全面介绍了ARM的体系结构,每一条指令都有相应的例子,最后一章还有ARM汇编语言程序设计的实验。这本书中,还介绍了ADS1.2集成开发环境的使用。

    在网上看了很多资料,从对ARM产生兴趣,决定要尝试一下!

    还得谢谢TI提供的一些资料和元器件。支持你们公司的工作!

    ARM裸机设计.doc
  • AM335x UBI Filesystem 的制作以及 NandFlash 启动

     

    UBI Filesystem 制作

    编译 mtd-utils

    软件环境:

    Ubuntu 11.04

    am335x-evm-sdk-05.05.00.00

     

    获取源码:

    可通过以下链接下载 MTD Utils:

    http://download.chinaunix.net/download.php?id=33753&ResourceID=13056

     

    或通过 Git 获取源码:

    git://git.infradead.org/mtd-utils.git

     

    推荐使用 mtd-utils 1.4.8 以上

     

    编译 mtd-utils 之前,需先安装以下工具:

    1.        zlib

    2.        lzo

    3.        e2fsprogs

     

    zlib 和 e2fsprogs Ubuntu 中已经自带了,所以只需安装 lzo。注意,安装时需连接网络。

     

    打开终端,输入:

     

    sudo apt-get install liblzo2-2

    sudo apt-get install liblzo2-dev

    sudo apt-get install uuid-dev

     

    安装完毕后,开始编译mtd-utils。

     

    打开终端,输入:

     

    cd [your base directory]/mtd-utils-1.5.0

    make WITHOUT_XATTR=1

     

    至此,mtd-utils 编译完成。

    制作 UBI Filesystem

    打开终端,输入:

    cd [your base dirctory]/mtd-utils-1.5.0

    mkfs.ubifs/mkfs.ubifs -r [your filesystem directory]/ -F -o ubifs.img -m 2048 -e 126976 -c 1580

     

    其中,[your filesystem directory]/ 换成你的文件系统文件夹,建议先使用 TI 官方的 base-rootfs-am335x-evm.

     

    各个参数的详细说明(来自TI Wiki:

    http://processors.wiki.ti.com/index.php/UBIFS_Support#Creating_UBIFS_file_system):

    -m 2KiB (or 2048)
    The minimum I/O size of the underlying UBI and MTD devices. In our case, we are running the flash with no sub-page writes, so this is a 2KiB page.
    -e 124KiB (or 126976)

    Erase Block Size: UBI requires 2 minimum I/O units out of each Physical Erase Block (PEB) for overhead: 1 for maintaining erase count information, and 1 for maintaining the Volume ID information. The PEB size for the XO flash is 128KiB, so this leads to each Logical Erase Block (LEB) having 124KiB available for data.
    -c 1580
    The maximum size, in LEBs, of this file system. See calculation below for how this number is determined.
    -r filesystem
    Use the contents of the 'filesystem/' directory to generate the initial file system image.

    -F

    File-system free space has to be fixed up on first mount (http://www.linux-mtd.infradead.org/faq/ubifs.html#L_free_space_fixup)
    -o ubifs.img
    Output file. 

    执行完毕后会在当前目录下生成 ubifs.img.

     

    在终端继续输入:

    gedit ubinize.cfg

     

    在打开的编辑器中输入以下内容:

    [ubifs]

    mode=ubi

    image=ubifs.img

    vol_id=0

    vol_size=192MiB

    vol_type=dynamic

    vol_name=rootfs

    vol_flags=autoresize

     

    保存后退出,在终端输入:

    ubi-utils/ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg

     

    参数介绍:

    Where:
    -o ubi.img
    Output file
    -m 2KiB (or 2048)
    Minimum flash I/O size of 2KiB page
    -p 128KiB

    Size of the physical eraseblock of the flash this UBI image is created for

    -O 2048 offset if the VID header from start of the physical eraseblock

    The output of the above command, 'ubi.img' is the required image.

     

    完成后,会在当前目录下生成 ubi.img, 这个就是我们需要烧录到 Flash 中的文件。

     

     

     

    烧录 Nandflash

    修改 Source Code

    U-Boot

    虽然官方说支持 NandFlash 启动,但在 U-Boot 04.06.00.08 的 SPL 代码中没有添加对 boot mode 的选择,仅仅默认从 SD 卡启动,因此

    需修改 [your u_boot base directory]\arch\arm\cpu\armv7\omap-common\boot-common.c 文件,从第 38 行改为:

     

    /* Modified by WPI Mile Tang */

    u32 omap_bootmode[] = {

                                MMCSD_MODE_FAT,

                                NAND_MODE_HW_ECC,

                       };

    /* End */

    u32 omap_boot_device(void)

    {

             return (u32) (boot_params.omap_bootdevice);

    }

    /* Modified by WPI Mile Tang */

    u32 omap_boot_mode(void)

    {

             u32 boot_device = omap_boot_device();

             switch(boot_device){

             case BOOT_DEVICE_NAND:

                       return omap_bootmode[1];

             case BOOT_DEVICE_MMC1:

             case BOOT_DEVICE_MMC2:

             default:

                       return omap_bootmode[0];

             }       

    }

    /* End */

     

    修改完后重新编译。

     

    Linux Kernel:

    由于 SDK 是 3.2 的内核,需要打以下补丁,关于该补丁的描述参见https://patchwork.kernel.org/patch/1245721/

    并且该补丁已融入3.4.7内核中http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.4.7

     

    --- a/fs/ubifs/sb.c
    +++ b/fs/ubifs/sb.c
    @@ -718,8 +718,12 @@ static int fixup_free_space(struct ubifs_info *c)
                    lnum = ubifs_next_log_lnum(c, lnum);
            }

    -        /* Fixup the current log head */
    -        err = fixup_leb(c, c->lhead_lnum, c->lhead_offs);
    +        /*
    +         * Fixup the log head which contains the only a CS node at the
    +         * beginning.
    +         */
    +        err = fixup_leb(c, c->lhead_lnum,
    +                        ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));
            if (err)
                    goto out;

     

     

     

    如果你使用的是 WPI 的 EVM,在 Linux kernel 中需修改文件 [your kernel base directory]\arvh\arm\mach-omap2\board-am335xevm.c:

    /* General Purpose EVM */

    static struct evm_dev_cfg gen_purp_evm_dev_cfg[] = {

             {enable_ecap0,        DEV_ON_DGHTR_BRD, (PROFILE_0 | PROFILE_1 |

                                                            PROFILE_2 | PROFILE_7) },

             {lcdc_init,          DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |

                                                            PROFILE_2 | PROFILE_7) },

             {tsc_init,  DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |

                                                            PROFILE_2 | PROFILE_7) },

             {rgmii1_init,     DEV_ON_BASEBOARD, PROFILE_ALL},

             {rgmii2_init,     DEV_ON_DGHTR_BRD, (PROFILE_1 | PROFILE_2 |

                                                            PROFILE_4 | PROFILE_6) },

             {usb0_init,        DEV_ON_BASEBOARD, PROFILE_ALL},

             {usb1_init,        DEV_ON_BASEBOARD, PROFILE_ALL},

             {evm_nand_init, DEV_ON_DGHTR_BRD,

                      (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},

             {i2c1_init,     DEV_ON_BASEBOARD, (PROFILE_ALL & ~PROFILE_2)},

             {mcasp1_init,  DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_3 | PROFILE_7)},

             {mmc1_init,     DEV_ON_BASEBOARD, PROFILE_2},

             {mmc2_wl12xx_init,         DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_3 |

                                                                               PROFILE_5)},

             {mmc0_init,     DEV_ON_BASEBOARD, (PROFILE_ALL & ~PROFILE_5)},

             {mmc0_no_cd_init, DEV_ON_BASEBOARD, PROFILE_5},

             {spi0_init,         DEV_ON_DGHTR_BRD, PROFILE_2},

             {uart1_wl12xx_init, DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_3 |

                                                                               PROFILE_5)},

             {wl12xx_init,    DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_3 | PROFILE_5)},

             {d_can_init,      DEV_ON_DGHTR_BRD, PROFILE_1},

             {matrix_keypad_init, DEV_ON_BASEBOARD, PROFILE_0},

             {volume_keys_init,  DEV_ON_BASEBOARD, PROFILE_0},

             {uart2_init,       DEV_ON_DGHTR_BRD, PROFILE_3},

             {haptics_init,   DEV_ON_DGHTR_BRD, (PROFILE_4)},

             {NULL, 0, 0},

    };

     

    高亮处修改为

             {evm_nand_init, DEV_ON_BASEBOARD,

                      (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},

     

     

    修改之后重新编译 Kernel。

     

    烧录文件:

    这里介绍通过 SD 卡烧录 NandFlash 的方法:

    首先制作 SD 启动卡,请参考

    http://software-dl.ti.com/dsps/dsps_public_sw/am_bu/sdk/AM335xSDK/latest/exports/sitara-linuxsdk-sdg-05.05.00.00.pdf

     

    然后将 ubi.img 也拷贝到 SD 卡boot分区,启动开发板,停在 u-boot 阶段,在串口终端中输入:

    U-Boot# mmc rescan

    U-Boot# fatload mmc 0 0x82000000 MLO

    U-Boot# nandecc hw 2

    U-Boot# nand erase 0x0 0x20000

    U-Boot# nand write.i 0x82000000 0x0 0x20000

    U-Boot# mw.b 0x82000000 0 0x20000

     

    U-Boot# mmc rescan

    U-Boot# fatload mmc 0 0x82000000 u-boot.img

    U-Boot# nandecc hw 2

    U-Boot# nand erase 0x80000 0x40000

    U-Boot# nand write.i 0x82000000 0x80000 0x40000

    U-Boot# mw.b 0x82000000 0 0x40000

     

    U-Boot# mmc rescan

    U-Boot# fatload mmc 0 0x82000000 uImage

    U-Boot# nandecc hw 2

    U-Boot# nand erase 0x00280000 0x00500000

    U-Boot# nand write.i 0x82000000 0x00280000 0x500000

    U-Boot# mw.b 0x82000000 0 0x500000

     

    U-Boot# mmc rescan

    U-Boot# fatload mmc 0 0x82000000 ubi.img

    U-Boot# nandecc hw 2

    U-Boot# nand erase 0x780000 0xf880000

    U-Boot# nand write.i 0x82000000 0x780000 0x1200000(此处参数根据你的 ubi.img 大小设置)

     

    U-Boot# setenv bootcmd 'run nand_boot'

    U-Boot# boot

     

    此时即可成功启动 Linux。

     

    参考链接:

    AM335x U-Boot User's Guide:

    http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide

     

    Creating UBIFS file system:

    http://processors.wiki.ti.com/index.php/UBIFS_Support#Creating_UBIFS_file_system

     

    AM335X UBIFS NandFlash Programming Guide v1.1.pdf
  • BeagleBone (Linux(Ubuntu)系统下的驱动安装。

    BeagleBone目前发布的硬件版本为A5,相比之前发布的A3、A4版本变化并不大,最主要的是更改了USB的PID(产品识别码)为通用的号码,这样USB的驱动安装更为简便。这次拿到还是A3版本的BeagleBone,因此主要说说怎么安装USB驱动

    1. Windows XP

    BeagleBone上USB设备还是蛮多的,所有的设备都是通过一个mini USB口连接:

    1. ——SMSC USB HUB  这是一个2口的USB HUB
    2. ——FTDI USB转串口
    3. ——FTDI USB转JTAG口

    在Windows XP下有的USB HUB驱动可以自动安装上,不过FTDI USB驱动的要去官网下载。在BeagleBoard的网站上可以下载BeagleBone的驱动文件BONE_DRV.exe,不过运行的时候会报错,

    可能在中文Windows下不兼容,所以首先还是去FDTI官网下载USB转串口的驱动文件http://www.ftdichip.com/Drivers/VCP.htm

    在BeagleBone A3版本中,FTDI FT2232H USB转接芯片的VID/PID号与TI仿真器XDS100上的一样是0x0403/0xA6D0,而与通用的FTDI VID/PID(0x0403/0x6010)有所不同,因此下载FTDI驱动程序后要对安装信息文件inf修改一下才行。(如果你拿到的是BeagleBone A5版本的话可以跳过修改inf文件,直接安装驱动)

    解压所下载的FTDI驱动程序

    首先修改ftdibus.inf文件。要修改的是文件中的[FtdiHw], [FtdiHw.NTamd64] and [Strings]块。

    [FtdiHw]
    %USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6001
    %USB\VID_0403&PID_6010&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6010&MI_00
    %USB\VID_0403&PID_6010&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6010&MI_01
    %USB\VID_0403&PID_6011&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_00
    %USB\VID_0403&PID_6011&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_01
    %USB\VID_0403&PID_6011&MI_02.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_02
    %USB\VID_0403&PID_6011&MI_03.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6011&MI_03
    %USB\VID_0403&PID_6014.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_6014

    [FtdiHw.NTamd64]
    %USB\VID_0403&PID_6001.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6001
    %USB\VID_0403&PID_6010&MI_00.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6010&MI_00
    %USB\VID_0403&PID_6010&MI_01.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6010&MI_01
    %USB\VID_0403&PID_6011&MI_00.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_00
    %USB\VID_0403&PID_6011&MI_01.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_01
    %USB\VID_0403&PID_6011&MI_02.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_02
    %USB\VID_0403&PID_6011&MI_03.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6011&MI_03
    %USB\VID_0403&PID_6014.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0403&PID_6014

    ………

    [Strings]
    Ftdi="FTDI"
    DESC="CDM Driver Package - Bus/D2XX Driver"
    DriversDisk="FTDI USB Drivers Disk"
    USB\VID_0403&PID_6001.DeviceDesc="USB Serial Converter"
    USB\VID_0403&PID_6010&MI_00.DeviceDesc="USB Serial Converter A"
    USB\VID_0403&PID_6010&MI_01.DeviceDesc="USB Serial Converter B"
    USB\VID_0403&PID_6011&MI_00.DeviceDesc="USB Serial Converter A"
    USB\VID_0403&PID_6011&MI_01.DeviceDesc="USB Serial Converter B"
    USB\VID_0403&PID_6011&MI_02.DeviceDesc="USB Serial Converter C"
    USB\VID_0403&PID_6011&MI_03.DeviceDesc="USB Serial Converter D"
    USB\VID_0403&PID_6014.DeviceDesc="USB Serial Converter"
    SvcDesc="USB Serial Converter Driver"
    ClassName="USB"

    上面是FTDI通用的VID/PID号,把它们改为

    [FtdiHw]
    %USB\VID_0403&PID_A6D0&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_A6D0&MI_00
    %USB\VID_0403&PID_A6D0&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_A6D0&MI_01


    [FtdiHw.NTamd64]
    %USB\VID_0403&PID_A6D0&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_A6D0&MI_00
    %USB\VID_0403&PID_A6D0&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0403&PID_A6D0&MI_01

    [Strings]
    Ftdi="FTDI"
    DESC="CDM Driver Package - Bus/D2XX Driver"
    DriversDisk="FTDI USB Drivers Disk"
    USB\VID_0403&PID_A6D0&MI_00.DeviceDesc="USB Serial Converter A"
    USB\VID_0403&PID_A6D0&MI_01.DeviceDesc="USB Serial Converter B"
    SvcDesc="USB Serial Converter Driver"
    ClassName="USB"

     然后再修改fdtiport.inf文件中[FtdiHw], [FtdiHw.NTamd64] and [Strings]块相应内容

    [FtdiHw]
    %VID_0403&PID_6001.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6001
    %VID_0403&PID_6010.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6010
    %VID_0403&PID_6011.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6011
    %VID_0403&PID_6014.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_6014

    [FtdiHw.NTamd64]
    %VID_0403&PID_6001.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6001
    %VID_0403&PID_6010.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6010
    %VID_0403&PID_6011.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6011
    %VID_0403&PID_6014.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6014

    [Strings]
    FTDI="FTDI"
    DESC="CDM Driver Package - VCP Driver"
    DriversDisk="FTDI USB Drivers Disk"
    PortsClassName = "Ports (COM & LPT)"
    VID_0403&PID_6001.DeviceDesc="USB Serial Port"
    VID_0403&PID_6010.DeviceDesc="USB Serial Port"
    VID_0403&PID_6011.DeviceDesc="USB Serial Port"
    VID_0403&PID_6014.DeviceDesc="USB Serial Port"
    SvcDesc="USB Serial Port Driver"
    SerEnum.SvcDesc="Serenum Filter Driver" 

    改为

    [FtdiHw]
    %VID_0403&PID_A6D0.DeviceDesc%=FtdiPort.NT,FTDIBUS\COMPORT&VID_0403&PID_A6D0


    [FtdiHw.NTamd64]
    %VID_0403&PID_A6D0.DeviceDesc%=FtdiPort.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_A6D0

    [Strings]
    FTDI="FTDI"
    DESC="CDM Driver Package - VCP Driver"
    DriversDisk="FTDI USB Drivers Disk"
    PortsClassName = "Ports (COM & LPT)"
    VID_0403&PID_A6D0.DeviceDesc="BeagleBone USB Serial Port"
    SvcDesc="USB Serial Port Driver"
    SerEnum.SvcDesc="Serenum Filter Driver"

    驱动文件改好后,现在我们可以接通电源了。BeagleBone有两种供电,可以通过5V的稳压电源线供电,也可以直接通过USB线供电。为了方便,我们先通过USB线来工作。

  • 我为什么在正文打字都无法回复出来啊!

    上一个帖子,是我的课设,有点普通了,拍照系统比较俗了。。。

    耗费了我大半个学期,所以挺希望获得点奖励什么的哦~~~

    之前一直是管别人借的AM3359来做东西的,一结束就抓紧的还给别人了。。。挺希望自己也能有一个开发板之类的。

    beaglebone板我都看了好久了,就是贵啊,实在是可望而不可及啊~

    希望能获得一个作为奖励,这样我就能好好的学习了!

  • 这个是我写的,哈哈,不是原创哦

  • 这个也是我写的,哈哈,也不是原创哦

  • 最近在用贵公司Sitara ARM9的TMDXEXP1808L 实验板做一些设计,我使用的这个实验板上提供了很多的外设和接口,在设计项目时给我提供了很大的方便,在使用该评估板时给我最大的收获是贵公司设计的独特的可编程实时单元即你们的PRU,该可编程实时单元通过消除延时,提高响应能力,大大提高了效率,我做一些小的设计时,通过该评估板的仿真模拟,很大程度的减小了误差,使设计更加的稳定,在使用该评估板时,自己也遇到很多的问题,比如CAN的比特率设置问题,用NOR Flash下不进程序等问题,那些问题有些是因为参数设置不正确造成的,有些是对评估板不熟悉造成的,所以我还应当更加深刻的熟悉该评估板,希望自己通过开发板能设计出更多的稳定、可靠的设计。也希望贵公司能够开发出越来越多的优质产品。

  • 给自己设计的扩展板移植 Android ICS 4.0.3

     

    第一步当然是下载android源码啦~ TI官网有提供。

    地址如下:

    http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_ICS_4_0_3_DevKit_3_0_1/index_FDS.html

     

    下载:TI Android ICS 4.0.3 DevKitV3.0.1 AM335x EMV-SK Sources

     

    下载的环境:UBUNTU (我用WIN7下载卡死在了99.99% PS:虚拟机的空间要足够大(25G以上)

     

    下载完成解压前,得先安装需要的软件。

     

    sudo gedit /etc/apt/sources.list

    在最后一行加入:

     

    deb http://us.archive.ubuntu.com/ubuntu/hardy multiverse 保存退出

    接下来:

     

    $ sudo apt-get update

    $ sudo apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev minicom tftpd uboot-mkimage expect

    安装软件时,安步骤走即可。

     

    之后就可以安装下载好的 android源码啦。

     

    步骤:

      $ mkdir $HOME/rowboat-android
      $ cd $HOME/rowboat-android
      $ chmod a+x TI-Android-ICS-4.0.3_AM335x_3.0.1.bin
      $ ./TI-Android-ICS-4.0.3_AM335x_3.0.1.bin

     

    大概15分钟后,就可以安装完成。安装完成后,得到如图资源:

     

     

     

    To  Build  Bootloader

     

      cd u-boot

    $ make CROSS_COMPILE=arm-eabi- distclean
      $ make CROSS_COMPILE=arm-eabi- am335x_evm_config
      $ make CROSS_COMPILE=arm-eabi- 

    大概10分钟后编译完成。在当前目录下得到生成的MLO以及u-boot.Img

     

    To Build Android Linux Kernel

    我的开发板环境是beaglebone,自己设计了扩展板,为了使得源码适合我的扩展板,所以在编译内核之前,修改一下源码。

     

    cd kernel

    gedit arch/arm/mach-omp2/borad-am335xevm.c

    举个例子:

    1 增加用户指示灯:

    找到:

    static struct pinmux_config gpio_led_mux[] = {

           {"gpmc_ad4.gpio1_4", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_ad5.gpio1_5", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_ad6.gpio1_6", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_ad7.gpio1_7", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {NULL, 0},

    };

     

    改成:

    static struct pinmux_config gpio_led_mux[] = {

           {"gpmc_a5.gpio1_21", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_a6.gpio1_22", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_a7.gpio1_23", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {"gpmc_a8.gpio1_24", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

           {NULL, 0},

    };

    并在static struct evm_dev_cfg beaglebone_dev_cfg[]  中添加

     

    2增加7寸液晶驱动以及触摸屏驱动

    增加液晶驱动需要做的:

    1 添加对应的struct da8xx_lcdc_platform_data

    2修改文件中 disp_panellcd_cfg的值

    3 da8xx-fb.c中修改液晶时序参数

    4 static struct evm_dev_cfg beaglebone_dev_cfg[]  中添加对应初始化函数

    5 修改 bone_setup_daughter_board函数的内容

     

    需要玩转android,还得加入按键。按键的驱动可以修改lcd_cape_gpio_buttons的对应管脚来实现。

    以上内容代码太多,就不在此粘贴复制了

     

    改好之后就可以编译内核了。

     

    $ make ARCH=arm CROSS_COMPILE=arm-eabi- distclean
      $ make ARCH=arm CROSS_COMPILE=arm-eabi- am335x_evm_android_defconfig
      $ make ARCH=arm CROSS_COMPILE=arm-eabi- uImage

     

    编译的时间大概要20分钟左右,看你的机器了。

     

    后面就制作SD卡了。

    建议从http://software-dl.ti.com/dsps/dsps_public_sw/sdo_tii/TI_Android_DevKit/TI_Android_ICS_4_0_3_DevKit_3_0_1/index_FDS.html

    下载Pre-built Image栏下的Beaglebone

     

    然后 tar  -xzvf Beaglebone.tar.gz

    然后把之前编译好的U-boo/.下的MLO  u-boot.img 以及 kernel/arch/arm/boot下的uImage复制到刚解压出来的Boot_Images/目录中

    然后 cd  beaglebone

         ./mkmmc-android.sh  <你的SD卡盘符>

    确认后,大概5分钟就制作好了。

     

    看看启动后的效果吧:


     

    补一张安装源码包的截图吧.

     

    PS:这是在做一个基于beaglebone的遥控终端时移植系统时的记录,很高兴能在截至前参加这次活动,由于第一个打样的板子用的不是这个型号的液晶,因此这个液晶是用杜邦线连的。

    楼下接着分享一下我的硬件电路设计分享吧。

     

    beaglebone--Android开发.docx
  • 我的设计是基于beaglebone的无线遥控终端。主要模块有wifi:用于无线传递和接收数据。LCD:用于显示小车传回的画面数据。当然还有用于控制小车前进方向的触摸屏、按键、重力传感器。
    主要部分原理图及绘制心得:
    1
    引出beaglebone引脚:

     

    这个部分主要是细心,参考beaglebone的原理图来标注网络。
    2 LCD 
    第一版选用了群创的AT070TN92  这一版(准备第二次打样)用的是群创的AT070TN83

    主要注意液晶需要的电源电压以及背光电压,一般接成16bpp模式就足够了。之前选用AT070TN92,因为没有制作DC-DC电源的经验,因为电源芯片选用的问题拖了几天还没点亮液晶。最后放弃选用AT070TN92
    本来一开始就想选用AT070TN83的,开始由于成本没使用,现在是得不偿失。

     

    3 wifi 选用了市面上学习用得较多的 WM-G-MR-09Marvell8686),另外我也准备了 usb接口的wifi,用于对比。

    wifi模块主要的问题是稳定性,目前我使用usb网卡OURLINK接到beaglebone,搜索网络可以搜到67个,连到无线路由时,有时会连不上。怀疑是linux自带的驱动不稳定的问题。

    上传原理图pdf


    newbone.pdf
  • 感谢各位朋友的参与!经TI FAE的评估,BeagleBone的获奖者如下:

    A xian; Chen mao; Qi Fu; Xiangfeng li; zerong Li; Xuebin Huang; xiang zhang; Mile Tang; Zhiping Qin; Jun Feng Xu

    获得阳光普照奖的名单如下:

    yongqing wang

    ni ni

    Allen Lee

    feifei zhuang

    firstma

    Ying Wang

    LUE FRYE

    changhu fang

    jichang wang

    HUA YIN:

    Jun Liu

    wang wang

    Eric mao

    tang feng

    chunxiao xiong

    James Zhu

    wang hanghang

    weimin chen

    Jame Jame

    winthony

    由于此次不是文档分享活动,而是基于原创的分享,因此转载他人的分享无缘此次奖项。希望大家理解。我们今后也会推出更多不同的线上活动。望大家持续关注TI论坛。再次感谢大家的参与!

  • 唉,失望了,怎么是普照啊,好想有个板子玩玩。

  •      谢谢TI提供了这么好的交流平台。

      该如何领奖呢?

  • TI的物流公司会稍后与大家联系,确认具体地址和联络方式。