一只鱼's profileEE小站PhotosBlogListsMore Tools Help

Blog


    October 10

    Mum计划之urjtag、gdbproxy的下载速度优化

     
    国庆假期宅在北京,下回放假一定要出去走走。不过也有收获,就是今天这篇文章。
    本文的主要内容是如何修改urjtag和gdbproxy的代码,提高Blackfin GDB调试时,代码下载的速度。
    本文属于Mum计划,Mum计划的目的是制作一套开源的Blackfin调试和开发解决方案。
    Mum计划使用基于FT2232的JTAG电缆——MumJTAG进行Blackfin处理器的GDB调试。
    MumJTAG使用urjtag和gdbproxy来进行GDB调试:urjtag和gdbproxy的基本编译请看这篇文章:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!850.entry
    本文隐含性的提到JTAG调试原理知识,如果不明白,请自行查找文章。
    本文参考文档有,http://blackfin.uclinux.org上的这两篇:
    还有http://www.hjtag.com的Twentyone大侠写的一篇,我给放到EE小站的SkyDrive了:
    关于DCC下载,请看http://blackfin.uclinux.org上的这篇:
    以及ADI官方的Blackfin手册,我下载下来,放到EE小站的SkyDrive:
    下面开始正题,转载请注明来自我是一只鱼的EE小站,邮件cosine@126.com
     
    虽说之前我成功编译了Blackfin的GDB调试代理,但用起来可不像OpenOCD那么好用,尤其是gdbproxy的代码下载速度仅有4kb/s,一个u-boot就要一分钟才能下载完,简直无法接受。为了让Mum计划的调试方案实用,我付出了很多努力。虽然我没有深究Blackfin JTAG调试原理,但我的代码勉强让gdbproxy的代码下载速度提高到了40~60kb/s,虽然比不上有人专门研究的可以达到120kb/s的ICEBear(http://www.section5.ch/icebear),但是作为开源调试器,60kb/s的下载速度应该可以对付大多数应用了,我就偷点懒,不继续优化,就让ICEBear有点钱赚。微笑同时,由于我是囫囵吞枣式的做了这个优化,肯定有很多不合理之处,请真正牛叉的大侠予以指正,谢谢。
     
    为什么urjtag和gdbproxy那么慢呢?因为FT2232这种器件仅仅是一个信号转换器,所有的JTAG操作都是用程序模拟的。FT2232是USB的,这就带来一个问题,USB数据传输不是实时的,每个设备都占用一定的轮询时间;如果要从JTAG读取某些东西,就必须以轮询周期为单位读取。例如,gdbproxy每向JTAG写4个字节(unsigned long),就要读取JTAG状态,看是不是CPU准备好了。由于USB的轮询周期较长,说实话我也不记得了,也许是125us,也许是1ms,那么这个周期写一下数据,下个周期读一下状态,下载速度就只能是个位数的kb了。
     
    说说我是怎么做到的:
    1.将默认JTAG TCK频率提高到6MHz;
    2.实现传说中的DCC下载功能;
    3.关闭大于4字节批量写操作的Cache清空功能。
     
    第一点没有什么说到的,很好理解。
    第二点,什么是DCC下载?DCC这个名字其实借用了ARM公司的说法(Debug Communication Channel),ADI有别的叫法,不管怎么叫,他们描述的事实是一致的——CPU和JTAG扫描链共享某个寄存器。说说DCC下载怎么工作吧,CPU运行一段小程序,不断扫描JTAG共享的寄存器里是不是有新数据,如果有,就保存到内存中;JTAG电缆不断通过JTAG口,向JTAG共享寄存器里写入新数据。由于现代CPU的读取和保存数据速度一般都比JTAG扫描链快很多,所以JTAG电缆就不需要看CPU是不是准备好了,节约了读取CPU状态的时间。这里还牵涉到两个问题:(1)如果不使用DCC下载,是什么样子?(2)为什么节约读取CPU状态的时间就能提高速度?问题(1),不使用DCC下载,CPU的JTAG调试逻辑里一般都有一个仿真指令寄存器(Emulation Instruction Register),用JTAG可以向这个寄存器里写入单条处理器指令,例如对于ARM,可以是MOV R0, 0x00之类的,并执行,这样,R0的数值就变成0了,再写入STR R1, R0之类的指令,就把数据存到内存去了,但对于Blackfin,这样需要查询CPU是不是完成了仿真指令。问题(2),刚才提到了,USB的轮询周期时间太长,FT2232内部有FIFO,可以储存4k个的JTAG信号电平变换的时序数据,也就是说,如果不接收,只发送,那么每当JTAG电平数据达到4k个的时候才需要发送一次,这样一次发送就大约可以发送几十个字节,而不是原先的4个字节;再说接收造成的影响,由于每个USB的轮询周期,数据既有读,又有写,如果某个周期必须读一次数据,而写数据没有那么多,就造成了FT2232内部FIFO不能被填满,浪费了时间。呵呵,很复杂。
    DCC下载的使用是有代价的——需要一个很小的内存空间来跑CPU DCC扫描程序。也就是说,先通过JTAG下载一段小程序到CPU的SRAM,然后运行这段小程序来下载代码。在我这个优化里,我使用了0xffa08000~0xffa08020这段32字节的空间,这段空间BF531~533都有。我写的CPU DCC扫描程序很简单:
        P1.L = LO(DBGSTAT);
        P1.H = HI(DBGSTAT);
        R1.L = 0x0002;
        R1.H = 0x0000;
    .loop_dbgstat:
        R0 = [P1];
        R0 = R0 & R1;
        cc = R0 == R1;
        if cc jump .write_emudat;
        jump .loop_dbgstat;
    .write_emudat:
        R0 = EMUDAT;
        [P0++] = R0;
        jump .loop_dbgstat;
    需要做的就是启动DCC之前,保护R0、R1、P0、P1和PC,并把R0设成要下载数据的首地址;在执行程序之后,还原被保护的寄存器。
    第三点,我是自作主张的,因为我觉得一般执行load命令的时候才会有大量的数据写入,而load命令执行之后,本身程序就要重启,跟cache没有什么关系,所以无所谓。
     
    原理说明白了,下面贴上程序:
     
    • urjtag/src/bfin/bfin.c,982行,增加函数

    void
    part_emudat_set_new (chain_t *chain, int n, uint32_t value, int exit)
    {
      part_t *part;
      tap_register *r;

      assert (exit == EXITMODE_UPDATE || exit == EXITMODE_IDLE);

      if (part_scan_select (chain, n, EMUDAT_SCAN) < 0)
        return;

      part = chain->parts->parts[n];
      r = part->active_instruction->data_register->in;
      emudat_init_value (r, value);
      chain_shift_data_registers_mode (chain, 0, 1, exit);
    }

    • gdbproxy/target_bfin_new.c,464行

    static char default_jtag_connect[] = "cable gnICE";

    修改为

    static char default_jtag_connect[] = "cable USB-to-JTAG-IF ftd2xx-mpsse 0725:6010";
    static char default_jtag_frequency[] = "frequency 6000000";

    • gdbproxy/target_bfin_new.c,1258行,增加函数

    static void
    core_emudat_set_new (int core, uint32_t value, int runtest)
    {
      part_emudat_set_new (cpu->chain, core, value,
         runtest ? EXITMODE_IDLE : EXITMODE_UPDATE);
    }

    • gdbproxy/target_bfin_new.c,3085行,函数修改为

    static void
    cache_flush (int core, uint32_t addr, int size)
    {
      uint32_t p0;
      int i;

      assert (size > 0);

      if (size <= 4)
      {
       p0 = core_register_get (core, REG_P0);

       core_register_set (core, REG_P0, addr);
       core_dbgctl_bit_set_emuirlpsz_2 (core, UPDATE);
       for (i = (size + addr % CACHE_LINE_BYTES - 1) / CACHE_LINE_BYTES + 1;
            i > 0; i--)
         core_emuir_set_2 (core, gen_flush (REG_P0),
             gen_iflush_pm (REG_P0), RUNTEST);
       core_dbgctl_bit_clear_emuirlpsz_2 (core, UPDATE);

       core_register_set (core, REG_P0, p0);
      }

    • gdbproxy/target_bfin_new.c,3409行,函数修改为

    static int
    memory_write (int core, uint32_t addr, uint8_t *buf, int size)
    {
      uint32_t p0, r0, p1, r1, pc;
      int clobbered[BFIN_DCPLB_NUM];
      int i;
      uint8_t isram_backup[32];

      assert (size > 0);

      p0 = core_register_get (core, REG_P0);  //保护各个寄存器
      p1 = core_register_get (core, REG_P1);
      r0 = core_register_get (core, REG_R0);
      r1 = core_register_get (core, REG_R1);
      pc = core_register_get (core, REG_RETE);

      for (i = 0; i < BFIN_DCPLB_NUM; i++)
        clobbered[i] = 0;

      dcplb_validate_clobber_p0r0 (core, addr, size, clobbered);

      core_register_set (core, REG_P0, addr);

      core_dbgctl_bit_set_emuirlpsz_2 (core, UPDATE);

      if ((addr & 0x3) != 0)
        core_emuir_set_2 (core,
            gen_move (REG_R0, REG_EMUDAT),
            gen_store8pi (REG_P0, REG_R0), UPDATE);

      while ((addr & 0x3) != 0 && size != 0)
        {
          core_emudat_set (core, *buf++, RUNTEST);
          addr++;
          size--;
        }
      if (size == 0)
        goto finish_write;

      if (size >= 4)
     {
       bfin_resume_from_addr(0, 0, 0xffa08000);  //启动已经储存在0xffa08000的CPU DCC扫描程序

       for (; size >= 4; size -= 4)
       {
        uint32_t data;
      
        data = *buf++;
        data |= (*buf++) << 8;
        data |= (*buf++) << 16;
        data |= (*buf++) << 24;
        core_emudat_set_new (core, data, RUNTEST);  //往共享寄存器里写数据
       }
     
       bfin_stop();  //停止CPU DCC扫描程序
     }

      if (size == 0)
        goto finish_write;

      core_emuir_set_2 (core,
          gen_move (REG_R0, REG_EMUDAT),
          gen_store8pi (REG_P0, REG_R0), UPDATE);

      for (; size > 0; size--)
        core_emudat_set (core, *buf++, RUNTEST);

    finish_write:

      core_dbgctl_bit_clear_emuirlpsz_2 (core, UPDATE);

      dcplb_restore_clobber_p0r0 (core, clobbered);

      core_register_set (core, REG_P0, p0);  //恢复各个寄存器
      core_register_set (core, REG_P1, p1);
      core_register_set (core, REG_R0, r0);
      core_register_set (core, REG_R1, r1);
      core_register_set (core, REG_RETE, pc);

      return 0;
    }

    • gdbproxy/target_bfin_new.c,4318行,增加:

      char *freq_string = default_jtag_frequency;

    • gdbproxy/target_bfin_new.c,4342行,增加:

        {"freq", required_argument, 0, 18},

    • gdbproxy/target_bfin_new.c,4520行,增加:

     case 18:
      strcpy(freq_string, "frequency ");
      strcat(freq_string, optarg);
      break;

    • gdbproxy/target_bfin_new.c,4569行,增加:

     jtag_parse_line (chain, freq_string);

    • gdbproxy/target_bfin_new.c,5061行,增加:

      uint32_t dcc_code[] =
      {
       0x5008e109,
       0xffe0e149,
       0x0002e101,
       0x0000e141,
       0x54089108,
       0x18020808,
       0x31c72ffc,
       0x2ff99200,
      };  //CPU DCC扫描程序机器码
      
      bfin_write_mem(0xffa08000, (uint8_t *) dcc_code, 0x20);

     还有一个值得说的是,http://blackfin.uclinux.org上最新的urjtag源码中使用了strcasestr函数,这个函数在cygwin的gcc的glibc里面没有,编译无法通过。不过没有关系,可以自己写一个。

    • jtag/src/cmd/bfin.c,53行,增加:

    #include <ctype.h>

    #ifndef HAVE_STRCASESTR
    char * strcasestr (char *haystack, char *needle)
    {
     char *p, *startn = 0, *np = 0;

     for (p = haystack; *p; p++) {
      if (np) {
       if (toupper(*p) == toupper(*np)) {
        if (!*++np)
         return startn;
       } else
        np = 0;
      } else if (toupper(*p) == toupper(*needle)) {
       np = needle + 1;
       startn = p;
      }
     }

     return 0;
    }
    #endif

    今天就写到这里。过一段时间我会放出整理测试后的源代码以及可执行文件,如果你觉得修改过程太过复杂,可以直接使用我写的代码。

    September 22

    关于J-Link GDBServer的BUG

     
    发现J-Link GDBServer有个BUG,它不能获取CPSR的值,导致GDB条件执行语句的时候会把断点放在错误的位置,表现为条件执行语句有的时候不能单步——一单步就运行起来了。虽然我买的是盗版的J-Link,但我还是厚着脸皮到Segger的官网发帖子问了,嘿嘿。Segger反应用了17天的时间,我觉得还算及时,看这个地址:http://www.segger2.com/index.php?page=Thread&threadID=363
    从J-Link 4.09b开始这个问题就解决了,我也试过了,如果大家遇到这个问题可以尝试更新下J-Link软件。

    小述电磁兼容

     
    我必须写点什么证明这个Blog还在我的维护之下,呵呵。
     
    先赞一下我公司的领导,终于请专业咨询公司为我们进行了为期两天的电磁兼容知识的培训;收获还真的不小,困扰我很久的一些问题有了明确的理论答案,下面就要针对我的实际工作应用这些理论了,呵呵。
    为了防止我自己忘记,同时也给需要的同学们提供个参考,我决定把这两天培训的要点和我工作以来的体会写下来。转载请注明来自我是一只鱼的EE小站,邮件cosine@126.com,欢迎有问题在此留言或来信交流。
     
    • 什么是电磁兼容

    对于还没有毕业的、刚毕业的同学们可能对电磁兼容体会不深。但不论老师的指导、业界的传言,都给我们指出了一些电磁兼容的蛛丝马迹:每个IC加一个104电容、数字地模拟地需要分割等等。先不讨论这些做法的对错,至少说明,我们需要做些什么事情,才能保证我们的设计能很好的工作。
    电磁兼容性(EMC)是描述一个电子设备的两方面性能:对别的设备的干扰严重程度(EMI)和对自然界或别的设备的干扰的抗受程度(EMS)。有很多很牛X的人做了很多很牛X的工作,用标准的形式把电磁兼容分成了若干个可以用测试衡量的项目,例如IEC61000-4-X系列;国标GB17626.X系列,就是抄IEC的。我不想像教课书一样给大家列出这些标准,就用几个简单的、我们经常能遇到现象来对应下:
    1. 很多人遇到过把示波器地线夹到板子上的时候,板子复位的现象吧,这个是热插拔“浪涌(Surge)”的效果;
    2. 冬天的时候,北方的同学们经常对自己的笔记本电脑或者台式机过电吧,这个是“静电放电(ESD)”干扰;
    3. 使用电钻的时候听收音机,有杂音,这是“快速瞬变脉冲群(EFT)”的效果;
    注意这几个用引号括起来的词,就是几个典型的电磁兼容测试项目。当然还有两个非常重要的项目“辐射”和“传导”,但我觉得只是为了让单板正常工作,这两个项目不用考虑;我目前也没有这方面的实践经验,本文就简略些。据我头说我们要买个频谱仪,有那个之后我再玩玩这两个项目,看看理论的东西是不是胡说。吐舌
    再说说对电磁兼容的范畴界定:以我的认识,电磁兼容性应算产品的性能,不能划归可靠性范畴;因为可靠性主要研究产品能在什么应力下能用多久不坏,不关心干扰的问题。因此,电磁兼容性的提高,不代表可靠性提高,反而由于引入了串联的对策器件(这个词下面就解释了),对策器件选择不当会降低系统可靠性。但研究所、实验室科研就不用理清这个概念了,反正课题验收只要好使一次,没有人关心可靠性。
    很多人觉得电子设计必须考虑电磁兼容各种规则,其实有些情况不用,或者说不用考虑全部;因为请一定记住,电磁兼容性的提高不是随便就能达到的,是有成本的,这包括几个方面:电磁兼容PCB设计往往要求高,层数和面积都会增大;增加对策器件;增加测试成本。山寨手机往往电磁兼容做的不好,但卖的好才是真的好。但对于工程师,必须懂得这些知识,中国人不能永远搞差异化产品的。呵呵,扯远了。

    • 重新认识PCB和基本器件

    这个小节讲的全部是一件事情:分布参数。分布参数就是分布在PCB或者器件中的电容、电感、电阻,这些东西数值很小,但是在很多情况下,他们造成的影响狠严重。给出一个经验数值,一般1厘米长的PCB走线的电感量是6nH。按照经典的复阻抗计算公式Z=ωL,在100MHz下,1厘米导线的复阻抗达到3.76Ω,稍微长一些的导线对高频信号就会表现出很大的衰减。
    而我们常用的电容、电感因为存在分布参数,在高频下也不能用简单的符号来表示。以电容的模型为例,请看我们常用的X7R型的0603封装50V耐压0.1μF电容的模型,其中L1和L2影响电容的等效串联电感(ESL),R1、R2、R3影响电容的等效串联电阻(ESR)。

     有这么多分布参数,导致这个104电容的复阻抗-频率曲线变成了这样:

     

    可以看出,这种电容在11M左右的时候,复阻抗最小,大约为100mΩ。随后由于等效串联电感的存在,复阻抗会逐渐增大。但刚才已经提到了,1厘米的PCB走线有6nH的电感,当这种电容焊接在电路板上的时候,其复阻抗特性曲线会向左移动一些;所以,这种电容比较适合用于若干MHz到20MHz频率下的滤波。很多单片机的工作频率都在这个范围,因此104电容可以用于单片机系统的电源滤波。但如今的ARM、DSP、PowerPC系统频率都不下百兆,用104电容就不合适了。
    说说等效串联电阻的作用:等效串联电阻小的电容,其复阻抗特性曲线整体下移,因此,在很大频率范围内复阻抗都很小,所以等效串联电阻越小的电容,滤波效果越好。

    接下来说说电感,电感也存在等效串联电阻、匝间电容等分布参数。除了高频下,电感特性会变化之外,电感还受到直流电流的影响——因为电流会让电感的磁芯饱和。另外,有的磁芯磁导率还会受到温度的影响。用TDK公司的某电感的参数特性曲线为例子说明:

    •  认识电磁兼容对策器件

    下面来说说专门为了电磁兼容而存在的器件。
    主要可以分为滤波和瞬态抑制两个类别。起滤波作用的有:共模电感、磁珠、三端电容等;起瞬态抑制作用的有:TVS二极管、压敏电阻、气体放电管等。这些器件的原理、结构、基本作用等我不说了,百度一下一大片。说些不容易搜索到的:
    1. 磁珠到底是什么
    很多人搞不清楚磁珠、电感、0欧姆电阻的区别。先看看村田制作所(好多年了,一直觉得和春田花花幼儿园有关系吐舌)提供的磁珠内部结构:

    原来就是用线在里面绕圈啊,可以肯定这和0欧姆电阻不一样,因为它有一定电感。那么磁珠和电感有什么区别呢?我觉得是磁心材料的区别,电感的磁芯材料是用来储能的,而磁珠的磁性材料是用来耗能的,在高频的时候产生很大的涡流,来把交变信号的能量消耗掉。所以,在高频下,磁珠表现出很大的纯电阻值,而不是复阻抗值。可以看看磁珠的阻值频率特性曲线:

    那么,什么地方用磁珠呢?建议的应用是:电源滤波、信号滤波。强烈不建议将磁珠用于模拟、数字地之间的跨接,因为这样容易引起地电位差,对AD、DA的精度产生很严重的影响;这种情况用0欧姆电阻或者干脆不区分模拟和数字地,只区分模拟和数字电源。目前我尝试过两个地之间用磁珠有效的只有一种:防止热插拔时的浪涌。

    2.TVS、压敏电阻、气体放电管到底用那个
    这三个器件都是用来抑制瞬态电压变化的,不同的是TVS响应最快(0.1ns级别),但通流量小;压敏电阻响应比较快(1ns级别),通流量大;气体放电管响应慢(1us级别),通流量大。因此,TVS和压敏电阻可以用来抑制ESD放电,气体放电管和压敏电阻可以用来抑制浪涌。

    • 怎样提高电磁兼容性

    之前我提出电磁兼容是产品的性能,但对于概念不清的人来说,“提高电磁兼容性”这个提法很模糊,只好通俗解释下——就是怎样通过电磁兼容测试。
    请一定建立起这个概念:提高电磁兼容性要从板级设计开始。在产品的板级设计不太差的前提下,可以通过增加一些简单的电磁兼容对策器件实现电磁兼容性的提高——但这完全是治标不治本。给我上课的老师就举了某电力测量设备的制造商例子,他们的产品为了通过2kV的快瞬脉冲群,共模电感、Y电容的加了一大堆,还修改采样电路板PCB,搞得很麻烦;原因就在于他们的单片机系统设计太垃圾了。2kV的快瞬对低速的单片机系统来说就和玩一样,轻松对付。那么具体该怎么做呢,第一,要注意PCB和基本器件的分布参数,正确选择各种器件;第二,要了解各种电磁兼容对策器件的特性和选型方法;第三,注意各种滤波设计;第四,要注意PCB设计。前面两条已经在上文种有所涉及了,但我写出来的就是个导读,要是全写出来我干脆写书去了。说说后面两条。

    • 电磁兼容滤波设计

    这个叫法和一般的信号滤波设计不同,是有针对性的。再次说明,本文不涉及产品对外辐射的控制,但这些滤波器一般可以起双向滤波的作用,通俗点说,里面的干扰出不来,外面的干扰进不去。
    要设计这种有针对性的滤波器,首先必须了解将要面对的是什么信号:以快瞬脉冲群、浪涌、静电放电为例。
    1.快瞬脉冲群
    快瞬脉冲群是用来模拟感性负载在电路上的频繁接入和断开的情况,比如电机、继电器等。它的电压波形是这样的:

     

    快瞬脉冲群可以加在电源上,如果AC/DC电源的传导衰减不够,就会在设备的直流电源上产生相似波形的干扰信号。快瞬脉冲也可以通过耦合夹耦合在信号线上耦合出相似波形的干扰信号,通过信号端口传入设备。另外,由于快瞬脉冲群的辐射能量很大,附近的线缆也会感应产生相似波形的干扰信号。如果是单个干扰脉冲,数字电路一般有施密特触发器,不会误触发。但连续的脉冲群会使施密特触发器失效,而扰乱数字电路。
    快瞬脉冲群单个脉冲的上升沿,决定了其能量大致分布在十几MHz~几百MHz的范围内,因此滤波器在这个区间内要有滤波效果。
    另外,快瞬脉冲群干扰是共模的,不论你选则的是L、N,L、PE,N、PE,L、N、PE那一种耦合方式,快瞬脉冲群都是共模的。有必要解释什么叫共模干扰,共模干扰指的是相对于某个共同的外部参考源,例如大地的干扰。我目前理解的脉冲群共模干扰的模型如下:

    脉冲群的干扰就像河道里的水波一样,一波一波的涌入设备,如果被测设备完全悬空,那么仅仅是其电势被抬高,不会产生影响;但是,由于被测设备和大地之间存在耦合电容,高频干扰信号就能找到回流路径,因此,设备的正常工作受到影响。
    对于脉冲群,可以使用如下图所示的对策:

    我仅对电源线对策举例,信号线的对策大同小异。被测设备最好要有个金属屏蔽外壳,并与大地有良好的电气连接,这样PE信号的干扰就可以直接导入大地。交流供电线上的干扰使用共模电感抑制,注意应选择滤波区间在脉冲群能量频率范围内(十几MHz~几百MHz)的共模电感,通过共模电感之后共模干扰会大幅衰减,图中的箭头大小表示能量的大小。光有共模电感有些情况下还不够,还应在进线端增加对大地的Y电容,让干扰能量尽可能早的回流到大地,而不干扰到后级的电源模块和功能电路。

    2.浪涌

    浪涌就是模拟雷击的,当然还有热插拔浪涌,这个暂时不讨论。 浪涌测试的电压波形如下:

    电流波形就不贴出了,长的和这个波形差不多。浪涌的特点是电流上升沿较缓,但峰值电流很大,可以达到数百到上千安培;同时,浪涌的电压较高,可以达到数千伏。浪涌能在很短的时间内令设备内部器件或空气击穿,损坏设备。由于浪涌的能量很大,完全堵住浪涌是不可能的;因此,浪涌的对策是疏导。在电源线上放置瞬态抑制器件,如TVS、压敏电阻、气体放电管等等。典型的对策电路如下所示:

    这种形式的电路,放置在设备的电源输入端,一旦电源出现浪涌,压敏电阻和气体放电管就会导通,将浪涌能量导走,令其不进入后部处理电路。而在没有浪涌时,由于气体放电管几乎没有漏电流,可以满足安规要求。

    3.静电

    静电放电测试用来模拟人体对设备的放电。其波形如下图所示:

    静电放电结合了脉冲群和浪涌的特点,由于静电放电电流上升沿非常陡峭,使放电时产生宽达数GHz的干扰频谱;另外静电放电的电压一般可以达到1万伏特,峰值电流可以达到数十安培,虽然放电的时间短、能量较小,但也有可能使设备损坏或造成可积累的损坏。静电的对策是脉冲群对策和浪涌对策的结合:一方面要加强屏蔽和共模滤波,另一方面也要对放电电流进行疏导,避免其进入电路。

    • 如何设计电磁兼容性良好的PCB

    设计PCB学问就多而乱了,什么层叠设置,阻抗匹配,串扰预防等等等等。其实要提高电磁兼容性,最重要的原则是:回路面积最小。
    回路面积最小指的是信号路径和回流电流路径所围成的截面积最小。用一个信号穿越地分割的例子来说明:

    图中红色的是某双面板顶层信号线,蓝色是底层地平面。当信号线在完整的地平面上时,黄箭头所示的信号电流和绿箭头所示的信号回流电流基本重合,二者回路面积最小;当地平面存在分割时,回流电流就会绕开地平面分割行进,使回路面积增大。回路面积越大,电路感应出的干扰信号幅度也就越大,向外的辐射也越多。相关知识可以查看PCB方面书籍。
    最符合回路面积最小原则的PCB设计是所有信号线都有完整地平面陪伴,最不符合的例子是电缆中独行的信号线。

    PCB设计虽然没有太高的技术含量,但确是很需要经验的。

    April 15

    Mum计划之MumJTAG GDB代理程序编译——OpenOCD、urjtag和gdbproxy的编译


    这篇文章主要是讲如何编译MumJTAG的ARM和Blackfin GDB调试代理程序的,如果你对GDB调试还没有什么概念,可以看这篇文章:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!268.entry。如果你想知道怎么使用OpenOCD进行ARM调试,请看这篇文章:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!485.entry。如果你想知道ARM上GDB调试怎么和Eclipse接口,请看这篇文章:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!602.entry

    MumJTAG是我设计的一个JTAG调试电缆,它的制作请看这篇文章:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!786.entry

    本文在Windows下用Cygwin环境,配合FT2232的D2XX驱动,成功编译了OpenOCD、urjtag和gdbproxy;换句话说,采用本文介绍的方法,可以在Windows下使用FTDI提供的驱动,使用FT2232电缆。OpenOCD在Cygwin下的编译没有什么难度,urjtag和gdbproxy的编译,因为没有找到类似的文章,我花了2天的时间……希望我的记录能给大家提供些方便,不要走我的弯路。转载请注明来自我是一只鱼同学的EE小站,邮件cosine@126.com

    另外说一下,其实ADI提供了Windows环境下的gdbproxy,但是我试了下,不好使,也许是因为它用的是libftdi驱动的原因,我没有调查在Windows环境下怎么装libftdi驱动,因为我想绝大多数人会使用D2XX驱动吧。给出ADI工具链的地址:http://blackfin.uclinux.org/gf/download/frsrelease/392/5211/blackfin-toolchain-win32-2008R1.5.exe

    • OpenOCD的编译

    这个很简单,大家可以看OpenOCD的手册:http://openocd.berlios.de/doc/openocd.pdf。我这里再啰嗦一遍。

    先到OpenOCD的官方网站:http://openocd.berlios.de/,下载OpenOCD源代码:http://prdownload.berlios.de/openocd/openocd-0.1.0.tar.gz,假设保存为E:\Mum\OpenOCD\openocd-0.1.0.tar.gz。用命令行来说明:

    $ cd /cygdrive/e/mum
    $ tar xvzf openocd-0.1.0.tar.gz
    $ mv openocd-0.1.0 openocd

    当然也可以用svn下载OpenOCD最新的版本,在Cygwin的命令行中输入:

    $ cd /cygdrive/e/mum
    $ svn checkout svn://svn.berlios.de/openocd/trunk openocd
    $ cd openocd
    $ ./bootstrap

    然后准备MumJTAG的D2XX驱动程序,可以看之前的这篇文章制作一个:http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!786.entry,或者到这里下载我做好的驱动:http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/Mum%e8%ae%a1%e5%88%92/MumJTAG/MumJTAGDriver.rar,假设驱动程序存储在E:\Mum\MumJTAGDriver。现在可以编译了,还是用命令来说明。

    $ cd /cygdrive/e/mum/openocd
    $ ./configure --prefix=/cygdrive/e/mum/openocd/build --enable-ft2232_ftd2xx --with-ftd2xx-win32-zipdir=/cygdrive/e/mum/mumjtagdriver
    $ make
    $ make install

    这样,OpenOCD就编译好,并拷贝到E:\Mum\OpenOCD\build里了。

    为了让OpenOCD正常工作,还需要一个针对要调试的CPU的配置文件,这个配置文件的编写可以参考OpenOCD的手册。这里我给出我编写的MumJTAG连接AT91SAM9263的配置文件:

    ##########################
    # Interface configuration
    ##########################

    interface ft2232
    ft2232_device_desc "MumJTAG A"
    ft2232_layout "usbjtag"
    ft2232_vid_pid 0x0725 0x6010
    jtag_khz 8
    reset_config trst_and_srst

    ##########################
    # TAP configuration
    ##########################

    jtag newtap at91sam9263 cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x0792603F
    jtag_nsrst_delay 200000
    jtag_ntrst_delay 200000

    ##########################
    # Target configuration
    ##########################

    set _TARGETNAME [format "%s.cpu" at91sam9263]
    target create $_TARGETNAME arm926ejs -endian little -chain-position $_TARGETNAME -variant arm926ejs

    # Internal sram1 memory
    $_TARGETNAME configure -work-area-virt 0 -work-area-phys 0x00300000 -work-area-size 0x1000 -work-area-backup 1

    ##########################
    # Port configuration
    ##########################

    telnet_port 23
    gdb_port 2331
    tcl_port 6666

    值得一提的是,不同JTAG电缆的ft2232_device_desc、ft2232_vid_pid是不一样的,应根据实际修改;ft2232_layout设定的是电缆的类型,OpenOCD支持很多种电缆的类型,MumJTAG兼容USB to JTAG Interface,所以写“usbjtag”;如果你自己独创了一种电缆,就要修改OpenOCD的源代码。假设将配置文件保存为E:\Mum\OpenOCD\build\AT91SAM9263.cfg,接下来连接MumJTAG到目标板的JTAG,给目标板上电就可以启动OpenOCD了,如下所示。

    $ cd /cygdrive/e/mum/openocd/build/bin
    $ ./openocd -f /cygdrive/e/mum/openocd/build/mumjtag.cfg
    Open On-Chip Debugger 0.1.0 (2009-04-15-16:59) Release


    BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS


    $URL: https://kc8apf@svn.berlios.de/svnroot/repos/openocd/tags/openocd-0.1.0/src
    /openocd.c $
    8 kHz
    Info : JTAG tap: at91sam9263.cpu tap/device found: 0x0792603f (Manufacturer: 0x0
    1f, Part: 0x7926, Version: 0x0)
    Info : JTAG Tap/device matched

    OpenOCD自带很多CPU和JTAG电缆的配置文件,在安装目录里,它的使用就不细说了,大家自己看手册。

    • urjtag和gdbproxy的编译

    urjtag和gdbproxy是uclinux下的一个项目,由ADI官方派人维护。它是可以使用FT2232电缆通过JTAG调试Blackfin系列处理器的一套GDB调试服务程序。顺便提一下,FT2232电缆无法在ADI的Visual DSP++下使用。

    urjtag和gdbproxy是一体的一套软件,他们必须一同编译,而且路径有要求,例如urjtag储存在E:\Mum\urjtag_gdbproxy\jtag,那么gdbproxy就必须储存在E:\Mum\urjtag_gdbproxy\gdbproxy。编译的顺序是先urjtag后gdbproxy。urjtag和gdbproxy的编译和使用可以参考blackfin.uclinux.org的wiki,地址是:http://docs.blackfin.uclinux.org/doku.php?id=toolchain:debug:gdbproxy

    先到uclinux的官方网站下载urjtag和gdbproxy的源码,地址是:http://blackfin.uclinux.org/gf/download/frsrelease/392/5076/blackfin-jtag-tools-08r1.5-14.src.tar.bz2。将其中的jtag.tar.bz2、gdbproxy.tar.bz2和jtag.diff解压出来,例如储存为E:\Mum\urjtag_gdbproxy\jtag.tar.bz2、E:\Mum\urjtag_gdbproxy\gdbproxy.tar.bz2和E:\Mum\urjtag_gdbproxy\jtag.diff。然后:

    $ cd /cygdrive/e/mum/urjtag_gdbproxy
    $ tar xvjf jtag.tar.bz2
    $ tar xvjf gdbproxy.tar.bz2
    $ patch -p0 <jtag.diff

    当然可以使用svn下载最新的代码:

    $ cd /cygdrive/e/mum/urjtag_gdbproxy
    $ svn checkout svn://sources.blackfin.uclinux.org/toolchain/trunk/jtag jtag
    $ svn checkout svn://sources.blackfin.uclinux.org/toolchain/trunk/gdbproxy gdbproxy

    假设MumJTAG的驱动程序存放E:\Mum\MumJTAGDriver,可以编译urjtag:

    $ ./configure --prefix=/cygdrive/e/mum/newbuild/jtag/build --with-ftd2xx=/cygdrive/e/mum/mumjtagdriver
    $ make
    $ make install

    我编译的时候有很多参数类型不匹配的警告,无视它们了……接下来编译gdbproxy,这个优点麻烦,首先确认在你的Cygwin里安装的GCC必须是4.X版本的,然后编辑E:\Mum\urjtag_gdbproxy\gdbproxy\configure.in,找到这段

    if test "$host_os" = "cygwin" ; then
        CFLAGS="$CFLAGS -mno-cygwin"
        LIBS="$LIBS -lws2_32"
    fi

    改成这样

    if test "$host_os" = "cygwin" ; then
    #    CFLAGS="$CFLAGS -mno-cygwin"
        LIBS="$LIBS -lws2_32 -lintl -lioperm /cygdrive/e/Mum/MumJTAGDriver/i386/ftd2xx.lib"
    fi

    解释下,应该是gdbproxy的Makefile兼容性不够好,用Cygwin 3.X的GCC有很多错误。另外用4.X的GCC也必须加上intl、ioperm等库,我不太懂Makefile的编写,希望明白的大虾们予以指正。另外,必须加上FTD2XX库,这个库就在驱动程序的目录里,例如前文的E:\Mum\MumJTAGDriver\i386\ftd2xx.lib。然后就可以编译了:

    $ cd /cygdrive/e/mum/urjtag_gdbproxy/gdbproxy
    $ CC=gcc-4 ./configure --prefix=/cygdrive/e/mum/urjtag_gdbproxy/gdbproxy/build
    $ make
    $ make install

    gdbproxy没有什么配置文件,但是需要在初始化的时候指定JTAG电缆的种类。使用的时候先将MumJTAG连上目标板并给目标板上电,然后:

    $ cd /cygdrive/e/mum/urjtag_gdbproxy/gdbproxy/build/bin
    $ ./gdbproxy bfin --connect="cable USB-to-JTAG-IF ftd2xx-mpsse 0725:6010"

    Remote proxy for GDB, v0.7.2, Copyright (C) 1999 Quality Quorum Inc.
    MSP430 adaption Copyright (C) 2002 Chris Liechti and Steve Underwood
    Blackfin adaption Copyright (C) 2008 Analog Devices, Inc.

    GDBproxy comes with ABSOLUTELY NO WARRANTY; for details
    use `--warranty' option. This is Open Source software. You are
    welcome to redistribute it under certain conditions. Use the
    '--copying' option for details.

    Initializing on FTDI device 0725:6010
    IR length: 5
    Chain length: 1
    Device Id: 01000010011110100101000011001011 (0x00000000427A50CB)
      Manufacturer: Analog Devices
      Part(0):         BF533
      Stepping:     4
      Filename:     /cygdrive/e/mum/urjtag_gdbproxy/jtag/build/share/urjtag/analog/b
    f533/bf533
    warning:   bfin: no board selected, BF533 is detected
    notice:    gdbproxy: waiting on TCP port 2000

    这说明gdbproxy已经找到目标CPU了。gdbproxy也支持很多种FT2232电缆,MumJTAG兼容USB to JTAG Interface,所以写“USB-to-JTAG-IF”;我用的是FTD2XX的驱动,所以写“ftd2xx-mpsse”,“0725:6010”是VID和PID。具体的使用说明,请看blackfin.uclinux.org的wiki。

    如果你觉得以上这一切都很麻烦,那么,你可以从EE小站的SkyDrive下载已经编译好的OpenOCD、urjtag和gdbproxy。注意,这些程序必须使用FTDI官方的FTD2XX驱动;这些程序只能在Windows下运行。我测了下,应该不需要Cygwin的Dll;如果不是这样,请留言,我会把Dll加上。地址如下:
    OpenOCD:http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/Mum%e8%ae%a1%e5%88%92/MumJTAG/OpenOCD.rar
    urjtag_gdbproxy:http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/Mum%e8%ae%a1%e5%88%92/MumJTAG/urjtag%7C_gdbproxy.rar

    March 16

    Mum计划之陈年往事

     
    嘿嘿,先做个铺垫,我的Mum计划基于我的毕业设计中嵌入式视觉这一块。毕业已经有段时间了,我觉得可以贴出来了。视频里的履带机器人识别的目标是我手里拿着的一个红色发光二极管,摄像头安装在机器人中间的那个小突起里面。
     
        
     
    解释下那个履带机器人为什么“抽”着动:
    设计机构的时候,电机功率选小了,如果不增加电机电压,机器人动不起来;但是增加了电压,机器人运动速度太快,转向无法控制。所以只好让机器人动一下,歇一下,看上去比较别扭尴尬。但是视觉识别部分是没有问题的,可以准确地找到我手里的发光二极管。
    今后的目标,就是把这个东东发扬光大。
     
     
    March 13

    Mum计划之MumJTAG——ARM和Blackfin JTAG调试电缆(FT2232电缆)硬件制作

     
    距离上次更新已经3个多月了微笑
     
    这段时间我工作的重点在电磁兼容测试上,这东西估计没有什么人有兴趣吧?其实通过测试很简单,对策也就是那些,就是这事情很烦琐。幸好我们公司有Schaffner的快瞬、浪涌发生器和ESD枪,在我无数次的实验轰炸下,把某个我设计的产品抗扰度,快瞬由不到1000V提高到4800V(我们公司标准比国标高多了困惑),ESD由不到1000V提高到15000V空气和8000V接触;还有另一个产品,把差模浪涌从炸机提高到1500~2000V,可惜还有待提高。累死了,光装卸时拧螺钉就拧了能有一千次,后来不行了,申请了个电动螺丝刀……做完测试,我的收获还是很大的,明白了该如何接地、如何屏蔽、如何进行内外互联;相应的,设计产品的风格也变了一些,终于自我感觉入了设计牛X产品的大门了。下一步还有个可靠性需要摸索,还需努力啊,等加速寿命试验做完了,估计就完成绝世武功目录的学习了,嘿嘿。感觉这段时间的收获就是在小公司的好处,可以接触到产品设计的每一个细节。
     
    在业余时间,我启动了一个计划——Mum,这是一个用BF系列DSP进行视觉东东开发的计划,分为Mum、MumBurst和MumSW(SW for Silkworm)三个阶段微笑,哈哈,上MOP的同学们可以很快看出来含义。
    MumJTAG是整个计划的第一步,这是个FT2232电缆,可以通过OpenOCD调试ARM,通过urjtag和gdbproxy调试Blackfin。MumJTAG和Hubert Hoegl的USB to JTAG Interface电缆(http://www.hs-augsburg.de/~hhoegl/proj/usbjtag/usbjtag.html)是兼容的,但是速度比它快,可以到6MHz,不用它的VID和PID,所以配置文件还需要修改。至于Blackfin调试,我参考了gnICE(http://blackfin.uclinux.org/gf/project/stamp/frs/?action=FrsReleaseBrowse&frs_package_id=146),但为了和ARM调试兼容,也要修改配置。不过这对开源项目来讲,不算什么难事。转载本文,请注明来自我是一只鱼的EE小站,邮件cosine@126.com
    先介绍下FT2232电缆。也许有的人不知道这个电缆,但没有搞嵌入式的人不知道Wiggler的各种Clone;FT2232电缆就可以看作Wiggler的升级版本。它的特点是,便宜(批量成本大约50~60RMB),速度快(下载速度可以达到60~70KB/s),可以配置成JTAG和串口并存的模式(非常适合笔记本电脑),开源。嘿嘿,惭愧,在我写“最低成本的ARM调试解决方案”(http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!485.entry)的时候,我还不看好FT2232电缆,直到我发现它可以调试Blackfin以后,兴趣才来了。
     
    MumJTAG的简要信息:
    • 使用FTDI的FT2232D为USB和JTAG协议转换芯片,协议转换过程由PC上的软件控制
    • 20针ARM JTAG接口和Blackfin转换板
    • 串口一个
    • 目标板电压范围1.6V~5.5V
    • JTAG最高频率6MHz
    国内其实已经有人用FT2232做出电缆来了,比如Simon的Versaloon(http://group.ednchina.com/1065/)和淘宝有售的OpenJTAG。Versaloon看起来卖得不好,我觉得主要的问题是Simon想用擅长于GDB调试的东西去占领已经被各种成熟仿真器占领的,并不需要GDB调试的单片机开发市场,而且宣传的力度又不够。至于OpenJTAG,我觉得设计者把FT2232电缆+OpenOCD拿来赚钱这一点非常失败,首先FT2232电缆完全开源的;再者170这个价格和我刚才提供的实际成本有很大差距;另外,OpenJTAG怎么面对现在只有100块钱的盗版J-Link?当然,也许OpenJTAG设计出来的时候,盗版J-Link还没有这么便宜;但现在情况已经是这样了,OpenJTAG还卖得动么?
    因此,MumJTAG从诞生起就完完全全开源,原理图、Gerber、BOM、调试代理程序映像都公开,想自己做的就自己做;我可能会开淘宝店卖空板,还没有想好。目前,在AT91RM9200和AT91SAM9263上试了下,可以用;在BF531的板子上试了下,可以用Insight修改内存数值,我对Blackfin的开发还不熟悉,目前没有跑程序,所以Blackfin GDB调试的结果未知。另外说一下,Blackfin的调试工具urjtag和gdbproxy编译起来太复杂了,具体过程看我后面的文章。
    经过我的努力,已经解决了MumJTAG目标板上电时OpenOCD说找不到FT2232的BUG。毕竟我是做工控设备的吐舌,MumJTAG设计时考虑了脉冲群、静电对策,并对目标板交流电源冲击采取了抗扰措施;我做了几百次电源冲击测试,还用我这个天天和铁桌腿、水龙头放静电的肉身做了几十次放电测试(对比真正的ESD枪的击穿距离,我觉得放电大概有3000~4000V,好疼啊困惑);目前来看,MumJTAG V1.1版还比较稳定,单纯从电路上看,相信MumJTAG比现有所有FT2232电缆都稳定。当然,家里的测试条件有限,不能模拟所有的情况;如果你使用MumJTAG V1.1 Gerber做的板子出现问题,欢迎与我联系:cosine@126.com。MumJTAG将不断更新,请关注EE小站。(更新日期2009年3月28日,如果你看到的是转载的文章,请从这里查看最新信息http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!786.entry)。
     
    请注意我在BOM中选取的元件具体型号,钽电容的耐压、ESR,磁珠绝对不能用电感或零欧姆电阻代替,否则稳定性会下降很多。串口插座我用了带共模滤波器的器件,当然也可以用不带滤波器的,但是这样会稍微降低稳定性。
     
     
    先上一张做好的MumJTAG图片:
     
     
     
    梳理下制作MumJTAG需要做的事情:
    • 设计FT2232的PCB或者用我提供的Gerber
    • 焊接PCB
    • 修改FT2232板载串行EEPROM的内容
    • 修改Windows驱动
    我的习惯是在Windows下用虚拟机进行Linux开发,所以,我的文章不涉及Linux下驱动,请原谅。设计焊接PCB就不说了,从修改EEPROM开始。
    与FT2232配套的,有一片串行EEPROM,其作用是记录用户自定义的设备名称,USB的VID和PID。在EEPROM没有编程的时候,FT2232使用厂家默认的VID 0x0403和PID 0x6010。这个http://www.ftdichip.com/Resources/Utilities/MProg.pdf是官方的EEPROM编程工具MProg的使用说明,我下面提供的过程是这份说明的简化版。
     
    在开始之前,请准备这几样东西:
    FTDI的链接总有一天会失效,如果这样,请访问http://www.ftdichip.com查找。
     
    先解压缩驱动程序,假设解压到E:\FT2232,然后连接MumJTAG到USB,提示安驱动的时候选择E:\FT2232,这部分不详细写了,相信大家都会。 
    驱动安好后,打开MProg,出现如下界面:
     
     
     然后选择菜单Device>Scan,如果硬件正常,窗口下方应该出现:
     
     
     
    然后选择菜单File>Open,打开下载的MumJTAG EEPROM信息文件"MumJTAG USB 配置文件.ept",窗口变为:
     
     
     
    上图这些,就是需要烧写的配置。可以不用EE小站提供的这个EEPROM信息,但请注意右边的FT2232C/D Options中的设置,将FT2232设置为Side A为JTAG,Side B为串口;你也可以更改Vendor ID、Product ID、Manufacturer、Product Description为你想要的东西。然后点选菜单Device>Program,将信息下载到EEPROM中,拔掉USB插头,硬件方面的动作就完成了。
    此时,MumJTAG的VID和PID已经不是FT2232默认的了,FTDI的驱动已经不可用,需要对驱动程序信息进行修改。可以重新解压缩一份驱动程序,例如解压缩到E:\MumJTAG。用文本编辑器打开E:\MumJTAG\ftdibus.inf,修改其中的FtdiHW、FtdiHW.NTamd64、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_0725&PID_6010&MI_00.DeviceDesc%=FtdiBus.NT,USB\VID_0725&PID_6010&MI_00
    %USB\VID_0725&PID_6010&MI_01.DeviceDesc%=FtdiBus.NT,USB\VID_0725&PID_6010&MI_01
     
    [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_0725&PID_6010&MI_00.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0725&PID_6010&MI_00
    %USB\VID_0725&PID_6010&MI_01.DeviceDesc%=FtdiBus.NTamd64,USB\VID_0725&PID_6010&MI_01
     
    ...
     
    [Strings]
    Ftdi="FTDI"
    DESC="CDM Driver Package"
    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_0725&PID_6010&MI_00.DeviceDesc="JTAG Port"
    USB\VID_0725&PID_6010&MI_01.DeviceDesc="USB Serial Converter"

    SvcDesc="USB Serial Converter Driver"
    ClassName="USB"
    用文本编辑器打开E:\MumJTAG\ftdibus.inf,修改其中的FtdiHW、FtdiHW.NTamd64、Strings等几段,红色字体表示增加或有变化的部分:
    ...
     
    [FtdiHw]
    %VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NT,FTDIBUS\COMPORT&VID_0403&PID_6001
    %VID_0403&PID_6010.DeviceDesc%=FtdiPort2232.NT,FTDIBUS\COMPORT&VID_0403&PID_6010
    %VID_0725&PID_6010.DeviceDesc%=FtdiPort2232.NT,FTDIBUS\COMPORT&VID_0725&PID_6010
     
    [FtdiHw.NTamd64]
    %VID_0403&PID_6001.DeviceDesc%=FtdiPort232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6001
    %VID_0403&PID_6010.DeviceDesc%=FtdiPort2232.NTamd64,FTDIBUS\COMPORT&VID_0403&PID_6010
    %VID_0725&PID_6010.DeviceDesc%=FtdiPort2232.NTamd64,FTDIBUS\COMPORT&VID_0725&PID_6010
     
    ...
     
    [Strings]
    FTDI="FTDI"
    DESC="CDM Driver Package"
    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_0725&PID_6010.DeviceDesc="MumJTAG"
    SvcDesc="USB Serial Port Driver"
    SerEnum.SvcDesc="Serenum Filter Driver"
    这样,驱动程序就修改好了。将MumJTAG的USB电缆连上,提示安装驱动的时候,将路径指向E:\MumJTAG。
    至此,MumJTAG就制作完成了。要验证它能不能用,我们还需要使用OpenOCD、urjtag和gdbproxy,请看我后面的文章。
     
    November 19

    PowerPC处理器MPC8313E初体验


    最近终于开始实质性的玩PowerPC MPC8313E了,这种感觉就像2006年我第一次玩S3C2410一样——很晕。但是我不像当年那样摸黑调试Vivi了,我入手干的第一件事情就是研究工具链。很遗憾,目前PowerPC开发的成本相当高。一开始我就寻找有没有便宜的硬件和软件工具,事实上我找到了——Wiggler+OCDRemote+GDB,请看我的这篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!602.entry,有缘人自己体会如何使用最新的OCDRemote,但是,我觉得Macraigor今后应该不会让Wiggler支持的新PowerPC器件(例如MPC8313E),要OOXX掉OCDRemote中的限制我也尝试了下,太难,毕竟我不熟悉X86的汇编,希望有高手能够努力下。目前,Wiggler+OCDRemote+GDB理论上可以支持国内比较流行的MPC5200B和MPC860这样的老器件,我没有尝试过,大家有兴趣可以试下。BDI2000之类的东西,一般人是不会有钱尝试的,也就算了,我现在找到的最便宜的调试解决方案是Freescale的USBTAP+Codewarrior,USBTAP绝对是垄断,需要5000RMB左右,没办法,贵也得买。Codewarrior就好说了,在Freescale官方下载个评估版,然后Google下“CodeWarrior License制作教程”,就搞定了。开发板更困难了,我在考虑以后是不是做一个,嘿嘿,等我有时间吧;现在的开发板都贵得要命,大家自己想办法了。如果个人要玩VXWorks,对不起,你一定是在开玩笑。哦,还有编译器,这是免费的,到Freescale官方下载你要玩的CPU的BSP,运行里面的脚本,就会给你制作一个。

    这篇文章是绝对的菜鸟文,用于记录我在玩8313过程中遇到的问题和解决方案。首先展示下我焊的那块8313板后面的好几十个0402的104电容,焊这些东西耗费了我一天时间……

    先给一个参照物,这是一支笔

    然后是我手焊的0402电容……

    开始正文,PowerPC的启动比较奇怪(当然我是带着ARM的眼光看的),CPU内核需要从外部存储设备加载配置字,用这些配置字初始化PLL,并决定从哪个地址启动。PLL初始化之后就不能更改,看来PowerPC根本没有打算往低功耗方面发展。在8313上,Flash内没有内容时,可以用配置字b1100启动,CPU速度是333M,DDR内存时钟MCK是166M;用这个配置可以烧写Flash。我很疑惑的是b1100这个配置字令CPU处于PCI从模式,理论上需要有PCI_CLK,CPU才能启动。但是在我们的板上,PCI_CLK接地,而PCI_SYNC_IN用一个22欧电阻接到了PCI_SYNC_OUT上(当然这是抄官方开发板的),所有晶振都没有焊呢,不知道怎么搞得,就能产生很准确的66M时钟,我真很汗。

    焊好电源、CPU、DDR之后,测试了下DDR,速度还是不错的,120MB的内存两秒就扫描完了,ARM可做不到这点。进一步研究了下,发现Freescale晃点我,开发板上用的是DDR2 667的内存芯片,但是MPC8313 DDR控制器的最高速度只有166M即DDR 333的水平……估计MPC8313也就用了DDR2芯片的ODT功能,要是外接电阻的话,DDR一代的芯片也可以用。

    经过很长时间的资料搜索和摸索,终于知道怎么用CodeWarrior(Windows版)调试U-Boot了。跟过去一样,还是虚拟机下用Samba共享U-Boot的程序目录,然后用CodeWarrior打开。编译器刚才已经提到了,用Freescale自己的BSP来做一个,调试的具体操作可以看CodeWarrior(Linux版)的文档。我还是把这部分贴出来,CodeWarrior Linux版有550M,下载需要好久,给大家提供个方便吧。 需要注意的是,不可以直接将U-Boot加载到内存里进行调试,要先烧写;简单点说就严格按照下面这篇教学里说的做。可能你会需要一个U-Boot在DDR里的执行入口(文中描述的Now running in RAM - U-boot at: XXXX),这个入口U-Boot 1.3.4默认是不打印的,打印这个信息的代码在board.c中的board_init_f()函数末尾部分,默认是个DEBUG宏,把它改成printf就可以了。等以后我彻底研究明白了再上来写为什么要先烧写才能调试。

     

     

    Tutorial: Debugging the U-Boot Universal Boot Loader


    This section shows you how to use the CodeWarrior debugger to debug the U-Boot universal boot loader. U-Boot resides in flash memory on target systems and boots an embedded Linux image developed for those systems.

    Note: The Linux Application Edition of this product does not support debugging the U-Boot bootstrap firmware.

    The topics in this section are:

    Preparing to Debug U-Boot

    To prepare to debug U-Boot on a target system, you first install on the host Linux computer the Board Support Package (BSP) for the particular target system you want to debug. Then you configure the BSP U-Boot package to place debugger symbolic information in the U-Boot binary executable file. Finally, you create a new CodeWarrior project that you will use to debug U-Boot on the target system.

    Note: The first part of this procedure must be performed on a Linux host.

    To prepare to debug U-Boot on a target system:

    1. On the host computer, where CodeWarrior Development Studio is installed, install the board support package (BSP) for your target system.
    2. You can obtain BSPs for Freescale Power Architecture target systems from this web page:

      http://www.freescale.com/codewarrior/downloads  
    3. Use the tools included with the BSP to build an ELF-format U-Boot image file that includes debugger symbolic information.
      1. Make these changes to the file u-boot/config.mk:
      • DBGFLAGS = -g2 -gdwarf-2
      • AFLAGS_DEBUG = -Wa,-gdwarf2
      • OPTFLAGS = -O1

        Note: If you are using a Linux Target Image Builder (LTIB) BSP, you may need to change the optimization flag of the CFLAGS argument in this file:

        LTIBInstallDir/config/platform/board_name/.config

      1. If the version of U-Boot included with the BSP modifies any of these registers during startup, comment the appropriate lines in the file u-boot/cpu/mpc85xx/start.S file so that U-Boot will not modify the registers:
      • DBCR0
      • IAC1
      • IAC2
      • DAC1
      • DAC2
      1. In the file u-boot/lib_ppc/board.c, change the token debug to the token printf in the statement that includes this string:
      2. Now running in ram
      3. Rebuild U-Boot.

    You now have an ELF-format U-Boot binary executable file that contains debugger symbolic information. In addition, you have a U-Boot raw binary (.bin) file that you can write to flash memory on the target board.

    Note: It is best to leave the ELF-format U-Boot binary file in this location, so that when you create a CodeWarrior project with the file, the CodeWarrior IDE can find all of the source U-Boot source code files needed to debug the binary file.

    Note: The following procedure must be performed using the Professional Edition of this CodeWarrior product.

    1. Start the CodeWarrior IDE.
    2. Use the CodeWarrior Flash Programmer to write the raw binary U-Boot file (not the ELF-format file) to the flash memory of that target system.
    3. Refer to the "Flashing U-Boot" section of the target system's BSP User's Guide for instructions that show how to flash U-Boot to the system. This document is typically located in the help/software folder of the BSP.

      Warning: Do not write the ELF-format U-Boot file to flash memory; you must use the raw binary U-Boot file.

    4. From the CodeWarrior menu bar, select File > Open.
    5. The standard Open dialog box appears.

    6. Navigate to and select (highlight) the ELF-format U-Boot file containing debugger symbolic information (one of the files you created in the previous step).
    7. Click Open.
    8. The Choose Debugger dialog box (Figure 3.72) appears.
    9. Figure 3.72 Choose Debugger Dialog Box


    10. Select one of these remote connections:
    11. CodeWarrior Ethernet TAP - if you are using an Ethernet TAP run-control device.
    12. CodeWarrior USB TAP - if you are using a USB TAP run-control device.
    13. Note: You must use a JTAG run-control device to debug U-Boot. The CodeWarrior USB TAP and the CodeWarrior Ethernet TAP are each JTAG devices.

      The CodeWarrior IDE creates a CodeWarrior project containing the source files used to build the U-boot binary file. The CodeWarrior project file is located in the same directory as the ELF-format U-Boot file.

      Note: For the IDE to create complete a U-Boot project file, all source files used to build the ELF format U-Boot file must be available. While the IDE is building the new CodeWarrior project, if it cannot find a U-Boot source code file, it displays a dialog box with which you can navigate to and select the file. For each source code file that cannot be found, the IDE logs a message to the Project Creator Log window.

      Once project creation is complete, the IDE displays the project in a project window. (See Figure 3.73.)

      Figure 3.73 CodeWarrior Project Window


    You now have CodeWarrior project with which you can debug the U-Boot bootstrap firmware.

    Note: While debugging U-Boot on 86xx, if address translations has not been enabled and you set a breakpoint in a part of code after the address translation is done, this breakpoint will not be hit. Breakpoints can be used until enable address translation is done. You can use step into to debug through the address translation section (breakpoints / step over / run to cursor cannot be used). After the translation is enabled, you can start using again the hardware breakpoints. A breakpoint set in the c) part of code while debugging in the a) part of code will not be hit.

    During a typical U-Boot start-up sequence, the target processor starts executing U-Boot in flash memory. U-Boot then enables the Memory Management Unit (MMU), and relocates itself to RAM.

    CodeWarrior build target settings required to debug U-Boot in flash memory differ from the settings required to debug U-Boot in RAM. Therefore, you must use individual CodeWarrior debug sessions to debug the flash memory and RAM sections:

    Debugging U-Boot in Flash Memory Before the MMU is Enabled

    To debug U-Boot in flash memory before the target board's memory management unit (MMU) is enabled:

    1. Start the CodeWarrior IDE.
    2. Open the CodeWarrior U-Boot project you created in section "Preparing to Debug U-Boot".
    3. From the CodeWarrior menu bar, select Edit > Debug Settings.
    4. The Target Settings window (Figure 3.74) appears.

      Figure 3.74 Target Settings Window


    5. From the Target Settings Panels list, select Debugger Settings
    6. The Debugger Settings panel (Figure 3.75) appears.

      Figure 3.75 Debugger Settings Panel


    7. Check the Stop on Application Launch checkbox.
    8. Select the Program entry point option button.
    9. From the Target Settings Panels list, select Remote Debugging.
    10. The Remote Debugging settings panel (Figure 3.76) appears.

      Figure 3.76 Remote Debugging Settings Panel


    11. From the Connection list box, select one of these remote connections:
    12. CodeWarrior Ethernet TAP
    13. CodeWarrior USB TAP
    14. Click the Edit Connection button.
    15. When the IDE displays a dialog box asking if you want to continue, click OK.
    16. The Edit Connection dialog box (Figure 3.77) appears, displaying the configuration for the selected remote connection.

      Figure 3.77 Edit Connection Dialog Box


    17. Check the Reset Target on Launch checkbox.
    18. Click OK.
    19. The Edit Connection dialog box disappears.

    20. From the Target Settings Panels list, select Debugger PIC Settings.
    21. The Debugger PIC Settings settings panel (Figure 3.78) appears.

      Figure 3.78 Debugger PIC Settings Panel


    22. Check the Alternate Load Address checkbox.
    23. Note: An alternate load address causes the debugger to assume that all sections have been relocated to RAM. If you specify no alternate load address, the debugger can display source code only for sections in flash memory. If you specify an alternate load address, the debugger can display source code only for sections in RAM.

    24. In the Alternate Load Address text box, type the hexadecimal form of the memory address at which the U-Boot image was written to flash memory.
    25. From the Target Settings Panels list, select EPPC Debugger Settings.
    26. The EPPC Debugger Settings settings panel (Figure 3.79) appears.

      Figure 3.79 EPPC Debugger Settings Panel


    27. From the Processor Family list box, select the family of the target processor.
    28. From the Target Processor list box, select the target processor.
    29. From the Target OS list box, select Bareboard.
    30. Check the Use Target Initialization File checkbox.
    31. Click Browse to display a dialog box with which you can navigate to and select the target initialization file for the target system.
    32. In the Program Download Options area, clear all the checkboxes in the Initial Launch and Successive Runs sections.
    33. Click the Save button.
    34. Close the Target Settings window.
    35. The Target Settings window disappears. The CodeWarrior IDE saves your changes to target settings.

    36. On the host computer running the CodeWarrior IDE, start a terminal emulator program such as minicom.
    37. Configure the terminal emulator as shown in Table 3.24.
    38. Table 3.24 Terminal Emulator Configuration Settings?
      bits per second
      115200
      data bits
      8
      parity
      none
      stop bits
      1
      hardware flow control
      none
      software flow control
      none
    39. Power on or reset the target system.
    40. The system resets.The terminal emulator displays U-Boot status messages.

      Note: If U-Boot asks for the MAC address of the board's Ethernet interface, enter a valid MAC address, such as 00:01:03:00:01:04.

      U-Boot finishes initialization and displays this message (where N is the number of seconds left before autoboot starts):

      Hit any key to stop autoboot: N  
    41. Stop the autoboot process by pressing any key on the keyboard.
    42. The U-Boot command prompt appears:

      -->  
    43. From the CodeWarrior menu bar, select Debug > Attach To Process.
    44. The CodeWarrior debugger connects to the target system and displays a debugger window.

    45. From the CodeWarrior menu bar, select Debug > Stop.
    46. The debugger halts U-Boot execution and displays disassembled code in the Source pane of the debugger window (See Figure 3.80).

      Figure 3.80 Attach To Process - Debugger Window


    47. Select Debug > EPPC > Hard Reset.
    48. The debugger sends a hard reset signal to the board. The debugger window displays the __start section. You can debug from this point up to the first blr instruction in start.S.

    Debugging U-Boot in Flash Memory After the MMU is Enabled

    To debug U-Boot in flash memory after the target board's memory management unit (MMU) is enabled:

    1. Start the CodeWarrior IDE.
    2. Open the CodeWarrior U-Boot project you created in section "Preparing to Debug U-Boot".
    3. From the CodeWarrior menu bar, select Edit > Debug Settings.
    4. The Target Settings window (Figure 3.74) appears.

      Figure 3.81 Target Settings Window


    5. From the Target Settings Panels list, select Debugger Settings
    6. The Debugger Settings panel (Figure 3.75) appears.

      Figure 3.82 Debugger Settings Panel


    7. Check the Stop on Application Launch checkbox.
    8. Select the Program entry point option button.
    9. From the Target Settings Panels list, select Remote Debugging.
    10. The Remote Debugging settings panel (Figure 3.76) appears.

      Figure 3.83 Remote Debugging Settings Panel


    11. From the Connection list box, select one of these remote connections:
    12. CodeWarrior Ethernet TAP
    13. CodeWarrior USB TAP
    14. Click the Edit Connection button.
    15. When the IDE displays a dialog box asking if you want to continue, click OK.
    16. The Edit Connection dialog box (Figure 3.77) appears, displaying the configuration for the selected remote connection.

      Figure 3.84 Edit Connection Dialog Box


    17. Check the Reset Target on Launch checkbox.
    18. Click OK.
    19. The Edit Connection dialog box disappears.

    20. From the Target Settings Panels list, select Debugger PIC Settings.
    21. The Debugger PIC Settings settings panel (Figure 3.78) appears.

      Figure 3.85 Debugger PIC Settings Panel


    22. Clear the Alternate Load Address checkbox.
    23. Note: An alternate load address causes the debugger to assume that all sections have been relocated to RAM. If you specify no alternate load address, the debugger can display source code only for sections in flash memory. If you specify an alternate load address, the debugger can display source code only for sections in RAM.

    24. From the Target Settings Panels list, select EPPC Debugger Settings.
    25. The EPPC Debugger Settings settings panel (Figure 3.79) appears.

      Figure 3.86 EPPC Debugger Settings Panel


    26. From the Processor Family list box, select the family of the target processor.
    27. From the Target Processor list box, select the target processor.
    28. From the Target OS list box, select Bareboard.
    29. Check the Use Target Initialization File checkbox.
    30. Click Browse to display a dialog box with which you can navigate to and select the target initialization file for the target system.
    31. In the Program Download Options area, clear all the checkboxes in the Initial Launch and Successive Runs sections.
    32. Click the Save button.
    33. Close the Target Settings window.
    34. The Target Settings window disappears. The CodeWarrior IDE saves your changes to target settings.

    35. On the host computer running the CodeWarrior IDE, start a terminal emulator program such as minicom.
    36. Configure the terminal emulator as shown in Table 3.24.
    37. Table 3.25 Terminal Emulator Configuration Settings?
      bits per second
      115200
      data bits
      8
      parity
      none
      stop bits
      1
      hardware flow control
      none
      software flow control
      none
    38. Power on or reset the target system.
    39. The system resets.The terminal emulator displays U-Boot status messages.

      Note: If U-Boot asks for the MAC address of the board's Ethernet interface, enter a valid MAC address, such as 00:01:03:00:01:04.

      U-Boot finishes initialization and displays this message (where N is the number of seconds left before autoboot starts):

      Hit any key to stop autoboot: N  
    40. Stop the autoboot process by pressing any key on the keyboard.
    41. The U-Boot command prompt appears:

      -->  
    42. From the CodeWarrior menu bar, select Debug > Attach To Process.
    43. The CodeWarrior debugger connects to the target system and displays a debugger window.

    44. From the CodeWarrior menu bar, select Debug > Stop.
    45. The debugger halts U-Boot execution and displays disassembled code in the Source pane of the debugger window (See Figure 3.80).

      Figure 3.87 Attach To Process - Debugger Window


    46. Select Debug > EPPC > Hard Reset.
    47. The debugger sends a hard reset signal to the board. The debugger window displays the __start section. You can debug from this point up to the first blr instruction in start.S.

    48. Select Window > Symbolics Window.
    49. The Symbolics Window (Figure 3.88) appears.

    50. In the Executables list, select u-boot.
    51. In the Files list, select board.c.
    52. In the Functions list, select board_init_f.
    53. The IDE displays the source code of the board_init_f() function in the Source pane (as shown in Figure 3.88).
    54. Figure 3.88 Symbolics Window - Flash Board Initialization Function


    55. In the Source pane, right-click the first line of the board_init_f() function with a tick mark in the breakpoint column on the left side of the window.
    56. A contextual menu appears, as shown in Figure 3.89.

      Figure 3.89 Debugger Window - Contextual Menu


    57. From the contextual menu, select Set Hardware Breakpoint.
    58. The IDE sets the hardware breakpoint on the selected line of code. A blue diamond symbol appears over the tick mark in the breakpoint column, indicating that a hardware breakpoint is set.

    59. Close the Symbolics Window.
    60. From the CodeWarrior menu bar, select Debug > EPPC > Hard Reset.
    61. The debugger resets the target system and halts U-Boot execution at the start of U-Boot.

    62. Select Project > Run.
    63. The debugger starts U-Boot execution. When execution reaches the hardware breakpoint, the debugger halts execution. A debugger window (Figure 3.90) appears, showing the source code of the board_init_f() function.

      Figure 3.90 Debugger Window - Stopped At Hardware Breakpoint


      Note: In this debugger window, the blue arrow indicates that the program counter (PC) is at the line of code on which you set the hardware breakpoint.

    You may now use the features of the CodeWarrior debugger to step through the source code and debug U-Boot in flash memory.

    Debugging U-Boot in RAM

    To debug U-Boot in RAM:

    1. On the host computer, start a terminal emulator program such as minicom.
    2. Configure the terminal emulator as shown in Table 3.26.
    3. Table 3.26 Terminal Emulator Configuration Settings?
      bits per second
      115200
      data bits
      8
      parity
      none
      stop bits
      1
      hardware flow control
      none
      software flow control
      none
    4. Reset or power on the target system.
    5. The system resets.The terminal emulator displays U-Boot status messages (as shown in Figure 3.91).

    6. If U-Boot asks for the MAC address of the board's Ethernet interface, enter a valid MAC address, such as 00:01:03:00:01:04.
    7. U-Boot finishes initialization and displays this message (where N is the number of seconds left before autoboot starts):

      Hit any key to stop autoboot: N  
    8. Press a key on your keyboard to stop the autoboot process.
    9. The U-Boot command prompt appears (as shown in Figure 3.91):

      -->  
      Figure 3.91 U-Boot Startup Messages


    10. Write down the memory address from this U-Boot startup message (as shown in Figure 3.91):
    11. Now running in RAM - U-Boot at: address  
    12. Start the CodeWarrior IDE.
    13. Open the CodeWarrior U-Boot project you created in section "Preparing to Debug U-Boot".
    14. From the CodeWarrior menu bar, select Edit > Debug Settings.
    15. The Target Settings window (Figure 3.92) appears.

      Figure 3.92 Target Settings Window


    16. From the Target Settings Panels list, select Debugger Settings
    17. The Debugger Settings panel (Figure 3.93) appears.

      Figure 3.93 Debugger Settings Panel


    18. Check the Stop on Application Launch checkbox.
    19. Select the Program entry point option button.
    20. From the Target Settings Panels list, select Remote Debugging.
    21. The Remote Debugging settings panel (Figure 3.94) appears.

      Figure 3.94 Remote Debugging Settings Panel


    22. From the Connection list box, select one of these remote connections:
    23. CodeWarrior Ethernet TAP
    24. CodeWarrior USB TAP
    25. Click the Edit Connection button.
    26. When the IDE displays a dialog box asking if you want to continue, click OK.
    27. The Edit Connection dialog box (Figure 3.95) appears, displaying the configuration for the selected remote connection.

      Figure 3.95 Edit Connection Dialog Box


    28. Check the Reset Target on Launch checkbox.
    29. Click OK.
    30. The Edit Connection dialog box disappears.

    31. From the Target Settings Panels list, select Debugger PIC Settings.
    32. The Debugger PIC Settings settings panel (Figure 3.96) appears.

      Figure 3.96 Debugger PIC Settings Panel


    33. Check the Alternate Load Address checkbox.
    34. In the Alternate Load Address text box, enter the memory address you wrote down earlier, from the U-Boot startup messages displayed in the terminal emulator.
    35. Use the format: 0xFFFFFFFF

      Note: An alternate load address causes the debugger to assume that all sections have been relocated to RAM. If you specify no alternate load address, the debugger can display source code only for sections in flash memory. If you specify an alternate load address, the debugger can display source code only for sections in RAM.

    36. From the Target Settings Panels list, select EPPC Debugger Settings.
    37. The EPPC Debugger Settings settings panel (Figure 3.79) appears.

      Figure 3.97 EPPC Debugger Settings Panel


    38. From the Processor Family list box, select the family of the target processor.
    39. From the Target Processor list box, select the target processor.
    40. From the Target OS list box, select Bareboard.
    41. Check the Use Target Initialization File checkbox.
    42. Click Browse to display a dialog box with which you can navigate to and select the target initialization file for the target system.
    43. In the Program Download Options area, clear all the checkboxes in the Initial Launch and Successive Runs sections.
    44. Click the Save button.
    45. Close the Target Settings window.
    46. The Target Settings window disappears. The CodeWarrior IDE saves your changes to target settings.

    47. From the CodeWarrior menu bar, select Debug > Attach To Process.
    48. The CodeWarrior debugger connects to the target system and displays a debugger window.

    49. From the CodeWarrior menu bar, select Debug > Stop.
    50. The debugger halts U-Boot execution and displays disassembled code in the Source pane of the debugger window (See Figure 3.98).

      Figure 3.98 Attach To Process - Debugger Window


    51. Select Window > Symbolics Window.
    52. The Symbolics Window (Figure 3.99) appears.

    53. In the Executables list, select u-boot.
    54. In the Files list, select board.c.
    55. In the Functions list, select board_init_r.
    56. The IDE displays the source code of the board_init_r() function in the Source pane (as shown in Figure 3.88).
    57. Figure 3.99 Symbolics Window - RAM Board Initialization Function


    58. In the Source pane, right-click the first line of the board_init_r() function with a tick mark in the breakpoint column.
    59. A contextual menu appears, as shown in Figure 3.89.

      Figure 3.100 Debugger Window - Contextual Menu


    60. From the contextual menu, select Set Hardware Breakpoint.
    61. The IDE sets the hardware breakpoint on the selected line of code. A blue triangle appears over the tick mark in the breakpoint column, indicating that a hardware breakpoint is set.

    62. Close the Symbolics Window.
    63. From the CodeWarrior menu bar, select Debug > EPPC > Hard Reset.
    64. The debugger resets the target system and halts U-Boot execution at the start of U-Boot.

    65. Select Project > Run.
    66. The debugger starts U-Boot execution. When execution reaches the hardware breakpoint, the debugger halts execution. A debugger window (Figure 3.90) appears, showing the source code of the board_init_f() function.
    67. Figure 3.101 Debugger Window - Stopped At Hardware Breakpoint


      Note: In this debugger window, the blue arrow indicates that the program counter (PC) is at the line of code on which you set the hardware breakpoint.

    You may now use the features of the CodeWarrior debugger to step through the source code and debug U-Boot in RAM.

    October 09

    使用J-Link GDB Server + Eclipse CDT进行ARM程序调试

     
    之前我预告过这篇文章,这段时间以来,我工作一直比较忙,而且在装修我的小破窝,生活的压力让我把业余的时间都贡献给奥山战场了,我的小牧师,杀人很慢,被杀倒是挺速度的,呵呵;想当年上学的时候,我也是副本RL,逃课带MC;现在工作了就只能沦为战场混荣誉的了……平时没有太多时间,职业不开UT跟混收麦子;周末开UT打各种麦子和各种国家队。国际惯例,二区风行者暗夜暗牧,多多和雯雯(Sigh,这个名字我GF取的,她叫雯雯和多多)。欢迎风行者的周末一同UT,我排队相当狠的,嘿嘿。
     
    在开始前另外提一件事情,我之前说想找个便宜的PowerPC调试解决方案,现在其实我也算找到了——还是Macraigor的OCDRemote,用起来和OpenOCD差不多,具体用法和支持的器件请看Macraigor的官网http://www.macraigor.com/。不过,“0f 84 f0 fc ff ff”->“0f 85 f0 fc ff ff”;我所提供的信息来自互联网,仅可以用于个人学习和研究,对于产生的后果,我不负任何责任;如果你喜欢这个软件,请联系Macraigor的销售,购买他们的调试硬件。但OCDRemote + Wiggler目前并不支持e300、e500内核,我要用的MPC8313还是调试不了……
     
    首先明确一下,为什么我要抛开IAR、ADS、Keil这样的IDE选择GNU阵营的东西——这并不是因为GNU是自由软件,而是因为在一个CPU刚上手的时候,往往还是需要别人的代码来参考的,u-boot里面的样例很多,但是移植到IDE环境下开发却很困难。
     
    之前这篇文章里http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!485.entry,我介绍过J-Link是一个非常不错的ARM调试工具,它的软件包里带有GDB Server。J-Link在JTAG频率为8MHz时,ARM926EJ-S可以达到300~400kB/s的下载速度。Eclipse是一个免费的JAVA开发调试IDE,因为它很受欢迎,所以Eclipse也增加了对C/C++开发的支持;过去是需要下载Eclipse,然后再下载C/C++开发插件CDT,现在官网已经有直接打包好的Eclipse + CDT下载了,地址是http://www.eclipse.org/downloads/,无论你在Windows还是在Linux下使用Eclipse,都需要安装Java Runtime Environment。但我们进行的是交叉开发,CDT里头自带的Debug Configuration无法完成这种开发,需要安装一个插件。具体步骤:首先确认你的操作系统可以上网(实际的、虚拟机里的都一样);然后在Eclipse的菜单里选择Help->Software Updates;选择Available Software选项卡,点Add Site按钮;输入地址http://www.zylin.com/zylincdt,列表里就多了一项;刷新之后点上面的Install按钮安装。
     
    ZylinCDT用起来很方便,只需要在Debug Configuration里面配置Commands选项卡,填入Initiate Commands和Run Commands;其他和Eclipse自己的Debug Configuration差不多。事实上,ZylinCDT就是用这些填入的内容取代了正常的GDB初始化命令,给出我的Initiate Commands给大家参考(Run Commands为空):
    target remote 192.168.5.133:2331
    # Disable watchdog
    monitor memU32 0xfffffd44 = 0x00008000
    # PD6 - EBI0_NCS4, PD11 - EBI0_NCS2, PD15 - EBIO_CS3/NANDCS, PD16~PD31 - EBI0_D16~EBI0_D31
    monitor memU32 0xfffff844 = 0xffff8840
    monitor memU32 0xfffff864 = 0xffff8840
    monitor memU32 0xfffff870 = 0xffff8840
    monitor memU32 0xfffff804 = 0xffff8840
    # Configure the EBI0 Slave Slot Cycle to 64
    monitor memU32 0xffffec50 = 0x00000040
    # Initialize the matrix, VDDIOMSEL = 1 -> Memories are 3.3V powered
    monitor memU32 0xffffed20 = 0x0001000a
    # Configure SDRAM Configuration Register
    monitor memU32 0xffffe208 = 0x85227259
    monitor sleep 10
    # Perform Command - Precharge All
    monitor memU32 0xffffe200 = 0x00000002
    monitor memU32 0x20000000 = 0x00000000
    monitor sleep 20
    # Perform Command - Refresh for 8 times
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000004 = 0x00000001
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000008 = 0x00000002
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x2000000c = 0x00000003
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000010 = 0x00000004
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000014 = 0x00000005
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000018 = 0x00000006
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x2000001c = 0x00000007
    monitor memU32 0xffffe200 = 0x00000004
    monitor memU32 0x20000020 = 0x00000008
    # Perform Command - Load Mode Register
    monitor memU32 0xffffe200 = 0x00000003
    monitor memU32 0x20000024 = 0xcafedede
    # Set Refresh Timer
    monitor memU32 0xffffe204 = 0x000002bc
    # Perform Command - Set Normal mode
    monitor memU32 0xffffe200 = 0x00000000
    monitor memU32 0x20000000 = 0x00000000
    file /home/lxz/share/u-boot-1.3.4/u-boot
    load
    我调试的目标CPU是AT91SAM9263,通过以上的初始化命令,可以实现PLL、SDRAM的初始化,并将u-boot带码加载到内存中。J-Link的monitor命令可以看J-Link安装之后的文档J-Link GDB server user guide的3.4节Supported remote commands。
     
    今天说的这些事情没有什么难度,用Eclipse + J-Link调试的关键就是要用ZylinCDT这样的插件,关于ZylinCDT的信息可以看它的官网http://www.zylin.com/,解释的比我说的详细多了。Eclipse的教学文档网络上也多得很,Eclipse本身界面就很友好,不用什么教学,自己摸索一会儿也就会了。我就总结下:Eclipse可以自动创建Makefile,虽然使用的是GCC工具链,却有像ADS、Codewarrior这样IDE环境的便利;对于U-boot、Linux内核这样的有现成Makefile的程序,Eclipse能将它们导入,一样能调试。但是,和Source Insight强大的自动完成功能相比,Eclipse逊色太多了。我的开发解决方案是:Linux虚拟机下的SMB共享代码 + Windows下的Source Insight编辑 + Linux虚拟机下的arm-linux-gcc编译 + Windows下的J-Link GDB Server + Linux虚拟机下的Eclipse CDT & ZylinCDT;呵呵,好绕啊;但如果代码不复杂,就直接用Eclipse编辑也挺好。
    July 23

    最低成本的ARM调试解决方案——有关于Wiggler、H-Jtag、OpenOCD、GDB、Insight

     
    又是一个多月没有动这个Blog嘿嘿,我发现一个有趣的现象,我的Blog在每年的1月底到2月中旬,7月、8月是淡季,每天访问量基本都在100以下,其它时间都是旺季,尤其9月和3月,每天可以到200以上,最高甚至500。我想因该是因为学生们是EE小站访问的主力吧——9月和3月是开题的日子,这资料搜索做的,哈哈。现在是淡季,祝大家假期愉快,多陪陪父母。我现在就很后悔,大学的时候放假都在学校研究东西,就算回家,也背着全套的设备回去……现在工作了,根本没有时间回家看父母,唉。这段时间以来我一直在研究和调试相关的东西,最开始是想给MPC8313找一个便宜的调试方案,后来就找出来一大堆东西,但是就是没有合适8313用的。今天写的这个话题和学生们有很大关系,嘿嘿,怎样用最低的成本调试ARM,包括裸机调试和调试ARM Linux相关的东西。转载请注明来自EE小站,邮件cosine@126.com
     
    先给大家介绍个大概情况,现在国内都有什么著名的ARM开发工具和解决方案,价格从高低排:
     
    • BDI1000/2000/3000
    目前我知道的最牛X的调试工具,可以调试ARM、MIPS、PPC、ColdFire、XScale等多种处理器。无需更换硬件,只需要买不同的软件授权就可以调试不同的CPU。JTAG下载速度可以上兆,以太网接口。因为太贵了(BDI2000好像要人民币50000吧),我没怎么研究它到底配合什么软件来调试,不过GDB它是肯定支持的,它一直是我心目中的神话啊。
    • J-Link原版
    J-Link是IAR公司为ARM开发的调试工具,支持RDI协议的调试工具,如Keil、ADS、IAR等;支持GDB调试;什么SWD之类的用得很少,有没有都一样;但J-Link不支持ARM10以上的内核。JTAG下载的速度可以达到400~500K,正版价格大约5000人民币(全功能)吧,这么贵基本也不考虑了。
    • Multi-ICE原版
    ARM公司的原创调试工具,支持全系列ARM芯片,现在多少钱我也不知道了,反正在2000~3000人民币这个级别。我这里指的是国内做得比较好的那些,比如Realview之类的。仅仅支持ADS、SDT之类的裸奔代码调试,JTAG下载速度130K左右。虽然这几年Multi-ICE是国内ARM调试绝对的霸主,但现在ARM公司已经停止对ADS的维护了,Multi-ICE会开始走向没落。
    • Multi-ICE盗版
    国内有很多Multi-ICE的盗版,功能和Multi-ICE原版一样,并口的、USB的都有,价钱几百块人民币,淘宝上到处都有。但是和J-Link盗版相比,不推荐购买。
    • J-Link盗版
    最近这段时间,J-Link盗版渐渐开始多起来了,淘宝上也很多,功能和原版没有区别。价格大约在几百人民币左右,从性价比来看,推荐购买。我之后还会写一篇用J-Link调试ARM的文章,当你入门之后,绝对无法忍受今天介绍的这个低成本方案的JTAG下载速度,那时就买个J-Link来爽爽。
    • U-Link盗版
    U-Link是Keil公司做的用于ARM和某些增强型8051调试的工具,由于Keil公司做U-Link的时候没有加密,导致现在盗版满天飞,只需要100多块钱就可以买到一个。现在Keil已经被ARM收购,U-Link也是ARM一家的了。U-Link正版在盗版的排挤下,根本没有什么买的必要;U-Link仅仅支持Keil,而且JTAG下载速度仅有20~30K。
    • Wiggler电缆
    Wiggler是世界上最泛滥的一种调试工具,它非常简单,只需要一片74HC244,一个9013,几个电阻就可以。本来Wiggler是Macraigor(http://www.macraigor.com/)制作的,可以支持Macraigor的OCDRemote这个GDB Server,可以支持ARM、PPC、ColdFire、MIPS、XScale等多种CPU。后来因为它结构太简单,被人破解后搞得全世界都是,于是Macraigor怒了,现在用OCDRemote必须是Macraigor原厂的Wiggler了……尽管如此,后人又在Wiggler的硬件基础上开发了很多的调试工具,例如H-Jtag;另外也有其他的调试工具增加了对Wiggler的支持,例如OpenOCD。Wiggler电缆的成本特别低,当然它的性能也和成本一样低;用H-Jtag下载速度大约20~30KB/s,用Linux虚拟机下的OpenOCD下载速度大约2KB/s。不过对于囊中羞涩的学生们来说,是一个非常不错的入门工具。本文就针对Wiggler进行介绍。
    估计看这篇文章的人会有一些是从单片机起步,转到ARM上来的,我先梳理下各种CPU调试的知识。
     
    • 从MCS-51/96、PIC之类的单片机转入ARM
    这条路是学校教学比较传统的路子。条件好点的学校开单片机课的时候都有实验,用实验箱和仿真器做实验,那种仿真器就是一种最早的CPU/MCU仿真器,仿真器通过仿真头连接电路板,完全模拟CPU/MCU的功能;仿真器通过串口或者其他什么口连接计算机,计算机上有集编译器、调试器为一体的集成开发环境,可以监控和运行程序。这种仿真器的成本一般比较高,而且仿真不同的CPU/MCU需要不同的硬件,结构也很复杂,使用软件模拟的断点。解释下软件模拟的断点——就是用特殊的函数调用指令替换断点所在位置的指令,这些特殊的函数具有和仿真器的监控软件交互的功能。应该有很多的同学平时没有条件用上这么奢侈的设备,多半是用的是ISP,采用“点灯大法”——就是借助LED、串口之类的调试程序,每修改一次程序就重新下载一次,调试非常的艰苦。我刚开始玩单片机的时候AT的89S52还没有出来,我花一个月的生活费买了个烧写器,每次改程序都把芯片撬下来放到烧写器上,烧完再装回去继续点灯……
    走这条路,要明白的事情有:ARM的寄存器可不是51那寥寥可数的几个,是没有必要也不可能背下来的;ARM芯片一般都内置了JTAG调试逻辑,不需要CPU仿真器,需要的是一个JTAG协议转接器(虽然现在大家还叫这种东西为仿真器);集成开发环境在使用者看来和单片机的没有任何区别,这点请放心。
    • 从AVR、C8051F之类有JTAG的单片机转入ARM
    时代是不断进步的,AVR、C8051F具有JTAG口的单片机。JTAG(Joint Test Action Group)组织定了一个最初是用于测试生产出来的芯片是不是良品的测试接口和标准,在芯片的各个管脚上放上锁存器,然后串起来构成移位寄存器,可以监控芯片管脚的输入和输出;后来大家发现这东西用来搞芯片的在线调试不错,于是就出现了现在JTAG调试风行的局面。再说的明白些,也就是利用JTAG可以控制CPU内核,每个CPU都可以成为自己的“仿真器”,而不需要专用的设备。“人人都是食神。”——周星星语录。从理论上来说,世界上只需要一种仿真器,哦,确切的说应该叫做JTAG协议转换器,就可以调试所有的兼容JTAG标准的芯片;BDI2000这种超级贵的“仿真器”以及Wiggler这种什么都通吃的便宜货的存在是很合理的事情。
    走这条路,应该已经明白了JTAG是什么,所以不用多说了。
    • GDB是什么
    正像Windows和Linux的对比,集成开发环境比GDB在嵌入式开发领域,拥有更多的用户,但这并不意味的GDB不好。GDB(GNU Project Debugger)是开源软件组织GNU开发和维护的一种调试工具,它能调试目前所有的能跑Linux的CPU,当然ARM也是其中一员。对于初学者来说,不建议使用GDB,还是先从集成开发环境入手,例如ADS、SDT、Keil、IAR之类的。其实从编译器的层面来讲,集成开发环境和GDB所用的编译器GCC没有什么区别,但集成开发环境里面提供了源文件组织与浏览、工程文件管理、调试等多种功能,用起来很友好。GCC+GDB光学习写相当于工程文件的Makefile就要花很多的时间。但是,一旦你的学习进了一步到了Linux的Loader和内核,集成开发环境就无能为力了。前面已经提到了,本文覆盖了从刚开始的裸奔代码到涉足操作系统的GCC+GDB调试环境的建立方法。本文关于GDB的部分应该是国内挺难找到的HOWTO,转载请注明来自EE小站。关于GDB,可以参考下我之前的这篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!268.entry
    在开始之前请先确认你的电脑有并口,如果是笔记本就算了,买个PCMIA转并口的卡的钱够买个盗版U-Link了;要是肯下血本买盗版J-Link,那就看我以后写的文章。
     
    • 首先说代码裸奔怎么做
    你需要的东西有:
     
    ● 带并口的电脑一台
    ● 并口延长线一根
    ● Wiggler一个
    ● 随便什么ARM7或ARM9的开发板一个
     
    如果没有并口延长线,可以去电脑城买一根。如果没有Wiggler,你可以选择DIY,下面这张图是Wiggler的一种版本:
    如果不想DIY,上淘宝淘一个去。ARM开发板也可以在淘宝上淘淘,看你的经济能力了。
     
    你需要的软件有:
     
    ● ADS (ARM Developer Suite) V1.2
    ● H-Jtag
     
    ADS在一般学校的FTP上都有,H-JTAG请访问http://www.hjtag.com。在此再拜一下Twentyone大侠,可以为大家写出这么好的免费软件。
    H-Jtag和ADS的使用方法在H-Jtag的网站上的手册里写得很清楚了,我就不再啰嗦了,给出地址http://www.hjtag.com/download/USER%20MANUAL%20(CN).pdf
    • 说说GDB怎么做
    如果你对Linux下ARM的开发没有概念,先看我还是菜菜鸟的时候写的这篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!121.entry
     
    GDB使用GDB工具链,调试解决方案的结构是
     
    GDB前端<--->GDB<--->GDB服务程序<--->JTAG协议转换器(仿真器)<--->目标CPU(ARM CPU)
                                          |
                                      控制接口
     
    GDB有一个很大的缺点——文本界面,使用非常不方便。但幸运的是,有很多热心的开发者为GDB写了一些图形“外壳”——GDB前端,大大方便了GDB的使用。因为我们做的是交叉开发(即在x86结构的电脑上开发ARM等非x86结构的CPU程序),所以GDB无法直接调试编译出来的程序,这就需要一个服务程序。这个服务程序可以是一个可以控制目标CPU的程序(可能运行于计算机上;也可能运行于某些仿真器上,例如如BDI2000就是这样),也可以是一个运行于目标CPU上的服务程序,由它来装载被调试的程序。但是后者一般需要目标CPU上已经运行起了Linux内核;调试Bootloader和Linux内核本身,需要前一种服务程序。GDB和GDB服务程序之间的连接方式可以是以太网或者串口,而且GDB服务程序一般还有别的控制接口,例如Telnet接口,可以实现对目标CPU的控制,如初始化和程序文件下载等。比较复杂哦,一会儿说到软件的时候就会用上这些知识。
     
    你需要的东西和裸奔代码一样
     
    你需要的软件有:
     
    ● 一个可以运行的Linux
    虚拟机里的、真实的都可以,推荐使用Open Suse 10.3,下载地址http://software.opensuse.org/
    ● 本机GCC编译器
    Open Suse自己带的就可以
    ● 交叉GCC编译器
    可以去下载一个,随便给个地址把http://www.linux4sam.org/twiki/bin/view/Linux4SAM/SoftwareTools#Cross_Toolchain值得注意的是U-Boot 1.2.0之后需要使用支持软浮点的交叉编译器,如果没有,可以用Crosstool制作一个,可以看我之前的这篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!274.entry
    ● OpenOCD源码
    OpenOCD的主页是http://openocd.berlios.de/web/。OpenOCD是一个运行于PC上的程序,它可以控制包括Wiggler之内的很多JTAG硬件;我们可以将它理解为一种GDB服务程序。OpenOCD的源码只能通过SVN下载,地址是svn://svn.berlios.de/openocd/trunk
    ,在写这篇文章的时候OpenOCD已经是R818版本了,这个版本对Wiggler的支持有问题,我编译的是r520版本的,如果没有SVN Client,这个版本只能通过曲线的方式获得:先到下载http://www.yagarto.de/download/oldver/openocd-r520-20080322.exe这个由YAGARTO提供的OpenOCD For Cygwin的版本,安装它,在安装目录例如C:\Program Files\openocd-r520\source里找到源码压缩包。
    ● Insight源码
    Insight是一个GDB的图形前端,我感觉它比DDD更适合嵌入式系统程序的调试。
    ● 随便什么程序的源码,例如U-Boot
    U-Boot就不用介绍了,如果不知道可以Google下。
    U-Boot的下载地址是http://www.denx.de/wiki/UBoot/SourceCode
    下面开始编译,先是OpenOCD,假设源代码已经解压缩到了/home/lxz/build-openocd,先设定权限
    # cd /home/lxz/build-openocd
    # chmod 755  ./bootstrap
    # ./bootstrap
    等一会儿,输入
    # ./configure --prefix=/usr/local/arm/openocd --enable-parport
    这里--prefix指定的是安装的路径,--enable-parport使能并口,然后
    # make
    # sudo make install
    输入root密码,等一会儿,安装就完成了
     
    然后是insight,假设源码已经解压缩到了/home/lxz/insight-6.8,然后
    # cd /home/lxz/insight-6.8
    # ./configure --prefix=/usr/local/arm/arm-linux-insight --target=arm-linux
    这里--prefix指定的是安装的路径,--target指的是为ARM编译GDB,等一会儿,输入
    # make
    等一会儿,输入
    # sudo make install
    输入root密码,等一会儿,安装就完成了
     
    然后编译一个U-Boot用于测试,假设源码已经解压缩到了/home/lxz/at91rm9200/u-boot-1.2.0,假设已经修改完了Makefile中的交叉编译器的选项,假设我为AT91RM9200DK开发板编译,然后 
    # cd /home/lxz/at91rm9200/u-boot-1.2.0
    # make at91rm9200dk_config
    # make
    于是得到了/home/lxz/at91rm9200/u-boot-1.2.0/u-boot这个映像
     
    为了能让OpenOCD正常使用,我们还需要2个脚本,第一个是OpenOCD的配置脚本,这个脚本的作用是配置GDB服务程序、JTAG仿真器。写这个脚本可以看OpenOCD的文档http://openfacts.berlios.de/index-en.phtml?title=OpenOCD_configuration。我给出我的AT91RM9200DK开发板的配置文件at91rm9200.cfg,每一条配置信息的作用我就不解释了,请仔细阅读OpenOCD的文档。
     
    # Daemon configuration
    telnet_port 23
    gdb_port 2331
    daemon_startup reset
    # JTAG interface configuration
    interface parport
    jtag_speed 0
    reset_config trst_and_srst
    jtag_device 4 0x1 0xf 0xe
    # parport options
    parport_port 0x378
    parport_cable wiggler
    # Target configuration
    target arm920t little run_and_init 0 arm920t
    run_and_halt_time 0 1000
    target_script 0 reset at91rm9200_init.script
    working_area 0 0x00200000 0x1000 backup
     
    我还是提一下,上面这段配置信息中的target_script 0 reset at91rm9200_init.script这句就是指定第二个脚本的,而且让OpenOCD在当前目录下搜索这个脚本。也就是说,如果at91rm9200.cfg在/home/lxz/at91rm9200下,那么你在/home/lxz/at91rm9200下启动OpenOCD服务程序,OpenOCD就会在/home/lxz/at91rm9200下搜索at91rm9200_init.script这个脚本;如果在与at91rm9200.cfg所在路径不同的路径下启动OpenOCD服务程序,OpenOCD就无法找到at91rm9200_init.script,此时,target_script 0 reset at91rm9200_init.script这句就应该写成target_script 0 reset /home/lxz/at91rm9200/at91rm9200_init.script。
    第二个脚本的作用是初始化ARM CPU,因为U-Boot往往是在SDRAM里运行的,其连接位置也都在SDRAM里。用GDB或GDB前端下载程序的时候,必须保证SDRAM是可用的。AT91RM9200这个CPU上电的时候如果从片内Boot ROM启动(不推荐从外部启动,因为如果没有启动程序,AT91RM9200将运行于慢时钟,这样JTAG仿真器可能工作不正常),需要进一步配置PLL,PIO,SDRMC之类的外设之后,SDRAM才可以使用。第二个脚本就是一系列寄存器读写和延时命令的集合,如何编写请看OpenOCD的手册http://openfacts.berlios.de/index-en.phtml?title=OpenOCD_commands,给出我的at91rm9200_init.script。
     
    mww 0xfffffc28 0x00000000
    mww 0xfffffc2c 0x00000000
    mww 0xfffffc20 0x0000ff01
    sleep 20
    mww 0xfffffc28 0x20263e04
    sleep 20
    mww 0xfffffc2c 0x10483e0e
    sleep 20
    mww 0xfffffc30 0x00000000
    sleep 20
    mww 0xfffffc30 0x00000202
    sleep 20
    mww 0xfffff870 0xffff0000
    mww 0xfffff804 0xffff0000
    mww 0xffffff60 0x00000002
    mww 0xffffff64 0x00000000
    mww 0xffffff98 0x2188c159
    mww 0xffffff90 0x00000002
    mww 0x20000000 0x00000000
    mww 0xffffff90 0x00000004
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0x20000000 0x00000000
    mww 0xffffff90 0x00000003
    mww 0x20000200 0x00000000
    mww 0xffffff94 0x000002e0
    mww 0x20000000 0x00000000
    mww 0xffffff90 0x00000000
    mww 0x20000000 0x00000000
    arm7_9 sw_bkpts enable
     
    这个脚本写起来很复杂,建议从一些样例代码上把寄存器的数值扒过来。另外,有些CPU,例如S3C2410,它上电的时候,SDRAM是默认可以用的,就不需要这个脚本了。还有一个值得注意的是,由于我们用的是Wiggler这种简单的JTAG协议转换器,初始化脚本里必须加上arm7_9 sw_bkpts enable这句。现在终于可以开始调试了,假设把OpenOCD安装在了/usr/local/arm/openocd,把Insight安装在了/usr/local/arm/arm-linux-insight,两个初始化脚本都放在了/home/lxz/at91rm9200;你已经正确连接了Wiggler,开发板已经上电。接下来还是用命令来说明
     
    # cd /home/lxz/at91rm9200
    # sudo /usr/local/arm/openocd/bin/openocd -f at91rm9200.cfg
    root's password:
    Open On-Chip Debugger 1.0 (2008-07-21-20:15) svn:
    $URL: http://svn.berlios.de/svnroot/repos/openocd/trunk/src/openocd.c $
    Info:    jtag.c:1329 jtag_examine_chain(): JTAG device found: 0x05b0203f (Manufacturer: 0x01f, Part: 0x5b02, Version: 0x0)
    Info:    target.c:240 target_init_handler(): executing reset script 'at91rm9200_init.script'
    Info:    options.c:50 configuration_output_handler(): software breakpoints enabled
     
    这就说明OpenOCD已经开始工作了。然后启动Insight
    # cd /home/lxz/at91rm9200/u-boot-1.2.0/
    # /usr/local/arm/arm-linux-insight/bin/arm-linux-insight
     
    出现下面的窗口
     
     
     
    然后选择菜单File>Target Settings...,在出现的窗口中进行如下设置,然后点OK。
     
     
     
    选择菜单File>Open,打开/home/lxz/at91rm9200/u-boot-1.2.0/u-boot这个映像;然后选择菜单Run>Download,将U-Boot程序下载到目标CPU。然后在程序运行的必经之路设定一个断点,如下图所示。
     
     
     
    选择菜单Control>Continure,程序就会从头开始执行,并停在断点处了。Insight还有很多不错的功能,并且很容易上手,大家研究下就好。补充一点,如果你对你的初始化脚本是否起作用没有信心,可以在启动Insight之后只选择菜单Run>Connect to target,然后选择菜单View>Memory查看各个寄存器和内存。最后给出一张我用Insight调试U-Boot的截图。
     
     
     
    在使用的过程中就会发现,用Wiggler下载的速度实在不怎么样,U-Boot的可执行映像至多只有200KB,所以还是可以忍受的。
    用同样的方法也可以调试其他Boot Loader,甚至是Linux内核;但是Linux内核的可执行映像一般有2MB之大,用Wiggler调试也是不现实的。我之前已经做了广告了,内核的调试要用J-Link来搞,敬请期待EE小站的后续文章。
    我对ARM CPU的在线Flash Download这件事情不是很感冒,所以H-JTAG和OpenOCD的这部分功能EE小站是不会涉及了,请见谅。今天就到这里。
     
    June 14

    再谈SDRAM的布线——有关Mentor WG、DxDesinger、Expedition、CES

     

    • 前言的前言
    这篇文章我写了很久很久,因为最近很忙很忙。现在我逐渐开始接触开关电源和可靠性设计的东西,好像离原来我定义的EE越来越远了。也许以后我要向模电或管理人员发展了……我还是纯朴地希望自己能一直保持做一个不断钻研的EE工程师。不说了,做人要厚道,转载请注明来自我是一只鱼同学的EE小站,邮件地址cosine@126.com
    • 前言
    最近一个多月都在研究Mentor WG,已经对DxDesigner + Expedition的画板流程有了比较清醒的认识,我对Mentor WG评价可以套用对目前国产汽车的评价——配置齐全、做工粗糙。虽然WG有很强的功能,但是BUG实在是数不胜数,而且有些BUG可能导致你的工程彻底报废,所以建议使用时辅以自动备份软件,减小工程崩溃带来的损失。
     
    今天要谈的话题都是基于WG的,因为PADS、Protel / DXP之类的软件没有这样的功能或功能不完整。不过,也可以使用其他软件进行PCB前仿、手动完成线长匹配等工作;工具只是人的技巧的辅助和延伸,要是没有高速PCB设计的知识,同样完不成高速数字PCB的设计。本文为我是一只鱼同学EE小站的原创文章,转载请注明出处;本文对初学者而言,技术难度较高,如果有不明白的地方,可以留言。另外继续废话几句,事实上SDRAM对布线的要求是很低的,DDR才是真正有挑战的东西,可惜我目前没有DDR的项目,也没有办法验证我对理论的理解,希望以后有机会和大家分享我的心得。下面正式开始:
    • 什么是高速数字PCB,怎么入手?
    高速数字PCB简单来说可以理解为关键部分如存储器总线的工作频率高于数十至一百MHz的PCB,更严格的定义应该用传输线来描述,当PCB上的信号的传输延迟大于上升时间的1/10时,这个信号的传输路径就应该视为传输线;即应当用与传统低速数字电路不同的方法对待。那么怎么入手?我是学机械出身的,电路原理和模电都是三脚猫知识;我个人认为High-Speed Digital System Design是本不错的书。首先看书,弄明白在频率高了以后会出现什么样的现象,有什么东西需要考虑之后,再继续后面的设计。不过我可以做个简单的概括,高频数字电路设计的大部分工作是解决传输线中信号反射问题和延迟问题。BTW,很久以前我还很菜的时候写了一篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!171.entry,这是关于PCB后仿的(这个词下面马上解释),大家有兴趣可以看看。
    • 高速PCB设计的流程
    元件布局——〉前仿真——〉布线——〉后仿真——〉出CAM文件
    其他不多说了,就解释下前仿真和后仿真。
    前仿真就是在器件IBIS模型、网络拓扑结构和器件分布的基础上做的对PCB可实现性仿真。举个例子解释前仿真的作用,如果器件、板子的机械结构都已经定下来了,CPU和SDRAM插座相隔10000mil,那么在布完这个板子之前,怎么知道这个板子能不能正常工作?关于如何使用WG进行前仿真,后面再说。
    后仿真就是在板子走线已经成型之后,对布线结果进行验证而作的仿真。后仿真会在前仿真基础上加上过孔模型、串扰、电磁兼容性等仿真内容。刚才提到的我的菜菜鸟文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!171.entry,说的就是后仿真。
    • SDRAM对布线有什么要求?
    首先必须明白SDRAM是一种什么样的存储器,搞清其接口工作的逻辑时序。SDRAM是一种同步动态存储器,所有接口信号都是通过时钟同步和采样的。这就对SDRAM的布线提出了要求——保证采样的正确性。于是,应用高速数字电路的知识结合某种具体SDRAM器件和你的PCB进行分析,发现在正常工作频率(如100MHz)下,在PCB走线上的信号传输时间大于其上升时间1/10。于是,接下来考虑高速数字电路两大问题反射和延迟:反射造成SDRAM时钟线信号出现振铃,多次穿越门限造成误触发;数据线和时钟线的传输延迟不相同,造成时钟上升沿采样不到所需要的数据。接下来应用解决方法:时钟线串联电阻做阻抗匹配;布线时控制数据线和时钟线的长度差在一定范围内。当然,我这里说的是一个很简单的演绎过程,还有拓扑结构、最大布线长度等重要问题没有考虑,请大家仔细阅读我是一只鱼同学刚才推荐的课本。提示下,拓扑结构和最大布线长度的选择可以通过前仿真进行验证。
    • 进一步的问题,SDRAM布线用什么拓扑结构好?
    这个问题困扰了我很久很久,终于在学会前仿真后解决了,哈哈。其实大家已经很清楚SDRAM要尽量使用Y型分支结构(也叫T型分支),因为链式结构会产生两个问题:一、两片SDRAM的传输延迟不一样,影响CPU对数据输出进行采样;二、链式结构的节点处阻抗不连续,是一个反射点,而且反射点和源的距离太大,反射效果明显。但是,如果使用Y型分支结构,到底是先分支好呢还是后分支好呢?
     

     
    经过前仿真的验证,分支点靠近CPU的时候效果稍微好那么一点点。我想这是因为分支点本身是一个阻抗不连续点,也是会发生反射的。如果分支点靠近源端CPU,反射就会因为传输线的缩短而显得不太明显。我给分枝点靠近CPU的这种拓扑结构起个名字,叫短桩Y型分支结构。
    • 怎样用WG进行PCB前仿真?
    WG中PCB的前仿真的步骤:DxDesigner画原理图——〉Expedition布局——〉CES指定IBIS模型——〉CES指定网络的拓扑结构——〉ICX Pro前仿真。我们来看图说话。
    对于下面这样一个已经完成布局的PCB,从Expedition的工具栏中选择CES
     

     
    在CES的窗口中见的选项卡中,选择Parts
     
     
     
    例如对SDRAM的走线进行前仿真,就需要制定CPU、SDRAM以及其他连接在数据总线上的器件的IBIS模型。相应的模型可以在器件的官方网站上下载到。在Parts里选中要指定模型的器件。
     
     
     
    在弹出的窗口中按照步骤1、2、3(后续图片中的1、2、3、4亦表示步骤)选择IBIS模型文件
     
     
     
    选好后就OK,重复以上步骤直到把要进行仿真的信号所连接的所有器件的IBIS模型都选上。有的IBIS文件中含有多个器件的模型,选择你需要的
     
     
     
    在SDRAM信号设计的时候往往会使用电阻对信号进行阻抗匹配,这时候SDRAM布线的拓扑结构就会变成下面这样
     
     
     
    这个电阻也必须包含到前仿真中去。但是在实际设计中,往往有很多需要匹配的信号,所以一般是使用排阻的。但是默认情况下,CES是不认识排阻的,这需要设置。选择Setup菜单下的Settings…
     
     
     
    在弹出的窗口中选择Discrete Component Prefixes选项页,将你所用的排阻前缀输入(如RM),然后确认
     
     
     
    随后你就会发现CES把你的排阻认为是串行器件了。顺便提下,如上面这张图所示,CES会把这些已经定义前缀的器件识别为串行器件。识别为串行器件有好处也有坏处,好处是对于真正用于阻抗匹配等目的的器件,前后的网络会被归为一个网络进行识别(CES在原来的网络名后面加上“^^^”符号,将两个网络合并);坏处是很多功能性质的电阻,如运放中设定放大比例的电阻两端的网络也会被归为一个网络识别,这时候就需要把下面这张图中所示的钩号去掉。
     
     
     
    接下来,点击Parts边上的Nets选项卡,选择SDRAM的信号
     
     
     
    随后配置网络拓扑结构。对于SDRAM的控制线来说,它们不连接在SDRAM之外的其他上,因此其拓扑结构一般都是之前描述的这种:
     
     
     
    对于一般的地址线而言,往往需要连接除SDRAM芯片之外的其他器件,如NOR Flash,其拓扑结构可能是这样的
     
     
     
    我建议将NOR Flash连接在一个SDRAM的之后,因为如果再搞短桩Y型分支,那么将会有3组分支线,布线就很困难了。当然,连接在哪里要根据前仿真的结果来调整,我提供的这种连接对于某些器件应该会有问题。

    下面要把SDRAM的信号定义成上面这2种拓扑结构中的一种,在Nets列表里找到Topology这一列,点击下拉列表。对于SDRAM时钟信号SDCK这种串联阻抗匹配电阻的拓扑结构而言,选择Complex。
     
     
     
    随后点击工具栏上的Netline order按钮(这个按钮左边的几个按钮可以定义其他不同的拓扑结构,与上图列表中对应,依次是MST、Chained、T、Star、HTree、Custom,这些不同拓扑结构的含义可以Google下或者参看Mentor WG CES的手册)
     
     
     
    出来这样一个对话框
     
     
     
    之前已经提到SDRAM的地址和控制信号应当是短桩Y型分支,如果还有别的器件就连接在SDRAM之后。先说明下,因为定义了排阻为串行期间,所以CES自动的将CPU到排阻的连接识别出来并列在管脚对列表里了;管脚列表里蓝色背景的部分是已经在管脚对列表中存在的管脚。随后就需要定义Y型分支,点击Y型分支拓扑结构图标,再依次点击信号源管脚和两个负载管脚,如下图所示
     
     
     
    在管脚列表中就会出现如下显示
     
     
     
    这说明已经定义了一个Y型分支。定义之后的Y型分支可以删除和修改,具体细节请看CES手册。随后点击对话框下面的那个复选框,“Automatically create pin pairs from from-tos”,确定,CES的Nets列表中,刚才定义的Net下就出现如下图所示的内容
     
     
     
    那些L:VP_T_1_1_1181, L:D19-38之类的东西就是产生的拓扑结构描述。
    刚才已经提到SDRAM的地址线因为还需连接其他器件,拓扑结构的设置还需要有一步添加自定义管脚对。以地址线A2举例,同样选择其为Complex结构
     
     
     
    然后选择工具栏上的Netline order,在出现的对话框中将CPU和SDRAM之间的连接配置为Y型分支,如下图所示
     
     
     
    随后配置和NOR Flash芯片的连接,先点击“From pin / pin set”下面的文本框,然后依次点击SDRAM和NOR Flash的管脚,再点击右边的下箭头,如下图
     
     
     
    于是一个自定义的Pin Pair就出现了,同时管脚列表中对应的管脚背景色也会变蓝,显示这个管脚被指派过了。
     
     
     
    需要注意的是,NOR Flash连接在那个SDRAM器件的管脚上是没有要求的,但是为了走线方便,还是建议连接在理NOR Flash相应管脚较近的SDRAM器件上。
    接下来同样选中“Automatically create pin pairs from from-tos”复选框,确定,A2的拓扑结构就配置好了。
     
     
     
    这里还需要提一个概念——Virtual Pin(虚拟管脚),这是WG为了方便对拓扑结构的管理而设定的一种虚拟的控制点。还是用图来说明,对于SDRAM的连接拓扑结构
     
     
     
    WG把图中红圈标示的那个分支点分立出来,当作一个可以控制的元素Virtual Pin,这个元素可以移动、定位;一个Y型分支的拓扑结构就拆分成了各个元件到这个Virtual Pin连接的结构。刚才我们看到的“VP_T_1_1_1181”就是Virtual Pin,它在PCB设计的时候是这样显示的:
     
     
     
    Protel / DXP、PADS是没有这种功能的,PADS只能通过Matchlength Pin Pair来实现类似的功能,但对于SDRAM不太适用。不仅WG,强大Alergo也有这个功能。说了这么多,Virtual Pin的作用其实就一句话,用来做Y型分支的两个分支等长——因为没有Virtual Pin,去哪里设置等长规则,怎么检验等长的情况?
    接下来设定PCB层叠,不指定PCB的层叠,前仿真中的阻抗参数的计算是根本没有意义的。选择CES工具栏上的Stackup Editor
     
     
     
    出现下面的窗口,这个东西比较傻瓜式了,我就不做保姆式指导了。需要指定的东西有,PCB每一层的铜厚,相临两层之间的绝缘层厚度和介电常数,参考面(电源层、地层)是哪几层等。PCB的厚度和介电常数等参数需要向PCB厂家索取,参考面的位置可以Google下,看看大多数人用的层叠方法。
     
     
     
    有了以上的工作,前仿真就可以进行了,右键选择需要仿真的网络,例如SDCK,在弹出菜单中选择“Display Net in”——〉“ICX Pro Explorer”
     
     
     
    出现以下窗口
     
     
     
    这就是我们进行前仿的软件了。可以看到,在中间的黑色背景区域是器件管脚、传输路径以及其他器件(如阻抗匹配电阻)的连接拓扑结构——这也就是我们刚才设定的那些东西。图中绿色那些短棒就是传输路径,双击它可以修改长度;这个长度应由PCB布局决定。在CES中选择菜单“Data”——〉“Actuals”——〉“Upadate All”命令将PCB的数据导入CES之后
     
     
     
    在Nets的列表里可以看到Manhattan Length这一项的数值出现了
     
     
     
    这个数值的含义是布局完成之后目前PCB上这一网络所有飞线(用直线连接管脚的线)长度之和。一般来说把这个数值乘以1~2之间的一个数,就是最后的布线长度。你可以把这些数值输入到ICX Pro Explorer中去。对于含有拓扑结构的网络,应当把拓扑结构的每一段都输入到相应的传输线上去。你可以在PCB上试着移动Y型分支点即Virtual Pin的位置,然后更新Manhattan Length,看看是先分支的拓扑结构前仿的效果好,还是后分支的。
    ICX Pro Explorer也是一个比较傻瓜式的软件,用一用很快就会了,我就不介绍了,给大家看个仿真结果
     
     
     
    这是AT91SAM9263和K4S561632K-UC75组成的存储器系统,阻抗匹配电阻为22欧,SDRAM时钟在133MHz下的仿真波形。
    • WG中怎么设置SDRAM的线长匹配规则
    这是一个非常麻烦的部分,我研究了很久,转载请注明来自EE小站。在介绍规则设置之前,先介绍下SDRAM线长匹配的原则。
    一般来说,SDRAM的地址线是这样的拓扑结构
     
     
     
    SDRAM的控制线是这样的拓扑结构
     
     
     
    不同地址线之间,需要保证单路分支的长度匹配,即AB+BC或AB+BD相等;同时,需要保证同一地址线的两个分支相等,即BC=BD。不同控制线之间,需要保证单路分支的长度匹配,即ab+cd+de或ab+cd+df相等;同时,需要保证同一控制线的两个分支相等,即de=df。在控制线和地址线之间,同样需要保证单路分的支长度匹配,即AB+BC=ab+cd+de或AB+BC=ab+cd+df或AB+BD=ab+cd+de或AB+BD=ab+cd+df。

    而软件统计的结果,地址线的长度为AB+BC+BD+D’E;控制线的长度为ab+cd+de+df。统计的内容都不一样,怎么做匹配呢?有2种方法,使用公式、使用Pin pair。使用公式的好处是无论有没有阻抗匹配电阻,都可以很清晰的看到线长匹配的误差,这对手工布线非常有帮助,但是过程极其繁琐。使用Pin Pair的好处是很简单,不用输入很长的公式,但是对于有阻抗匹配电阻的信号,不能看到匹配误差,需要自己计算。

    先说公式方法
     
    记住,软件统计的是所有线段长度之和;我们需要控制的仅仅是所有地址线的AB+BC、所有控制线的ab+cd+de这些长度都相等(BC=BD、de=df这两个条件在设定Y型分支拓扑结构之后,布线器会自动地做到,于是将上面的那些表达式简化成等价的AB+BC和ab+cd+de这两个)。因为SDRAM的时钟是最重要的信号,选择时钟线的长度作为参考,时钟线的单路分支长度为ab[时钟]+cd[时钟]+de[时钟](Blog没有办法表示下标,用[]来修饰)。则对于其他信号,如地址线,理论上约束的内容应该是AB[地址]+BC[地址] = ab[时钟]+cd[时钟]+de[时钟]。软件统计的是所有线段长度之和,对于某一地址线,其长度应该是AB[地址]+BC[地址]+BD[地址]+D’E[地址]。因此,公式约束的内容就变为 AB[地址]+BC[地址] = ab[时钟]+cd[时钟]+de[时钟]+ BD[地址]+D’E[地址]。

    很复杂,来看个例子,对于一个含有匹配电阻的时钟信号,EBI0_SDCK,其拓扑结构如下所示
     
     
     
    其中VP_T_3_5_1336为Virtual Pin。它的单路分支长度按WG CES的语法,应写成\D1\-\C5\@\RM2\-\7\ + \RM2\-\2\@\VP_T_3_5_1336\-\VP_T_3_5_1336\ + \RM2\-\2\@\D19\-\38\,当然最后一项是\RM2\-\2\@\D20\-\38\也可以。
    确定了时钟的长度,接下来用它来约束其他地址线、控制线的长度。以EBI0_A3为例,其拓扑结构如下所示
     
     
     
    由于软件统计EBI0_A3的长度为上面4个Pin Pair线段长度之和,因此在EBI0_A3单段分支的基础上(这段长度和EBI0_SDCK的单段分支长度相等),需要加上\D19\-\24\@\D21\-\25\ + \D1\-\C9\@\D20\-\24\这段长度,当然第二项是\D1\-\C9\@\D19\-\24\也可以。所以限制EBI0_A3的长度为,\D1\-\C5\@\RM2\-\7\ + \RM2\-\2\@\VP_T_3_5_1336\-\VP_T_3_5_1336\ + \RM2\-\2\@\D19\-\38\ + \D19\-\24\@\D21\- \25\ + \D1\-\C9\@\D20\-\24\ +/-200th,当然倒数第二项是\D1\-\C9\@\D19\-\24\也可以,最后的+/-200th是控制的误差长度。然后把这个公式填到EBI0_A3后面的Formula中去。
     
     
     
    对于有阻抗匹配电阻的信号,如nEBI0_CAS
     
     
     
    由于软件统计nEBI0_CAS的长度为上面4个Pin Pair线段长度之和,因此在nEBI0_CAS^^^单段分支的基础上(这段长度和EBI0_SDCK的单段分支长度相等),需要加上\RM1\-\3\@\D20\-\17\或\RM1\-\3\@\D19\-\17\的长度。所以限制nEBI0_CAS的长度为,\D1\-\C5\@\RM2\-\7\ + \RM2\-\2\@\VP_T_3_5_1336\-\VP_T_3_5_1336\ + \RM2\-\2\@\D19\-\38\ + \RM1\-\3\@\D19\-\17\ +/-200th,当然倒数第二项是\RM1\-\3\@\D20\-\17\也可以,最后的+/-200th是控制的误差长度。
    按照上面的步骤把所有SDRAM信号线都操作一遍,是不是会崩溃?
     
    下面介绍用Pin Pair的方法
     
    给地址线、控制线建立这样的Pin Pair,例子如下:
    EBI0_SDCK^^^信号
     
     
     
    EBI0_A3信号
     
     
     
    这和之前的Pin Pair不同,这些Pin Pair是手工生成的,也就是说,在制定这些信号的拓扑结构的时候,不选择“Automatically create pin pairs from from-tos”复选框。然后,选中这一信号,通过菜单Edit>Pin Pair>Add Pin Pairs来手工添加,如下面两张图片所示。
     
     
     
     
     
    这样,只需要关心信号最开始是从哪个芯片的哪个管脚出来的,最后到哪个芯片的哪个管脚里去,有多少个单路分支,添加多少个Pin Pair,中间的阻抗匹配电阻、Virtual Pin全部可以忽略;最后再在Pin Pair的Match列用同一名字约束就可以了,如下所示
     
     
     
    控制信号也一样
     
     
     
    需要说明的是,上面这张图头三个Pin Pair是用来方便手工布线的。因为Pin Pair如果穿越了器件(对于信号路径穿越阻抗匹配电阻这种情况而言),Pin Pair的长度在CES里是显示不出来的——至少目前我还没有找到什么办法可以让它显示出来——这对手工布线来说非常不方便;但是自动布线却没有任何问题,Expedition可以正常的完成Tune(自动长度调整)操作。

    也许你有些疑惑,既然Pin Pair这么定义了,怎样才能看到自定义拓扑结构呢?把菜单中Filters>Levels>FromTos选项钩起来,就可以看见了,如下图所示。需要说明的是,Pin Pair仅仅是一种虚拟的连接关系,拓扑结构是用FromTos这种物理连接关系确定的。
     
     
     转载请注明来自EE小站,以方便后人查询。至于其他的布局、布线这些简单的东西就没有什么好说的了。就写到这里。
    April 16

    忙忙忙!

    最近很忙,时间都用来放松了,基本没有什么研究的兴趣。
    现在还在用ARM9设计东西,不过和过去相比设计考虑的东西多了很多,除了芯片功能,还必须考虑成本、供货、兼容产品、公司库存……另外我觉得自己开始钻牛角尖了,例如说考虑245缓冲在不上电或上电、掉电瞬间的方向;开始做一些变态的事情,比如用MOSFET搭门电路,哈哈。
    最近公司开始用WG来画板,唉,Mentor Graphic的产品,除了Modelsim能让我感觉好些,PADS和WG都让我感觉原来Altium designer是这么好用啊。WG的原理图编辑器DXDesigner基本上每一个功能都有BUG,实在数不胜数,甚至他们连Horizontal和Vertical这2个词的意思都分不清,菜单里水平镜像和垂直镜像的选项需要对调一下——我真怀疑这是印度人写的软件。DXDesigner画图大部分的时间我都在调整线和字体;动不动就莫名奇妙的崩溃,今天我就遇到了一条线可以选中却怎么也不能移动、删不掉的BUG;我搞工程这么多年了,刚开始的时候搞机械,AutoCAD、Solidworks、Pro/E,后来搞电子EWB、Protel99、Orcad、Quartus、DXP,平时用Visio,这么多能画图的软件,从来没有见过能有线条删不掉的情况……我奉劝想要使用Mentor产品的人一定要三思啊。
    现在觉得ARM没有什么意思了,呵呵,下一个我要挑战的东东是PowerPC。但是PowerPC的开发成本太高了,等手头的事情忙完了,我会寻找一条类似Wiggler+HJTAG的道路。
    我的http://cosine.oicp.net因为家里忘缴电费被掐电而非法关机半个月了吐舌,最近没有什么心情,过几天再把它恢复出来。
    就写这么多。
    March 15

    终于小窥了OpenGL的门径。

    大约半年前,我写了篇文章,介绍了如何在ARM Linux上使用OpenGL|ES软件包。但是运行的速度实在是太慢了。在ARM上流畅运行OpenGL一直是令我耿耿于怀的一个怨念。最近一段时间研究了下OpenGL,在别人代码的基础上(Mesa,TinyGL),写出了一个可以裸机运行的超精简OpenGL软件包,总共代码只有1600行。运行在具有2D图形加速功能的SOC处理器上,可以获得很不错的效果。但是这不是我最终的目的,我想要把这个软件包中的大多数功能改写成VHDL,实现硬件3D加速。当然,这个软件包的功能是为我从事的行业专门设计的,用于消费电子基本是不可能的。贴上一张图片,给大家看看。
     
     
    这个东西对我来说太有用了,更多的信息不能公开,抱歉了。如果你想进行这方面的研究,我可以给点资料提示,第一就是上面图片里这本书,俗称“OpenGL红宝书”;第二是随便什么讲计算机图形方面的书,只要涉及到画线、多边形填充算法,2维和3维投影变换,光源计算等,就可以。
    February 23

    在ARM Linux上使用Apache+PHP

    我相信这篇文章同样是国内很难搜到的一个HOWTO(呵呵,截至到我写出来之前),我的最初目的是在ARM上使用PHP,尝试了Busybox的httpd,以及boa都没有办法很方便的和PHP接口,因此我狠下心来,编译了Apache。在ARM上使用PHP,好处仅仅是脚本比cgi好写一些,付出的代价是速度和蜗牛一样慢,不要指望很多人同时访问可以响应得过来。
    另外说件事,BLOG上的文章多了,经常发现有人转载,但是有的人却不注出处……难道要我吧我的名字和邮件地址写到文章的每一个部分吗?也许国人就是这样缺乏某种精神,在我看到的转载我文章的BLOG中,基本都是网上各种ARM Linux文章的集合,不可否认他们搜集的很好,但是看了这么多文章,连一点心得体会都没有么,写点原创的东西就这么难么?不管怎样,我还是坚持EE小站的风格——原创性。下面开始正题,本文分为三大部分,apache、php和配置。
     
    • 编译apache

    下载apache 1.3.39(1.3.41有些bug,没有办法交叉编译)
    下载地址http://apache.mirror.phpchina.com/httpd/apache_1.3.39.tar.bz2

     
    交叉编译apache总体上需要两个步骤:
    1.编译本机代码
    2.利用本机代码进行交叉编译
     
    这是因为编译apache时,需要使用编译生成的工具制作后续编译使用的头文件,交叉编译的工具当然没有办法在PC上运行,因此,需要借用本机编译生成的工具。假设为本机编译的apache代码已经解压缩到/home/lxz/apache-1.3.39-i586,为ARM编译的apache代码已经解压缩到/home/lxz/apache-1.3.39,交叉编译器arm-linux-gcc已设缺省路径,具体步骤还是用命令来说明:
     
    # cd /home/lxz/apache-1.3.39-i586
    # ./configure
     
    因为仅仅是借用下本机代码,所以不用设置配置参数,然后编译
     
    # make
     
    等编译完成后,就可以配置交叉编译的apache了。apache的安装位置为/usr/local/apache
     
    # cd /home/lxz/apache-1.3.39
    # CC=arm-linux-gcc ./configure --prefix=/usr/local/apache
     
    会出来这样的提示,因为交叉编译的生成的testfunc这个工具不能在PC上执行,但可以不理会它
    ./helpers/TestCompile: line 294: /home/lxz/apache-1.3.39/src/helpers/testfunc: cannot execute binary file
    打开/home/lxz/apache-1.3.39/src/main/Makefile这个文件,找到这两段代码
    uri_delims.h: gen_uri_delims
     ./gen_uri_delims >uri_delims.h
    test_char.h: gen_test_char
     ./gen_test_char >test_char.h
    修改为
    uri_delims.h: gen_uri_delims
     /home/lxz/apache-1.3.39-i586/src/main/gen_uri_delims >uri_delims.h
    test_char.h: gen_test_char
     /home/lxz/apache-1.3.39-i586/src/main/gen_test_char >test_char.h
    这里借用了刚才编译生成的本机代码里的工具,然后
     
    # make
     
    这就编译好了,下面是安装。由于配置apache的时候“prefix”参数指定的安装位置是/usr/local/apache,在PC上,访问/usr/local是需要有root权限的,需要切换到root用户来进行安装。不建议将apache安装到一个随意的目录然后拷贝,因为这样会造成apache中的脚本调用位置的错误。当然,如果想要将apache安装到一个PC和ARM Linux都能访问的固定位置,如/home/lxz/apache也可以。
    如果你不明白上面这段话在说什么,那么请按照下面的步骤进行操作。请确认你的PC Linux上的/usr/local/apache这个目录不存在PC上使用的apache,否则下面的步骤会使你PC Linux上的apache不可用。
     
    # su root
     
    输入密码
     
    # cd /home/lxz/apache-1.3.39/
    # make install
    # exit
     
    别忘了用exit退出root用户模式,这样,apache的文件就被安装到PC上的/usr/local/apache了。接下来所要做的是将apache拷贝到ARM Linux根文件系统,假设ARM Linux根文件系统在PC上的位置为/home/lxz/root,其中已经有/usr/local这个目录
     
    # cp -r /usr/local/apache /home/lxz/root/usr/local
     
    如果是一路看着我的BLOG建立起根文件系统的,接下来还必须建立nobody用户和nogroup组,因为apache拒绝使用root用户运行。具体来说就是在ARM Linux根文件系统上建立/etc/passwd和/etc/group两个文件,怎么写这两个文件,可以google下。它们的内容可以如下:
     
    /etc/passwd
    root::0:0:root:/:/bin/ash
    nobody::65534:65533:nobody:/:/bin/ash
    /etc/group
    nobody::65533:
    nogroup::65534:nobody
    root::0:
    users::100:
    当然,如果你的ARM Linux根文件系统中有这两个文件,那么你需要检查一下是不是有nobody用户和nogroup组。接下来,可以制作文件系统映像并测试apache是否可以正常工作了,还是用命令来说明。
     
    # mkfs.cramfs /home/lxz/root /home/lxz/root.img
     
    我一直用cramfs,SUSE 10.2自己就带了mkfs.cramfs这个工具。烧写或者加载文件系统映像的步骤我就不说了,需要注意的是如果你使用了不可写的文件系统,如cramfs,需要把apache的日志路径挂载为临时文件目录,下面这几条命令在ARM Linux上执行。
     
    # mount -t tmpfs tmpfs /usr/local/apache/log
     
    然后就可以启动apache了
     
    # cd /usr/local/apache/bin
    # ./apachectl start
     
    假设ARM板的ip地址是192.168.5.118,在浏览器里输入http://192.168.5.118:8080访问ARM板(不修改默认配置,服务端口是8080)。apache的配置一会儿编译了php再说。

    • 编译php

    首先下载php-4.4.8,下载地址:http://cn2.php.net/get/php-4.4.8.tar.bz2/from/this/mirror

    交叉编译php同样需要两个步骤:
    1.编译本机代码
    2.利用本机代码进行交叉编译
     
    原因我就不重复了,假设为本机编译的php代码已经解压缩到/home/lxz/php-4.4.8-i586,为ARM编译的php代码已经解压缩到/home/lxz/php-4.4.8,交叉编译器arm-linux-gcc已设缺省路径,具体步骤还是用命令来说明:
     
    # cd /home/lxz/php-4.4.8-i586
    # ./configure
    # make
     
    在编译的同时,可以打开/home/lxz/php-4.4.8/configure这个文件,搜索“can not run test program while cross compiling”,会搜索到很多个这样的结果:
    { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
    把它们都改为
    { echo "configure: error: can not run test program while cross compiling" 1>&2; }
    这样做的目的是直接无视交叉编译测试程序错误。另外,我使用的是arm-linux-gcc 3.4.1版,和代码不太兼容。找到/home/lxz/php-4.4.8/Zend/zend_strtod.c的第238行
    #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + \
        defined(IBM) != 1
    Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
    IBM should be defined.
    #endif
    把这段改为
    #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + \
        defined(IBM) != 1
    //Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
    //IBM should be defined.
    #endif
    在本机php编译完后,输入如下命令
     
    # cd /home/lxz/php-4.4.8
    # CC=arm-linux-gcc ./configure --prefix=/usr/local/php --host=i586-suse-linux --target=arm-linux
     
    别以为可以编译了,还有东西要修改,真汗啊……打开/home/lxz/php-4.4.8/Makefile,找到这段
    install-pear-packages: $(top_builddir)/sapi/cli/php
     @$(top_builddir)/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
    用上我们刚才编译的本机php里的文件,把它改成
    install-pear-packages: /home/lxz/php-4.4.8-i586/sapi/cli/php
     @/home/lxz/php-4.4.8-i586/sapi/cli/php $(PEAR_INSTALL_FLAGS) /home/lxz/php-4.4.8/pear/install-pear.php -d "$(peardir)" -b "$(bindir)" /home/lxz/php-4.4.8/pear/packages/*.tar
    终于可以编译了
     
    # make
     
    随后和apache一样,需要切换用户,把php的文件安装到/usr/local/php
     
    # su
     
    输入密码
     
    # cd /home/lxz/php-4.4.8
    # make install
    # exit
     
    这样,php就编译完成了。
     
    • 配置Apache和PHP
    接下来就需要修改配置文件,让apache和php能够链接起来工作。这个配置过程和Windows下使用apache+php的过程类似,因为我不是把apache和php一起编译的,只是让apache认识“.php”这个扩展名,然后调用php。为了方便,直接给出apache的配置文件,配置文件的位置在ARM Linux文件系统的/usr/local/apache/conf/httpd.conf,其中红色字是在默认配置文件基础上修改或添加的内容。
    ServerType standalone
    ServerRoot "/usr/local/apache"
    PidFile /usr/local/apache/logs/httpd.pid
    ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
    Timeout 300
    KeepAlive On
    MaxKeepAliveRequests 100
    KeepAliveTimeout 15
    MinSpareServers 5
    MaxSpareServers 10
    StartServers 5
    MaxClients 150
    MaxRequestsPerChild 0
    Port 80
    User nobody
    Group nobody
    ServerAdmin cosine@126.com
    DocumentRoot "/home/webroot"
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory "/home/webroot">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    <IfModule mod_userdir.c>
        UserDir public_html
    </IfModule>
    <IfModule mod_dir.c>
        DirectoryIndex index.html
        DirectoryIndex index.php
        DirectoryIndex index.php3
        DirectoryIndex index.phtml

    </IfModule>
    AccessFileName .htaccess
    <Files ~ "^\.ht">
        Order allow,deny
        Deny from all
        Satisfy All
    </Files>
    UseCanonicalName On
    <IfModule mod_mime.c>
        TypesConfig /usr/local/apache/conf/mime.types
    </IfModule>
    DefaultType text/plain
    <IfModule mod_mime_magic.c>
        MIMEMagicFile /usr/local/apache/conf/magic
    </IfModule>
    HostnameLookups Off
    ErrorLog /usr/local/apache/logs/error_log
    LogLevel warn
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    CustomLog /usr/local/apache/logs/access_log common
    ServerSignature On
    <IfModule mod_alias.c>
        Alias /icons/ "/usr/local/apache/icons/"
        <Directory "/usr/local/apache/icons">
            Options Indexes MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
        Alias /manual/ "/usr/local/apache/htdocs/manual/"
        <Directory "/usr/local/apache/htdocs/manual">
            Options Indexes FollowSymlinks MultiViews
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
        ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
        ScriptAlias /php4/ "/usr/local/php/bin/"
        # 注意 "/usr/local/php/bin/" 中最后一个"/"不可少
        <Directory "/usr/local/apache/cgi-bin">
            AllowOverride None
            Options None
            Order allow,deny
            Allow from all
        </Directory>
    </IfModule>
    <IfModule mod_autoindex.c>
        IndexOptions FancyIndexing
        AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
        AddIconByType (TXT,/icons/text.gif) text/*
        AddIconByType (IMG,/icons/image2.gif) image/*
        AddIconByType (SND,/icons/sound2.gif) audio/*
        AddIconByType (VID,/icons/movie.gif) video/*
        AddIcon /icons/binary.gif .bin .exe
        AddIcon /icons/binhex.gif .hqx
        AddIcon /icons/tar.gif .tar
        AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
        AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
        AddIcon /icons/a.gif .ps .ai .eps
        AddIcon /icons/layout.gif .html .shtml .htm .pdf
        AddIcon /icons/text.gif .txt
        AddIcon /icons/c.gif .c
        AddIcon /icons/p.gif .pl .py
        AddIcon /icons/f.gif .for
        AddIcon /icons/dvi.gif .dvi
        AddIcon /icons/uuencoded.gif .uu
        AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
        AddIcon /icons/tex.gif .tex
        AddIcon /icons/bomb.gif core
        AddIcon /icons/back.gif ..
        AddIcon /icons/hand.right.gif README
        AddIcon /icons/folder.gif ^^DIRECTORY^^
        AddIcon /icons/blank.gif ^^BLANKICON^^
        DefaultIcon /icons/unknown.gif
        ReadmeName README.html
        HeaderName HEADER.html
        IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
    </IfModule>
    <IfModule mod_mime.c>
        AddLanguage da .dk
        AddLanguage nl .nl
        AddLanguage en .en
        AddLanguage et .ee
        AddLanguage fr .fr
        AddLanguage de .de
        AddLanguage el .el
        AddLanguage he .he
        AddCharset ISO-8859-8 .iso8859-8
        AddLanguage it .it
        AddLanguage ja .ja
        AddCharset ISO-2022-JP .jis
        AddLanguage kr .kr
        AddCharset ISO-2022-KR .iso-kr
        AddLanguage nn .nn
        AddLanguage no .no
        AddLanguage pl .po
        AddCharset ISO-8859-2 .iso-pl
        AddLanguage pt .pt
        AddLanguage pt-br .pt-br
        AddLanguage ltz .lu
        AddLanguage ca .ca
        AddLanguage es .es
        AddLanguage sv .sv
        AddLanguage cs .cz .cs
        AddLanguage ru .ru
        AddLanguage zh-TW .zh-tw
        AddCharset Big5         .Big5    .big5
        AddCharset WINDOWS-1251 .cp-1251
        AddCharset CP866        .cp866
        AddCharset ISO-8859-5   .iso-ru
        AddCharset KOI8-R       .koi8-r
        AddCharset UCS-2        .ucs2
        AddCharset UCS-4        .ucs4
        AddCharset UTF-8        .utf8
        <IfModule mod_negotiation.c>
            LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
        </IfModule>
        AddType application/x-tar .tgz
        AddType application/x-httpd-php .php3
        AddType application/x-httpd-php .php
        AddType application/x-httpd-php .phtml

        AddEncoding x-compress .Z
        AddEncoding x-gzip .gz .tgz
    </IfModule>
    Action application/x-httpd-php "/php4/php"
    <IfModule mod_setenvif.c>
        BrowserMatch "Mozilla/2" nokeepalive
        BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
        BrowserMatch "RealPlayer 4\.0" force-response-1.0
        BrowserMatch "Java/1\.0" force-response-1.0
        BrowserMatch "JDK/1\.0" force-response-1.0
    </IfModule>
    php也有配置文件,但是修改起来比较简单,只需要把/home/lxz/php-4.4.8/php.ini-dist复制到ARM Linux文件系统的/usr/local/php/lib,并改名为php.ini,找到
    register_globals = Off
    修改为
    register_globals = On
    保存就可以了。
    如果你觉得上面的一切都很麻烦,可以在EE小站的SkyDrive下载我制作好的压缩包,地址http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/EE%e5%b0%8f%e7%ab%99%e7%90%90%e7%a2%8e%e6%96%87%e4%bb%b6/armv4-apache-php.tar.bz2,解压缩到ARM Linux根文件系统的/。这个压缩包包含apache 1.3.39和php 4.4.8,默认的网页服务器根目录为/home/webroot,默认监听端口为80。
    另外,我在资料站上开了个wiki来测试ARM Linux上Apache+PHP的组合,地址http://cosine.oicp.net/dokuwiki/。测试的时间不会很长,但我会保证这个链接在2008年4月1号前有效。(2009年2月21日追加:这个地址已经失效快一年了微笑
    February 03

    半个猪年总结

    07年7月十多号来到北京,转眼半年了。今天公司放假了,写半个猪年的总结。
    首先介绍下我干活的公司,中国本土数控行业第二,当然和Fanuc、Siemens没法比,呵呵;我们以中低端产品为主打。刚才说的是销量,我觉得技术水平我们绝对国内第一;我拆解过主要竞争对手的产品,发现他们用的CPU已经停产了,但那可是他们的高端主打产品……我们公司研发的力量还是很雄厚的,这也头儿们的领导风格决定的。头儿们都是做技术出身,行为做事都很低调,在中国现在的拜金气氛下,这样不浮躁的头真的不多。但是中国市场是复杂的,技术好不能保证最好的销量,但是可以保证企业的长久生存。哈哈,扯远了,我这样的小兵,还是专心做好自己的事情先。
    反正这半年混的还凑合,不过把自己热爱的事业作为职业,业余时间也没有什么追求了,关心技术内容的人一定发现技术文章次了些,哈哈。其实我也不能多写了,现在签了卖身契,开源就等于自杀——如果要我付保密违约金,那干脆就杀了我吧。怪不得国内有些Linux大牛的文章都太监了,估计也是不想和钱过不去吧……现在有空我就游戏,我的QQ牌升级已经从来北京的时候的300分小房车变成现在600多分的小坦克了,最近打腻了,开始捡起研究生时候练的WOW小牧师,也许我该开个类别介绍我的游戏经验了。也许我有些宅,但是在北京这种地方,我也就能在看丹桥的冠京隆市场撑回款爷,出门玩,那就是大把大把的RMB啊。现在住的是公司的房子,要想买房,以我和GF的工资加起来,除去花销,一年也就能买四环外半个厕所。
    不知不觉在北方已经生活了6年半了,我觉得自己从口音、思维习惯到饮食口味已经都没有福州人的风格了,唯一剩下的是一张福州人脸,到哪儿人都一下认出我是南方人……我现在特别羡慕有口音的人,那说话多有味道啊。哦,其实我也有口音,说福州话有东北口音尴尬
    好了,废话说完放一些图片,先是我们公司前台,刚搬新楼,装修不错,关键是前台MM好漂亮,真是我情窦初开以来遇到的最漂亮的MM,每天我都要多看几眼,哈哈。更加幸运的是,这张照片里MM走光了。
     
     
     
    第一张图是我的猪窝办公桌,呵呵,我的口号是,做硬件的就得要有做硬件的样子。接下来的是我在学校的桌子,相比之下现在的我还是整洁许多的。
     
     
     
     
     
    我们公司的产品,这台是目前已经上市的产品里第二高端的,4轴系统;第一高端的是8轴的,我还没有见过实物。业内人士一定知道我在哪里工作了,刚才还有一点忘了说了,我觉得我们公司产品的外形是国内最酷的,这是唯一和Fanuc、Siemens不相上下的地方,哈哈。这台是我们用来调试的,面板有些旧。
     
     
     
    园区夜景,拍的时候没有发现那根电线,真烦人……手持相机,无三脚架,快门时间2秒,能拍出这样的效果我是不是很牛X?估计是焊接0603练出来的,哈哈。
     
     
     
    January 21

    AT91SAM9263内部ROM时钟初始化代码反汇编

    AT91SAM9263是个不错的CPU,我这段时间在上面跑起了U-Boot、Linux。过程就没有什么好写的了,都一样,就是U-Boot的移植有些麻烦,但我的设计的板子和9263ek相差太大,写出来没有什么参考价值,就都不写了。我拿到的CPU样品是Rev A的,而现在的手册是Rev B的,需要注意的是Rev A不支持NAND和SD卡启动。为了从NAND启动,需要自己写启动代码了。我的板子上有EPROM,并且把它放在nCS0上,我移植了AT的Bootstrap到ADS下面,然后做添加了上电初始化代码。但是我修改过的代码不能公开,抱歉了。刚开始我修改的代码总是Boot不成功,似乎时钟不稳定,也没有好的样例,无奈之下,我只好把AT的Boot ROM关于时钟部分给反汇编了,照着反汇编的结果写了一个,好使了。这个代码在0x400000能看到,我应该不算破解吧,写出来给其他写启动代码的人一些参考。

     

    行标号        原始指令                           更易阅读的指令         注释

    ---------------+---------------------------------------+-------------------------+----------

                    b        0x20                           b reset                   ; 复位向量

                    b        0x4

                    b        0x124

                    b        0xc

                    b        0x10

                    b        0x14

                    b        0x18

                    b        0x1c

    reset           mov      r13,#0x314000                  mov sp, #0x31400          ; 初始化堆栈

                    ldr      r1,0x00000160 ; = #0xfffffc00  ldr r1, =AT91C_BASE_PMC

                    mov      r0,#2                          mov r0, #OCSBYPASS

                    str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]    ; 设置主振荡器为旁路模式

                    mov      r4,#0x10000                    mov r4, #MAINRDY

                    mov      r0,#0x20                       mov r0, #TIMEOUT          ; 设置超时时间(注意:现在运行于慢时钟)

    loop1           ldr      r3,[r1,#0x24]                  ldr r3, [r1, #PMC_MCFR]

                    and      r3,r4,r3

                    cmp      r3,#0x10000

                    beq      0x50                           beq exclkdetected        ; 查看PMC_MCFR,外部时钟输入是否稳定

                    subs     r0,r0,#1

                    bne      0x38                           bne loop1

    exclkdetected  ldr      r4,0x00000164 ; = #0x0000ffff  ldr r4, #MANIFMASK

                    ldr      r3,[r1,#0x24]                  ldr r3, [r1, #PMC_MCFR]   ; 读出外部时钟频率

                    and      r3,r4,r3

                    cmp      r3,#0x10

                    bgt      0x8c                           bgt clkdetected           ; 如果外部时钟频率小于32.768KHz,则

                    mov      r0,#0                          mov r0, #MORCLEAR         ; 复位主时钟控制器

                    str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]

                    ldr      r1,0x00000160 ; = #0xfffffc00

                    ldr      r0,0x00000168 ; = #0x00004001

                    str      r0,[r1,#0x20]                  str r0, [r1, #PMC_MOR]    ; 设置主时钟振荡器使能

                    mov      r4,#1                          mov r4, #MOSCS

    loop2           ldr      r3,[r1,#0x68]                  ldr r3, [r1, #PMC_SR]     ; 读取PMC状态

                    and      r3,r4,r3

                    cmp      r3,#1

                    bne      0x7c                           bne loop2                 ; 循环等待主时钟振荡器稳定

    clkdetected     mov      r0,#1                          mov r0, #AT91C_PMC_CSS_MAIN_CLK

                    str      r0,[r1,#0x30]                  str r0, [r1, #PMC_MCKR]   ; 切换芯片时钟到主时钟

                    mov      r4,#8                          mov r4, #MCKRDY

    loop3           ldr      r3,[r1,#0x68]                  ldr r3, [r1, #PMC_SR]     ; 读取PMC状态

                    and      r3,r4,r3

                    cmp      r3,#8

                    bne      0x98                           bne loop3                 ; 等待芯片时钟稳定

                    add      r2,pc,#0x2c ; #0xdc                                      ; 开始别的代码

                    ldmia    r2,{r0,r1,r3,r4}

                    ……

    BGA封装手工焊接攻略改进版

    又是好长时间没有更新了,最近工作的事情比较忙,也比较挫折。最近的那块板子出现了多年以来没有的第一次制板就因严重设计错误嗝屁的现象……
    后来经过痛苦的BGA飞线,终于好使了;随后也发现其他部分没有任何错误,唉……
    看看我飞的板子,我的口号是,没有不能飞线的板子和器件,呵呵。
     
     
     
    飞线的过程中,我发现,之前焊接BGA的方法对于较大较厚的电路板是不行的。因为电路板背面一般有较大面积的铺铜,散热很快,导致板子上下受热不均而翘曲。我焊的第一块板子就因为这个,BGA下的过孔断了,废掉了。经过冥思苦想和长时间的搜索,对之前的焊接方法进行一些修改,电路板底面加热不使用风机,而用加热面积较大的预热台。而价格为广大劳苦EE工程师们可以接受的预热台,好像也只有傲月的853A,只要500大洋。下面是853A的图片,这个东东在中发都不太好买到,估计国内的二线城市就有些困难了。
     
     
     
    这个东东中间那个网里面是加热盘,两边是两条滑轨,上面有两个用于固定电路板的滑块。把要焊接的电路板放上去,关于芯片的对正什么的还是一样,一般常用的BGA都有0.8mm以上的球间距,而且锡球溶化以后有表面张力,只要大致放上,锡球溶化就能自动拉正芯片。助焊剂什么的和过去一样,我就不说了。看下面这张图。
     
     
     
    电路板放在预热台发热盘正上方,尽量让有BGA的区域在发热盘的中心,然后打开预热台电源,我开的温度是300度,等上一会儿,用红外测温仪测量电路板温度,等温度到150度左右,打开风机,温度设定到300度左右,吹个1、2分钟就差不多了。如果不放心,可以参照我过去的方法,用摄像头来看。红外测温仪看下面这张图。
     
     
     
    这个东西是东莞造的三无产品,220大洋就能买下,不过个体差异非常大,我买的时候用我太阳穴的35.x度的标准温度对比了好几个才挑出个准的……
    这篇就到这里。
    December 21

    ARM Linux根文件系统(Root Filesystem)的制作

    关于根文件系统的制作,网络上有很多文章,大多数都只讲到建几个目录,然后用Busybox做个Shell,有很多关键的东西没有说。经过很长时间的摸爬滚打,我终于能够白手起家建立一个根文件系统了。其实我也不懂得原理,只是告诉大家我的作法,其中也不免有错误,欢迎大家指正。
    2009年2月21日追加:这篇文章已经被无数的人转载,在Google和百度上搜文章标题,出来的已经不是EE小站的文章了。今天修改了其中的两个连接,估计已经转载的就没法修改了,所以请转载时注明来自EE小站,谢谢。
     
    首先介绍根文件系统的组成:目录、Shell、库、脚本,一个个来。
     
    • 目录
    根文件系统要包含这些必须有的目录:/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys
     
    /dev是devfs(设备文件系统)或者udev的挂在点所在。在使用devfs的内核里如果没有/dev,根本见不到Shell启动的信息,因为内核找不到/dev/console;在使用udev的系统里,也事先需要在/dev下建立console和null这两个节点。关于devfs和udev的区别,网上很多文章说。当然如果你的内核已经不支持devfs了(2.6.12以后),可以使用纯纯的静态节点。也就是用mknod人工生成。
     
    /bin、/usr/bin、/usr/sbin、/sbin是编译Busybox这个Shell时候就有的,用于存放二进制可执行文件,就不多解释了。
     
    /lib用于存放动态链接库。网上很多文章都说静态编译Busybox,可以省去建库的麻烦过程。这样做只能让Busybox启动,我们自己写的,或者是编译的软件包还是需要动态库的。除非全部静态编译,你可以试试,一个Hello world就要几百k。关于库的内容后面仔细说。
     
    /etc是用来存放初始化脚本和其他配置文件的。关于初始化脚本的内容后面仔细说。
     
    /proc是用来挂载存放系统信息虚拟文件系统——“proc文件系统”,“proc文件系统”在内核里面可以选。如果没有“proc文件系统”,很多Shell自己的命令就没有办法运行,比如ifconfig。“proc文件系统”不像devfs可以自动挂载,它需要使用初始化脚本挂载。另外,udev也需要“proc文件系统”的支持。
     
    /sys用于挂载“sysfs文件系统”,“sysfs文件系统”在内核里面可以选。目前我认为它就是给udev提供支持的,呵呵。“sysfs文件系统”也需要使用初始化脚本挂载。
     
    另外还可以有/tmp、/mnt、/swp、/var这样的不是嵌入式系统必须的目录,在说完Shell的制作之后,我再谈建立目录的事情。
    • Shell
    Shell很简单,就是Busybox,上网下载一个来:http://www.busybox.net/downloads/。说Busybox和arm-linux-gcc有兼容性问题,不过我觉得那是比较低版本的时代问题了,我用Busybox 1.8.2和arm-linux-gcc 3.4.1/3.3.2都可以。解压缩以后找到Makefile里面的ARCH和CROSS_COMPILE,改成:
    ARCH  ?= arm
    CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
    当然CROSS_COMPILE由你自己的编译器位置决定,然后
    # make menuconfig
    # make
    # make install
    注意配置的时候把一些uCLinux Only的东西去掉,不然会错;配置的时候还可以修改安装位置,默认是在Busybox下的“_install”。
    之后就可以在Busybox生成的Shell基础上建立根文件系统了,我就用命令来说吧,Busybox在/home/lxz/busybox,根文件系统在/home/lxz/rootfs
    # mkdir /home/lxz/rootfs
    # cd /home/lxz/busybox/_install
    # cp -r ./ /home/lxz/rootfs
    # cd /home/lxz/rootfs
    # mkdir dev
    # mkdir etc
    # mkdir lib
    # mkdir proc
    # mkdir sys
    # mkdir tmp
    如果不用devfs,下面的命令是必须的。必须以root用户执行(用su命令可以切换为root,切换后用exit命令可以返回普通用户):
    # cd /home/lxz/rootfs/dev
    # mknod -m 660 console c 5 1
    # mknod -m 660 null c 1 3
    如果不使用devfs没有这两个静态节点,console的提示根本就看不到,出现的现象可能是内核提示Free init memory: XXK之后,Warning: Unable to find a initial console之类的,具体的单词记得不是很准确。我没有试过使用udev的时候没有这两个静态节点的情况,反正放了也不影响把/dev挂载为tmpfs。
    如果使用udev,还需要把udevd、udevstart、udevadmin这三个文件放到/sbin里面(我使用udev-117,网上介绍较多的udev-100有9个文件要放)。
    库可是一件非常麻烦的事请。我建议初学者拷贝买的开发板里面带的文件系统的库,如果开发板的文件系统是映像,只需要把映像挂载在某个目录下就可以访问,假设映像叫做rootfs.cramfs,可以这样
    # mkdir /home/lxz/evb_rootfs
    (切换为root用户)
    # mount -o loop rootfs.cramfs /home/lxz/evb_rootfs
    (可以切换为普通用户)
    # cd /home/lxz/evb_rootfs/lib
    # cp -r ./ /home/lxz/rootfs/lib
    一般开发板里都会带有很多库,但是总体积却比较大。可以删掉一些不用的库来减小体积,但是,呵呵,我也不知道那些库具体含有什么函数,什么情况删什么;也许以后我会把这部分补上。如果觉得库体积太大,也可以自己编译glibc或者uclibc,但是这是非常繁琐的事请——目前我认为库应该和编译器arm-linux-gcc一起制作。有个傻瓜式的方案是使用cross-tool,下载地址:http://www.kegel.com/crosstool/。虽然cross-tool是用来制作交叉编译器的,但是其过程中生成的glibc却可以作为副产品为我们所用。cross-tool的使用可以看我之前的这篇文章http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!274.entry。在成功制作了交叉编译器之后,就可以从cross-tool的目录里把glibc取出来,假设cross-tool的路径是/home/lxz/cross-tool,编译出的编译器叫做arm-linux-gnu-gcc,gcc版本3.4.5,glibc版本2.3.6,想要把glibc库拷贝到/home/lxz/glibc,下面的操作还是用命令来说明。
    # cd /home/lxz/cross-tool/build/arm-linux-gnu-gcc/gcc-3.4.5-glibc-2.3.6/build-glibc
    # ../glibc-2.3.6/configure --prefix=/home/lxz/glibc
    # make install
    等候安装结束
    # cd /home/lxz/glibc
    # cp -r lib /home/lxz/rootfs
    这样就把glibc的大部队拷贝好了,但是这样还缺两个库,我们继续
    # cd /home/lxz/cross-tool/build/arm-linux-gnu-gcc/gcc-3.4.5-glibc-2.3.6/build-gcc/gcc
    # cp libgcc_s.so* /home/lxz/rootfs/lib
    还缺少一个libtermcap库,这个就稍微有些麻烦。libtermcap-2.0.8-35-armv4l源码包的下载地址是http://www.netwinder.org/mirror/pub/netwinder/SRPMS/nw/9/libtermcap-2.0.8-35.src.rpm,你也可以在这里http://www.netwinder.org/allsrpms.html找到其他版本的。假设libtermcap-2.0.8-35.src.rpm下载到了/home/lxz/libtermcap,下面继续用命令说明。
    # cd /home/lxz/libtermcap
    # rpm2cpio libtermcap-2.0.8-35.src.rpm | cpio -ivd
    # tar xvjf termcap-2.0.8.tar.bz2
    接下来要打13个补丁,很汗啊,请一定按照下面的顺序来打补丁
    # patch -p0 -i termcap-2.0.8-shared.patch
    # patch -p0 -i termcap-2.0.8-setuid.patch
    # patch -p0 -i termcap-2.0.8-instnoroot.patch
    # patch -p0 -i termcap-2.0.8-compat21.patch
    # patch -p0 -i termcap-2.0.8-xref.patch
    # patch -p0 -i termcap-2.0.8-fix-tc.patch
    # patch -p0 -i termcap-2.0.8-ignore-p.patch
    # patch -p0 -i termcap-buffer.patch
    # patch -p0 -i termcap-2.0.8-bufsize.patch
    # patch -p0 -i termcap-2.0.8-colon.patch
    # patch -p0 -i libtermcap-aaargh.patch
    # patch -p0 -i termcap-2.0.8-glibc22.patch
    # patch -p0 -i libtermcap-2.0.8-ia64.patch
    然后到/home/lxz/libtermcap/termcap-2.0.8里,找到Makefile,修改其中的CC和AR,
    CC = /usr/local/arm/3.4.1/bin/arm-linux-gcc
    AR = /usr/local/arm/3.4.1/bin/arm-linux-ar
    当然,你的编译器在哪里就改成相应的内容。如果嫌麻烦,可以从本站资料页面下载我已经打好补丁,修改好Makefile的包,地址http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/EE%e5%b0%8f%e7%ab%99%e7%90%90%e7%a2%8e%e6%96%87%e4%bb%b6/termcap-2.0.8.tar.bz2。需要注意的是,这个包里CC = arm-linux-gcc、AR = arm-linux-ar,请设置好缺省路径。然后就可以编译了:
    # cd /home/lxz/libtermcap/termcap-2.0.8
    # make
    # ln -s libtermcap.so.2.0.8 libtermcap.so.2
    # cp libtermcap.so* /home/lxz/rootfs/lib
    这样,Shell启动所需要的基本库就都备齐了。但是,这些库里面还含有调试信息,体积稍大,可以把这些信息去掉(当然不去掉也没有什么影响)。
    # cd /home/lxz/rootfs/lib
    # arm-linux-strip *.so*
    至此,库就制作好了。
    • 脚本
    有了以上的东西,Shell还是不能正常工作。可能会是内核提示Free init memory: XXK之后就什么输出也没有了,这时候向终端敲入文字,可以显示;就是没有终端提示符,不理会输入的命令。这是因为初始化脚本没有启动Shell。下面介绍这些脚本。
    首先是/etc/inittab。内核启动、根文件系统挂载之后所必须的一个文件,其中列举了Shell和整个系统初始化、关闭所需的命令。如果你想让Shell出现,那么只需要加入这么一行“::askfirst:/bin/ash”。当然如果在编译Busybox的时候选择的shell不是“ash”,而是hush、lash、msh之类,那就改成相应的东西。除了启动Shell,inittab还干了很多事情,我就用我的inittab来说明了。注意,在编译Busybox的时候要选上touch、syslogd、klogd等命令。
    # Startup the system
    null::sysinit:/bin/mount -o remount,rw /
    null::sysinit:/bin/mount -t proc proc /proc
    null::sysinit:/bin/mount -a
    null::sysinit:/bin/hostname -F /etc/hostname
    # Now run any rc scripts
    ::sysinit:/etc/init.d/rcS
    # Now invoke shell
    ::askfirst:/bin/ash
    # Logging junk
    null::sysinit:/bin/touch /var/log/messages
    null::respawn:/sbin/syslogd -n -m 0
    null::respawn:/sbin/klogd -n
    # Stuff to do for the 3-finger salute
    ::ctrlaltdel:/sbin/reboot
    # Stuff to do before rebooting
    null::shutdown:/usr/bin/killall klogd
    null::shutdown:/usr/bin/killall syslogd
    null::shutdown:/bin/umount -a -r
    null::shutdown:/sbin/swapoff -a
    好,把上面这些储存为inittab,启动系统。应该出现两个提示,没有/etc/fstab和/etc/init.d/rcS。目前我的理解/etc/fstab是用来执行mount -a命令的,里面是文件系统的挂载表。还是用我的fstab来说明。
    # <file system> <mount pt>     <type>   <options>                <dump> <pass>
    /dev/root       /              ext2     rw,noauto                0      1
    proc            /proc          proc     defaults          0      0
    devpts          /dev/pts       devpts   defaults,gid=5,mode=620  0      0
    tmpfs           /tmp           tmpfs    defaults                 0      0
    sysfs           /sys           sysfs    defaults                 0      0
    还有/etc/init.d/rcS,这在PC上是用来执行/etc/init.d下所有初始化脚本的一个脚本,呵呵,请原谅我不懂得怎么写这种脚本,对于嵌入式系统,根本不需要这么复杂,直接写在/etc/init.d/rcS里面了。还是用我的/etc/init.d/rcS来说明,其中启动udev的那些指令对于使用静态设备节点和devfs的系统不适用。
    # Start udev
    /bin/mount -t tmpfs tmpfs /dev
    /sbin/udevd --daemon
    /sbin/udevstart
    # Configure net interface
    /sbin/ifconfig lo 127.0.0.1 up
    /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
    /sbin/ifconfig eth0 192.168.2.25 netmask 255.255.255.0
    /sbin/route add default gw 192.168.2.1
    如果用的是udev,还必须有udev的配置脚本。这个写起来有些麻烦,我们可以直接用udev自己带的那些脚本,位置在udev目录下的etc/udev/udev.conf和etc/udev/rules.d里面的文件。把这些放到根文件系统中去,etc/udev/udev.conf变为根文件系统的/etc/udev/udev.conf,etc/udev/rules.d里面的文件变为/etc/udev/rules.d里面的文件。
    至此,一个可用的最简单文件系统就完成了。之后,可以使用mkcramfs、mkyaffs之类的工具制作文件映像,这我就不多说了。需要注意的是,cramfs文件系统是只读的,就算用的是initrd加载的cramfs也一样是只读的,这对根文件系统的/var目录有一定的影响。除了本文中说的办法,还可以用buildroot这个工具来建,但是现在我还在尝试中,以后再说。如果你嫌上面的这一切都很麻烦,可以从本站资料站下载我给Linux 2.6.19内核做的最简文件系统(1.5M),地址是http://cid-4201fdc93932ddaf.skydrive.live.com/self.aspx/EE%e5%b0%8f%e7%ab%99%e7%90%90%e7%a2%8e%e6%96%87%e4%bb%b6/root.img,cramfs格式映像。
    December 19

    Linux 2.6.19.x 内核编译配置选项简介(二)[转载]

    Network device support
    网络设备
    Network device support
    网络设备支持,当然要选啦
    Intermediate Functional Block support
    这是一个中间层驱动,可以用来灵活的配置资源共享,看不懂的可以不选
    Dummy net driver support
    哑接口网络,使用SLIP或PPP传输协议(如ADSL用户)的需要它
    Bonding driver support
    将多个以太网通道绑定为一个,也就是两块网卡具有相同的IP地址并且聚合成一个逻辑链路工作,可以用来实现负载均衡或硬件冗余
    EQL (serial line load balancing) support
    串行线路的负载均衡.如果有两个MODEM和两条电话线而且用SLIP或PPP协议,该选项可以让您同时使用这两个MODEM以达到双倍速度(在网络的另一端也要有同样的设备)
    Universal TUN/TAP device driver support
    TUN/TAP可以为用户空间提供包的接收和发送服务,比如可以用来虚拟一张网卡或点对点通道
    General Instruments Surfboard 1000
    SURFboard 1000插卡式Cable Medem(ISA接口),这玩意大概早就绝种了
    ARCnet devices
    一般人没有ARCnet类型的网卡
    PHY device support
    数据链路层芯片简称为MAC控制器,物理层芯片简称之为PHY,通常的网卡把MAC和PHY的功能做到了一颗芯片中,但也有一些仅含PHY的"软网卡"
    Ethernet (10 or 100Mbit)
    目前最广泛的10/100M网卡
    Ethernet (1000 Mbit)
    目前已成装机主流的1000M网卡
    Ethernet (10000 Mbit)
    万兆网卡无福消受啦
    Token Ring devices
    令牌环网设备
    Wireless LAN (non-hamradio)
    无线LAN
    PCMCIA network device support
    PCMCIA或CardBus网卡
    Wan interfaces
    WAN接口
    ATM drivers
    异步传输模式
    FDDI driver support
    光纤分布式数据接口
    HIPPI driver support
    HIPPI(高性能并行接口)是一个在短距离内高速传送大量数据的点对点协议
    PLIP (parallel port) support
    将并口映射成网络设备,这样两台机器即使没有网卡也可以使用并口通过并行线传输IP数据包
    PPP (point-to-point protocol) support
    点对点协议,PPP已经基本取代SLIP了,用ADSL的可要仔细选择了
    PPP multilink support
    多重链路协议(RFC1990)允许你将多个线路(物理的或逻辑的)组合为一个PPP连接一充分利用带宽,这不但需要pppd的支持,还需要ISP的支持
    PPP filtering
    允许对通过PPP接口的包进行过滤
    PPP support for async serial ports
    通过标准异步串口(COM1,COM2)使用PPP,比如使用老式的外置modem(非同步modem或ISDN modem)上网
    PPP support for sync tty ports
    通过同步tty设备(比如SyncLink适配器)使用PPP,常用于高速租用线路(比如T1/E1)
    PPP Deflate compression
    为PPP提供Deflate(等价于gzip压缩算法)压缩算法支持,需要通信双方的支持才有效
    PPP BSD-Compress compression
    为PPP提供BSD(等价于LZW压缩算法,没有gzip高效)压缩算法支持,需要通信双方的支持才有效
    PPP MPPE compression (encryption)
    为PPP提供MPPE加密协议支持,它被用于微软的P2P隧道协议中
    PPP over Ethernet
    这就是ADSL用户最常见的PPPoE啦,也就是在以太网上跑的PPP协议
    PPP over ATM
    在ATM上跑的PPP
    SLIP (serial line) support
    一个在串行线上(例如电话线)传输IP数据报的TCP/IP协议.小猫一族的通讯协议,与宽带用户无关
    CSLIP compressed headers
    CSLIP协议比SLIP快,它将TCP/IP头(而非数据)进行压缩传送,需要通信双方的支持才有效
    Keepalive and linefill
    让SLIP驱动支持RELCOM linefill和keepalive监视,这在信号质量比较差的模拟线路上是个好主意
    Six bit SLIP encapsulation
    这种线路非常罕见,不要选它
    Fibre Channel driver support
    光纤通道
    Traffic Shaper
    流量整形,已废弃
    Network console logging support
    通过网络记录内核信息
    Netpoll support for trapping incoming packets
    不知道Netpoll是什么的可以不选
    Netpoll traffic trapping
    不知道Netpoll是什么的可以不选
    ISDN subsystem
    综合业务数字网(Integrated Service Digital Network)
    Telephony Support
    VoIP支持
    Input device support
    输入设备
    Generic input layer (needed for keyboard,mouse...)
    通用输入层,要使用键盘鼠标的就必选
    Support for memoryless force-feedback devices
    游戏玩家使用的力反馈设备
    Mouse interface
    鼠标接口
    Provide legacy /dev/psaux device
    仍然支持作为传统的/dev/psaux设备
    Horizontal screen resolution
    数字化转换器或图形输入板的水平分辩率
    Vertical screen resolution
    数字化转换器或图形输入板的垂直分辨率
    Joystick interface
    游戏杆
    Touchscreen interface
    触摸屏
    Event interface
    能够利用/dev/input/eventX来存取输入设备的事件
    Event debugging
    该选项仅供调试
    Keyboards
    键盘驱动,一般选个AT键盘即可
    Mouse
    鼠标驱动,一般选个PS/2鼠标即可
    Joysticks
    游戏杆驱动
    Touchscreens
    触摸屏驱动
    Miscellaneous devices
    其他杂项驱动,一般选个PC喇叭即可
    Hardware I/O ports
    硬件I/O端口
    Serial I/O support
    使用PS/2键盘或鼠标的就必选
    i8042 PC Keyboard controller
    PS/2接口的键盘和鼠标
    Serial port line discipline
    串口键盘或鼠标
    ct82c710 Aux port controller
    一种德州仪器TravelMate笔记本上使用QuickPort接口的鼠标
    Parallel port keyboard adapter
    并口键盘或鼠标
    PCI PS/2 keyboard and PS/2 mouse controller
    接在移动式扩展坞(Docking station)上的键盘或鼠标
    PS/2 driver library
    为PS/2接口上的设备提供驱动(比如PS/2鼠标或标准AT键盘)
    Raw access to serio ports
    不是hacker就别选了
    Gameport support
    就是早年"小霸王"游戏机上的那种手柄
    Character devices
    字符设备
    Virtual terminal
    虚拟终端.除非是嵌入式系统,否则必选
    Support for console on virtual terminal
    内核将一个虚拟终端用作系统控制台(将诸如模块错误/内核错误/启动信息之类的警告信息发送到这里,通常是第一个虚拟终端).除非是嵌入式系统,否则必选
    Support for binding and unbinding console drivers
    虚拟终端是通过控制台驱动程序与物理终端相结合的,但在某些系统上可以使用多个控制台驱动程序(如framebuffer控制台驱动程序),该选项使得你可以选择其中之一
    Non-standard serial port support
    非标准串口支持.这样的设备早就绝种了
    Serial drivers
    串口驱动.如果你有老式的串口鼠标或小猫之类的就选吧
    Unix98 PTY support
    伪终端(PTY)可以模拟一个终端,它由slave(等价于一个物理终端)和master(被一个诸如xterms之类的进程用来读写slave设备)两部分组成的软设备.使用telnet或ssh远程登录者必选
    Legacy (BSD) PTY support
    使用过时的BSD风格的/dev/ptyxx作为master,/dev/ttyxx作为slave,这个方案有一些安全问题,建议不选
    Parallel printer support
    并口打印机
    Support for console on line printer
    允许将内核信息输出到并口,这样就可以打印出来
    Support for user-space parallel port device drivers
    /dev/parport设备支持,比如deviceid之类的程序需要使用它,大部分人可以关闭该选项
    Texas Instruments parallel link cable support
    德州仪器生产的一种使用并行电缆的图形计算器,如果你不知道这是什么设备就别选了
    IPMI
    可以利用IPMI远程监视服务器的物理特征(温度,电压,风扇,电源,机箱入侵),它是独立于CPU,BIOS,OS的,只要接通电源就可以实现对服务器的监控
    IPMI top-level message handler
    IPMI消息处理器,要启用IPMI远程监视这个就必选
    Generate a panic event to all BMCs on a panic
    当发生紧急情况(panic)时,IPMI消息处理器将会向每一个已注册的底板管理控制器(BMC)接口生成一个描述该panic的IPMI事件,这些事件可以引发日志记录/报警/重启/关机等动作
    Generate OEM events containing the panic string
    当发生紧急情况(panic)时,IPMI消息处理器将会产生OEM类型的事件
    Device interface for IPMI
    为IPMI消息处理器提供一个IOCTL接口已便用户空间的进程也可以使用IPMI
    IPMI System Interface handler
    向系统提供接口(KCS,SMIC),一般你用了IPMI就需要选上
    IPMI Watchdog Timer
    启用IPMI Watchdog定时器
    IPMI Poweroff
    允许IPMI消息处理器关闭机器
    Watchdog Cards
    能让系统在出现致命故障后自动重启,如果没有硬件Watchdog,建议使用Hangcheck timer而不是软件Watchdog
    Watchdog Timer Support
    选中它并选中下面的一个Driver之后,再创建一个/dev/watchdog节点即可拥有一只Watchdog了.更多信息请参考内核帮助
    Disable watchdog shutdown on close
    一旦Watchdog启动后就禁止将其停止
    Software watchdog
    软件Watchdog,使用它不需要有任何硬件的支持,但是可靠性没有硬件Watchdog高
    {此处省略的硬件Watchdog部分请按照自己主板实际使用的芯片(可能在南桥中)进行选择}
    Hardware Random Number Generator Core support
    硬件随机数发生器核心支持
    Intel HW Random Number Generator support
    Intel芯片组的硬件随机数发生器
    AMD HW Random Number Generator support
    AMD芯片组的硬件随机数发生器
    AMD Geode HW Random Number Generator support
    AMD Geode LX的硬件随机数发生器
    VIA HW Random Number Generator support
    VIA芯片组的硬件随机数发生器
    /dev/nvram support
    直接存取主板上CMOS的接口,太危险了!建议别选
    Enhanced Real Time Clock Support
    启用该选项并创建/dev/rtc文件后就可以通过/proc/driver/rtc访问系统的硬件时钟(RTC),众多功能依赖于它(如SMP,IRQ共享,定时器),建议选择
    Double Talk PC internal speech card support
    由RC Systems公司制造的一种语音合成器
    Siemens R3964 line discipline
    与使用西门子R3964协议的设备同步通信,除非你有一些诸如PLC之类的特殊设备,否则别选
    Applicom intelligent fieldbus card support
    Applicom international公司生产的用于现场总线连接卡
    Sony Vaio Programmable I/O Control Device support
    Sony VAIO笔记本上的东西
    Ftape, the floppy tape device driver
    还使用磁带的就选吧
    /dev/agpgart (AGP Support)
    AGP总线支持,有AGP显卡的还必须从子项中选取符合自己显卡型号的驱动
    Direct Rendering Manager
    DRI允许应用程序以高效安全的方式直接访问图形处理,主要用于硬件3D加速.桌面用户建议选择,同时还必须从子项中选取符合自己显卡型号的驱动
    PCMCIA character devices
    使用PCMCIA接口的字符设备,如果你有这种设备就到子项中去选吧
    ACP Modem (Mwave) support
    IBM Thinkpad上的一种软猫,古董产品
    NatSemi SCx200 GPIO Support
    松下的一种通用输入输出(GPIO)芯片,常用于嵌入式系统
    NatSemi PC8736x GPIO Support
    松下的一种通用输入输出(GPIO)芯片,常用于嵌入式系统
    NatSemi Base GPIO Support
    松下的一种通用输入输出(GPIO)芯片,常用于嵌入式系统
    AMD CS5535/CS5536 GPIO
    常用于AMD Geode的一种通用输入输出(GPIO)芯片,常用于嵌入式系统
    RAW driver (/dev/raw/rawN)
    已废弃
    HPET - High Precision Event Timer
    高精度事件定时器
    Allow mmap of HPET
    允许对HPET寄存器进行映射,建议选中
    Hangcheck timer
    宕机检测定时器周期性地检查系统任务调度程序以确定系统的运行状况,如果超过阈值,计算机将重新启动.它通常可以比Watchdog更好地解决可用性和可靠性问题
    TPM devices
    基于硬件的"可信赖平台模块",与数字霸权管理是一路货,全不选
    Telecom clock driver for MPBL0010 ATCA SBC
    没见过这种硬件,不选
    I2C support
    I2C是Philips极力推动的微控制应用中使用的低速串行总线协议,可用于监控电压/风扇转速/温度等.SMBus(系统管理总线)是I2C的子集.除硬件传感器外"Video For Linux"也需要该模块的支持
    I2C device interface
    I2C设备接口,允许用户空间的程序通过/dev/i2c-*设备文件使用I2C总线
    I2C Algorithms
    I2C算法,可以全不选,若有其他部分依赖其子项时,会自动选上
    I2C Hardware Bus support
    按实际硬件情况选对应的子项即可
    Miscellaneous I2C Chip support
    其他不常见的产品,按需选择
    I2C Core debugging messages
    仅供调试
    I2C Algorithm debugging messages
    仅供调试
    I2C Bus debugging messages
    仅供调试
    I2C Chip debugging messages
    仅供调试
    SPI support
    串行外围接口(SPI)常用于微控制器(MCU)与外围设备(传感器,eeprom,flash,编码器,模数转换器)之间的通信,比如MMC和SD卡就通常需要使用SPI
    Dallas's 1-wire bus
    一线总线
    Hardware Monitoring support
    当前主板大多都有一个监控硬件健康的设备用于监视温度/电压/风扇转速等,请按照自己主板实际使用的芯片选择相应的子项.另外,该功能还需要I2C的支持
    Multimedia devices
    多媒体设备
    Video For Linux
    要使用音频/视频设备或FM收音卡的就必选,此功能还需要I2C的支持
    Enable Video For Linux API 1
    使用老旧的V4L第一版API,反对使用
    Enable Video For Linux API 1 compatible Layer
    提供对第一版V4L的兼容,建议不选
    Video Capture Adapters
    视频捕获卡
    Enable advanced debug functionality
    该选项仅供调试
    Autoselect pertinent encoders/decoders and other helper chips
    为视频卡自动选择所需的编码和解码模块,建议选择
    Virtual Video Driver
    虚拟视频卡,仅供测试视频程序和调试
    SAA5246A, SAA5281 Teletext processor
    该选项仅对欧洲用户有意义,中国用户不需要
    SAA5249 Teletext processor
    该选项仅对欧洲用户有意义,中国用户不需要
    {此处省略的硬件请按照自己实际使用的芯片进行选择}
    V4L USB devices
    使用USB接口的视频卡,子项请按照自己实际使用的视频卡选择
    Radio Adapters
    音频卡,子项请按照自己实际使用的音频卡选择
    Digital Video Broadcasting Devices
    数字视频广播设备(DVB卡或机顶盒),子项请按自己实际使用的硬件选择
    DABUSB driver
    USB接口的数字音频广播设备接收器
    Graphics support
    图形设备/显卡支持
    Enable firmware EDID
    允许访问Video BIOS中的扩展显示器识别数据(EDID),使用Matrox显卡的建议关闭,建议桌面用户选择
    Support for frame buffer devices
    帧缓冲设备是为了让应用程序使用统一的接口操作显示设备而对硬件进行的抽象,建议桌面用户选择
    Enable Video Mode Handling Helpers
    使用GTF和EDID来帮助处理显示模式,可以不选,若有其他选项依赖于它时,会自动选上
    Enable Tile Blitting Support
    可以不选,若有其他选项依赖于它时,会自动选上
    VGA 16-color graphics support
    16色VGA显卡.如果你有这种古董就选吧
    VESA VGA graphics support
    符合VESA 2.0标准的显卡的通用驱动,如果显卡芯片在下面能够找到就可以不选
    {此处省略的硬件请按照自己实际使用的显卡芯片进行选择}
    Virtual Frame Buffer support
    仅供调试使用
    Console display driver support
    控制台显示驱动
    VGA text console
    文本控制台,必选
    Enable Scrollback Buffer in System RAM
    在内存中开辟额外的屏幕缓冲区,这将允许你回滚屏幕
    Scrollback Buffer Size (in KB)
    在内存中开辟的额外屏幕缓冲区大小
    Video mode selection support
    允许在内核启动时使用"vga="选择文本模式,如果你希望一行能够显示更多字符的话可以打开它
    MDA text console (dual-headed)
    如果你有古董级别的单色显卡并且作为第二块显卡使用以实现双头显示就选上吧
    Framebuffer Console support
    基于framebuffer的控制台驱动,服务器可以不选
    Framebuffer Console Rotation
    显示画面旋转,它可能大大降低显示速度,建议不选
    Select compiled-in fonts
    选择内建字体
    VGA 8x8 font
    高分辨率下的小字体
    VGA 8x16 font
    底分辨率下的大字体
    {其它字体省略}
    Logo configuration
    启动时显示linux的logo(一幅企鹅图像),喜欢炫一下的就选吧
    Backlight & LCD device support
    LCD显示器支持,一般无需选择
    Sound
    声卡
    Advanced Linux Sound Architecture
    使用声卡者必选
    Sequencer support
    音序器支持(MIDI必需),除非你确定不需要,否则请选上
    Sequencer dummy client
    除非你要同时连接到多个MIDI设备或应用程序,否则请不要选择
    OSS Mixer API
    OSS混音器API仿真,许多程序目前仍然需要使用它,建议选择
    OSS PCM (digital audio) API
    OSS数字录音(PCM)API模拟,许多程序目前仍然需要使用它,建议选择
    OSS PCM (digital audio) API - Include plugin system
    建议不选
    OSS Sequencer API
    OSS音序器支持,许多程序目前仍然需要使用它,建议选择
    RTC Timer support
    为ALSA启用RTC定时器支持,建议选择
    Use RTC as default sequencer timer
    将RTC当作默认的时序脉冲发生器
    Dynamic device file minor numbers
    仅供拥有多个声卡的用户选择
    Support old ALSA API
    支持已被废弃的老版本ALSA API
    Verbose procfs contents
    仅供调试使用
    Verbose printk
    仅供调试使用
    Debug
    仅供调试使用
    Generic devices
    通用设备
    Dummy (/dev/null) soundcard
    仅供调试
    Virtual MIDI soundcard
    虚拟MIDI驱动,允许将使用原始MIDI设备的应用程序连接到音序器客户端,如果你不知道MIDI是什么就别选
    {此处省略的硬件请按照自己实际使用的声卡芯片进行选择}
    PCI devices
    PCI接口的声卡,请按实际使用的声卡选择子项
    USB devices
    USB接口的声卡,请按实际使用的声卡选择子项
    PCMCIA devices
    PCMCIA接口的声卡,请按实际使用的声卡选择子项
    Open Sound System
    反对使用
    USB support
    USB支持
    Support for Host-side USB
    主机端(Host-side)USB支持.通用串行总线(USB)是一个串行总线子系统规范,它比传统的串口速度更快并且特性更丰富(供电,热插拔,最多可接127个设备等),有望在将来一统PC外设接口.USB的"Host"(主机)被称为"根"(也可以理解为是主板上的USB控制器),外部设备被称为"叶子",而内部的节点则称为"hub"(集线器).基本上只要你想使用任何USB设备都必须选中此项.另外,你还需要从下面选中至少一个"Host Controller Driver"(HCD),比如适用于USB1.1的"UHCI HCD support"或"OHCI HCD support",适用于USB2.0的"EHCI HCD (USB 2.0) support".如果你拿不准的话把他们全部选中一般也不会出问题.如果你的系统有设备端的USB接口(也就是你的系统可以作为"叶子"使用),请到"USB Gadget"中进行选择.
    USB verbose debug messages
    仅供调试使用
    USB device filesystem
    在/proc/bus/usb里列出当前连接的usb设备(mount -t usbfs none /proc/bus/usb),这样用户空间的程序就可以直接访问这些USB设备,基本上你要使用USB设备的话就必须选中此项
    Enforce USB bandwidth allocation
    执行usb带宽分配限制,禁止打开占用usb总线带宽超过90%的设备,关闭该选项可能会导致某些设备无法正常工作
    Dynamic USB minor allocation
    除非你有超过16个同类型的USB设备,否则不要选择
    USB selective suspend/resume and wakeup
    usb设备的挂起和恢复,毛病多多且许多设备尚未支持它,建议不选
    EHCI HCD (USB 2.0) support
    USB 2.0支持(大多数2002年以后的主板都支持).如果你选中了此项,一般来说你还需要选中OHCI或UHCI驱动
    Full speed ISO transactions
    由于USB 2.0支持低速(1.5Mbps)/全速(12Mbps)/高速(480Mbps)三种规格的外部设备,为了将全/低速设备对高速设备可用带宽的影响减到最小,在USB2.0集线器中提供了一种事务转换(Transaction Translator)机制,该机制支持在Hub连接的是全/低速设备的情况下,允许主控制器与Hub之间以高速传输所有设备的数据,从而节省不必要的等待.如果你没有外置的USB集线器就无需选择
    Root Hub Transaction Translators
    带有USB 2.0接口的主板上都有一个"根集线器"(Root Hub)以允许在无需额外购买hub的情况下就可以提供多个USB插口,其中的某些产品还在其中集成了事务转换(Transaction Translator)功能,这样就不需要再额外使用一个兼容OHCI或UHCI的控制器来兼容USB 1.1,即使你不太清楚自己主板上的根集线器是否集成了事务转换功能也可以安全的选中此项
    Improved Transaction Translator scheduling
    如果你有一个高速USB 2.0 hub并且某些接在这个hub上的低速或全速设备不能正常工作(显示'cannot submit datapipe: error -28'或'error -71'错误),可以考虑选上
    ISP116X HCD support
    ISP1160/ISP1161主机USB控制器,是符合USB2.0全速规范的单片主机控制器和设备控制器,支持OHCI标准
    OHCI HCD support
    开放主机控制接口(OHCI)是主要针对嵌入式系统的USB 1.1主机控制器规范
    UHCI HCD (most Intel and VIA) support
    通用主机控制器接口(UHCI)是主要针对PC机的USB 1.1主机控制器规范.另外,EHCI也可能需要它
    Elan U132 Adapter Host Controller
    如果你有这种硬件就选吧
    SL811HS HCD support
    如果你有这种硬件就选吧
    USB Bluetooth TTY support
    USB蓝牙TTY设备支持
    USB MIDI support
    USB MIDI设备支持
    USB Modem (CDC ACM) support
    USB接口的猫或ISDN适配器
    USB Printer support
    USB打印机
    USB Mass Storage support
    USB存储设备(U盘,USB硬盘,USB软盘,USB CD-ROM,USB磁带,memory sticks,数码相机,读卡器等等).该选项依赖于'SCSI device support',且大部分情况下还依赖于'SCSI disk support'(比如U盘或USB硬盘)
    USB Mass Storage verbose debug
    仅供调试使用
    {省略的部分请按照自己实际使用的硬件选择(事实上大部分人都没有这些设备,可以全不选)}
    The shared table of common (or usual) storage devices
    该模块包含一张记录了常用USB存储设备及其驱动的表格,这样你无需重新编译模块即可在切换这些设备时自动邦定对应的驱动(还需要对/etc/modprobe.conf进行相应的设置).不确定的建议不选
    USB Human Interface Device (full HID) support
    USB人机界面设备(鼠标/键盘/游戏杆/手写版等人操作计算机的设备),该驱动不能和"USB HID Boot Protocol drivers"同时使用
    HID input layer support
    如果你有USB接口的鼠标/键盘/游戏杆/手写板等输入设备就必选
    Enable support for iBook/PowerBook special keys
    苹果iBooks/PowerBooks键盘上的Fn/Numlock等功能键支持
    Force feedback support
    力反馈设备
    /dev/hiddev raw HID device support
    如果你有USB监控装置或不间断电源(UPS)之类的非输入设备就选上
    USB HID Boot Protocol drivers
    如果你有绝对的把握确信不为自己的键盘和鼠标使用通常的HID驱动,而要使用Boot Protocol模式的HID驱动(常见于嵌入式环境)就选吧
    Aiptek 6000U/8000U tablet support
    一种手写板
    Wacom Intuos/Graphire tablet support
    一种手写/绘图板
    Acecad Flair tablet support
    一种数控绘图板
    KB Gear JamStudio tablet support
    一种手写/绘图板
    Griffin PowerMate and Contour Jog support
    一种具有调节音量/滚动文本/视频快进快退等功能的产品
    USB Touchscreen Driver
    USB触摸屏驱动
    Yealink usb-p1k voip phone
    一种VoIP电话
    X-Box gamepad support
    X-Box游戏板
    ATI / X10 USB RF remote control
    一种usb远程控制设备
    ATI / Philips USB RF remote control
    一种usb远程控制设备
    Keyspan DMR USB remote control
    一种usb远程控制设备
    Apple USB Touchpad support
    苹果机上的触摸板
    USB Mustek MDC800 Digital Camera support
    一种数码相机
    Microtek X6USB scanner support
    一种扫描仪
    USB Network Adapters
    USB网络适配器,如果你有这种设备请按自己实际使用的硬件选择子项
    USB Monitor
    usb流量监控,一般没必要选它
    USS720 parport driver
    一种USB接口转并口的转换设备
    USB Serial Converter support
    USB接口转串口的转换设备
    EMI 6|2m USB Audio interface support
    一种USB音频设备
    EMI 2|6 USB Audio interface support
    一种USB音频设备
    ADU devices from Ontrak Control Systems
    Ontrak Control Systems公司的一种自动拨号设备
    USB Auerswald ISDN support
    一种ISDN设备
    USB Diamond Rio500 support
    一种mp3播放机
    USB Lego Infrared Tower support
    一种无线发射机
    USB LCD driver support
    USB液晶显示器
    USB LED driver support
    USB发光二极管
    Cypress CY7C63xxx USB driver support
    德国AK Modul-Bus Computer GmbH公司的一种产品,不知道是用来干什么的
    Cypress USB thermometer driver support
    一种温度计??
    USB Phidgets drivers
    来自Phidgets公司的各种USB产品
    Siemens ID USB Mouse Fingerprint sensor support
    西门子公司的一种指纹传感器
    Elan PCMCIA CardBus Adapter USB Client
    Elan公司的一种USB转PCMCIA的适配器
    Apple Cinema Display support
    苹果公司的一种Cinema Display
    USB 2.0 SVGA dongle support (Net2280/SiS315)
    一种软件狗
    USB LD driver
    USB LD驱动
    PlayStation 2 Trance Vibrator driver support
    SONY的PS2上面的"入迷振荡器"(类似于力反馈手柄)
    USB testing driver
    测试中的驱动,别选
    USB DSL modem support
    USB DSL猫
    USB Gadget Support
    其他各种杂七杂八的usb小玩艺
    MMC/SD Card support
    MMC/SD卡支持
    LED devices
    发光二级管(LED)设备
    InfiniBand support
    InfiniBand是一个通用的高性能I/O规范,它使得存储区域网中以更低的延时传输I/O消息和集群通讯消息并且提供很好的伸缩性.用于Linux服务器集群系统
    EDAC - error detection and reporting (RAS)
    错误检测与纠正(EDAC)的目标是发现并报告甚至纠正在计算机系统中发生的错误,这些错误是由CPU或芯片组报告的底层错误(内存错误/缓存错误/PCI错误/温度过高,等等),建议选择.如果这些代码报告了一个错误,请到http://bluesmoke.sourceforge.net/http://buttersideup.com/edacwiki查看更多信息
    Debugging
    仅供调试使用
    Main Memory EDAC (Error Detection And Correction) reporting
    一些系统能够检测和修正主内存中的错误,EDAC能够报告这些信息(EDAC自己检测到的或者根据ECC得到的).EDAC还会尽量检测这些错误发生在哪里以便于替换损坏的内存.建议选择并按照你实际使用的芯片组选取子项
    Error detecting method
    错误检测方法,当前只有一个"Poll for errors"(错误轮询)可用
    Real Time Clock
    所有的PC机主板都包含一个电池动力的实时时钟芯片,以便在断电后仍然能够继续保持时间,RTC通常与CMOS集成在一起,因此BIOS可以从中读取当前时间
    RTC class
    通用RTC类支持,选中此项后你就可以在操作系统中使用一个或多个RTC设备(你还必须从下面启用一个或多个RTC接口)
    Set system time from RTC on startup
    系统启动时使用从指定的RTC设备中读取的时间来设定系统时间,通常这将有助于避免不必要的文件系统检测程序(fsck)的运行,建议选择
    The RTC to read the time from
    指定具体从哪个RTC设备中读取时间
    RTC debug support
    仅供调试使用
    sysfs
    允许通过sysfs接口使用RTC,允许多个RTC设备,也就是/sys/class/rtc/rtc0~N
    proc
    允许通过proc接口使用RTC,仅允许一个RTC设备,也就是/proc/driver/rtc
    dev
    允许通过dev接口使用RTC,允许多个RTC设备,也就是"udev"设置的/dev/rtc0~N,建议你建立一个指向其中之一的软连接/dev/rtc,某些程序(比如hwclock)需要使用/dev/rtc
    RTC UIE emulation on dev interface
    如果底层rtc芯片驱动没有提供RTC_UIE就仿真一个RTC_UIE.那些请求将产生每秒一次的更新请求以用来同步[这个选项的意思我也搞不清楚究竟时啥意思,翻译的也可能有误]
    {此处省略的RTC驱动请按照自己实际使用的RTC芯片进行选择}
    DMA Engine support
    从Intel Bensley双核服务器平台开始引入的数据移动加速(Data Movement Acceleration)引擎,它将某些传输数据的操作从CPU转移到专用硬件,从而可以进行异步传输并减轻CPU负载.Intel已将此项技术变为开放的标准,将来应当会有更多的厂商支持
    Network: TCP receive copy offload
    通过在网络栈中利用DMA引擎来减少接收数据包时的copy-to-user操作以释放CPU资源,这是DMA引擎目前最主要的用途
    Intel I/OAT DMA support
    Intel I/O加速技术(Intel I/O Acceleration Technology)中的DMA支持,基于Intel Bensley的新一代服务器平台都支持它

    File systems
    文件系统
    强烈建议在选择之前先看看各种文件系统的比较

    Second extended fs support
    Ext2文件系统是Linux的标准文件系统,擅长处理稀疏文件
    Ext2 extended attributes
    Ext2文件系统扩展属性(与inode关联的name:value对)支持
    Ext2 POSIX Access Control Lists
    POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
    Ext2 Security Labels
    安全标签允许选择使用不同的安全模型实现(如SELinux)的访问控制模型,如果你没有使用需要扩展属性的安全模型就别选
    Ext2 execute in place support
    程序在写入存储介质时就已经分配好运行时的地址,因此不需要载入内存即可在芯片内执行,一般仅在嵌入式系统上才有这种设备
    Ext3 journalling file system support
    Ext3性能平庸,使用journal日志模式时数据完整性非常好(但怪异的是此时多线程并发读写速度却最快)
    Ext3 extended attributes
    Ext3文件系统扩展属性(与inode关联的name:value对)支持
    Ext3 POSIX Access Control Lists
    POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
    Ext3 Security Labels
    安全标签允许选择使用不同的安全模型实现(如SELinux)的访问控制模型,如果你没有使用需要扩展属性的安全模型就别选
    Ext4dev/ext4 extended fs support
    尚处于开发状态的Ext4
    JBD (ext3) debugging support
    仅供开发者使用
    JBD2 (ext4dev/ext4) debugging support
    仅供开发者使用
    Reiserfs support
    性能几乎全面超越Ext2(处理稀疏文件比Ext2慢),小文件(小于4k)性能非常突出,创建和删除文件速度最快,处理大量目录和文件(5k-20k)时仍然非常迅速.日志模式建议使用Ordered,追求极速可使用Writeback模式,追求安全可使用Journal模式.建议使用noatime,notail选项挂载分区以提高速度和避免bug.用于NFS和磁盘限额时需要额外的补丁
    Enable reiserfs debug mode
    启用ReiserFS调试模式,仅供开发者使用
    Stats in /proc/fs/reiserfs
    在/proc/fs/reiserfs文件中显示Reiserfs文件系统的状态,仅供开发者使用
    ReiserFS extended attributes
    ReiserFS文件系统扩展属性(与inode关联的name:value对)支持
    ReiserFS POSIX Access Control Lists
    POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
    ReiserFS Security Labels
    安全标签允许选择使用不同的安全模型实现(如SELinux)的访问控制模型,如果你没有使用需要扩展属性的安全模型就别选了
    JFS filesystem support
    IBM的JFS文件系统
    XFS filesystem support
    碎片最少,多线程并发读写最佳,大文件(>64k)性能最佳,创建和删除文件速度较慢.由于XFS在内存中缓存尽可能多的数据且仅当内存不足时才会将数据刷到磁盘,所以应当仅在确保电力供应不会中断的情况下才使用XFS
    Quota support
    XFS的磁盘配额支持
    Security Label support
    扩展的安全标签支持.SElinux之类的安全系统会使用到这样的扩展安全属性
    POSIX ACL support
    POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
    Realtime support
    实时子卷是专门存储文件数据的卷,可以允许将日志与数据分开在不同的磁盘上
    GFS2 file system support
    一种用于集群的文件系统
    OCFS2 file system support
    一种用于集群的文件系统
    Minix fs support
    老古董文件系统
    ROM file system support
    用于嵌入式系统的内存文件系统的支持
    Inotify file change notification support
    新式的文件系统的变化通知机制,简洁而强大,用于代替老旧的Dnotify
    Inotify support for userspace
    用户空间的Inotify支持
    Quota support
    磁盘配额支持,限制某个用户或者某组用户的磁盘占用空间,Ext2/Ext3/Reiserfs都支持它
    Old quota format support
    老式的配额格式支持
    Quota format v2 support
    新的v2格式允许使用32位的UID/GID
    Dnotify support
    旧式的基于目录的文件变化的通知机制(新机制是Inotify),目前仍然有一些程序依赖它
    Kernel automounter support
    内核自动加载远程文件系统(v3,就算选也不选这个旧的)
    Kernel automounter version 4 support (also supports v3)
    新的(v4)的内核自动加载远程文件系统的支持,也支持v3
    Filesystem in Userspace support
    FUSE允许在用户空间实现一个文件系统,如果你打算开发一个自己的文件系统或者使用一个基于FUSE的文件系统就选吧
    CD-ROM/DVD Filesystems
    CD-ROM/DVD文件系统
    ISO 9660 CDROM file system support
    CD-ROM的标准文件系统
    Microsoft Joliet CDROM extensions
    Microsoft对ISO 9660文件系统的Joliet扩展,允许在文件名中使用Unicode字符,也允许长文件名
    Transparent decompression extension
    Linux对ISO 9660文件系统的扩展,允许将数据透明的压缩存储在CD上
    UDF file system support
    某些新式CD/DVD上的文件系统,很少见
    DOS/FAT/NT Filesystems
    DOS/Windows的文件系统
    MSDOS fs support
    古老的MSDOS文件系统
    VFAT (Windows-95) fs support
    从Win95开始使用的VFAT文件系统
    Default codepage for FAT
    默认代码页
    Default iocharset for FAT
    默认字符集
    NTFS file system support
    从WinNT开始使用的NTFS文件系统
    NTFS debugging support
    仅供调试使用
    NTFS write support
    NTFS写入支持
    Pseudo filesystems
    伪文件系统
    /proc file system support
    显示系统状态的虚拟文件系统(irq设置,内存使用,加载的设备驱动器,网络状态等),许多程序依赖于它
    /proc/kcore support
    系统物理内存的映象
    /proc/vmcore support
    以ELF格式转储的已崩溃内核镜像,仅供调试使用
    Sysctl support (/proc/sys)
    显示各种不同的内核参数,并让root用户能交互地更改其中的某些内容
    sysfs file system support
    导出内核内部对象及其属性和对象之间的相互关系的文件系统,它把连接在系统上的设备和总线以及驱动程序等组织成为一个分级的文件,内核启动时依靠它挂载根分区,禁用sysfs后必须在内核引导参数中使用设备号指定根分区
    Virtual memory file system support (former shm fs)
    tmpfs文件系统(以前叫shm[共享内存]文件系统)支持
    Tmpfs POSIX Access Control Lists
    POSIX ACL(访问控制列表)支持,可以更精细的针对每个用户进行访问控制,需要外部库和程序的支持
    HugeTLB file system support
    大多数现代计算机体系结构提供对多种内存页面大小的支持(比如IA-32结构支持4K和4M(PAE模式为2M)两种页面).TLB(Translation Lookaside Buffer)是虚拟地址到物理地址的翻译缓冲区,这种缓冲区在处理器上是很宝贵的,操作系统总是尝试将有限的TLB资源发挥到极致.特别是能够轻松获得若干G内存的时候(>4G),这种优化就显得尤为关键.只有开启此选项之后才能提供hugepage支持.
    Userspace-driven configuration filesystem
    configfs是用户空间驱动的文件系统,提供与sysfs相反的功能
    Miscellaneous filesystems
    非主流的杂项文件系统
    Network File Systems
    网络文件系统
    Partition Types
    高级磁盘分区类型,不确定可以全不选
    Native Language Support
    本地语言支持
    Base native language support
    基础本地语言,必选
    Default NLS Option
    默认本地语言,建议使用UTF-8
    {此处省略的部分请按需选择,一般至少需要CP437,ASCII,ISO-8859-1}
    Distributed Lock Manager
    通用的分布式锁管理器,不明白就不选

    Instrumentation Support
    分析支持

    Profiling support
    对系统的活动进行分析,仅供内核开发者使用
    Kprobes
    仅供内核开发者使用

    Kernel hacking
    内核hack选项

    Show timing information on printks
    在printk的输出中包含时间信息,可以用来分析内核启动过程各步骤所用时间
    Enable __must_check logic
    在编译内核的过程中使用"必须检查"的逻辑,禁用它将不会显示某些警告信息
    Magic SysRq key
    不懂的千万别选
    Enable unused/obsolete exported symbols
    导出无用和废弃的符号,这将使内核不必要的增大
    Kernel debugging
    不是内核开发者的别选
    Debug Filesystem
    不是内核开发者的别选
    Compile the kernel with frame unwind information
    不是内核开发者的别选
    Run 'make headers_check' when building vmlinux
    在编译内核时运行'make headers_check'命令检查内核头文件,当你修改了与用户空间相关的内核头文件后建议启用该选项
    Linux Kernel Dump Test Tool Module
    不是内核开发者的别选
    Enable doublefault exception handler
    允许捕获非常罕见的导致系统无警告重启的doublefault异常,对于调试非常重要

    Security options
    安全选项
    这里的选项不明白的建议不要选,否则有可能弄巧成拙.

    Enable access key retention support
    在内核中保留authentication token和access key
    Enable the /proc/keys file by which keys may be viewed
    允许有权限的进程通过/proc/keys读取所有的key
    Enable different security models
    允许内核选择不同的安全模型,如果未选中则内核将使用默认的安全模型
    Socket and Networking Security Hooks
    允许安全模型通过Security Hook对Socket与Networking进行访问控制
    XFRM (IPSec) Networking Security Hooks
    启用XFRM安全Hook
    Default Linux Capabilities
    启用与"默认"Linux的兼容性
    Root Plug Support
    一个简单的Linux安全模块,在特定的USB设备不存在时它简单的禁止一切egid==0的进程运行
    NSA SELinux Support
    美国国家安全局(NSA)开发的安全增强Linux(SELinux),你还需要进行策略配置(checkpolicy)并且对文件系统进行标记(setfiles)
    NSA SELinux boot parameter
    添加一个内核引导参数以允许在引导时使用'selinux=0'禁用SELinux或'selinux=1'启用SELinux
    NSA SELinux boot parameter default value
    上述参数的默认值
    NSA SELinux runtime disable
    允许在运行时禁用SELinux
    NSA SELinux Development Support
    SELinux开发支持
    NSA SELinux AVC Statistics
    搜集存取向量(access vector)缓冲区的统计信息并在/selinux/avc/cache_stats中显示出来.这些信息可以用avcstat之类的工具查看
    NSA SELinux checkreqprot default value
    checkreqprot标志的默认值
    NSA SELinux enable new secmark network controls by default
    默认启用新的基于安全标记(secmark)的网络
    NSA SELinux maximum supported policy format version
    允许将支持的最高策略格式版本设置为一个特定的数值
    NSA SELinux maximum supported policy format version value
    支持的最高策略格式版本的数值

    Cryptographic options
    加密选项

    Cryptographic API
    提供核心的加密API支持.这里的加密算法被广泛的应用于驱动程序通信协议等机制中.子选项可以全不选,内核中若有其他部分依赖它,会自动选上
    Cryptographic algorithm manager
    创建加密模版实例,必须要选
    HMAC support
    为IPSec所必须,可为PPPoE提供压缩支持
    Null algorithms
    NULL加密算法(什么也不做),用于IPsec协议的封装安全载荷模块(ESP)
    MD4 digest algorithm
    老旧的摘要算法,已经过时
    MD5 digest algorithm
    主流摘要算法,128位(已被中国山东大学王小云攻破,可以快速找到碰撞)
    SHA1 digest algorithm
    主流摘要算法,160位(已被中国山东大学王小云攻破,可以快速找到碰撞),速度与MD5相当
    SHA256 digest algorithm
    更好的摘要算法,256位,速度较SHA1稍慢
    SHA384 and SHA512 digest algorithms
    更好的摘要算法,384/512位,速度大约只有SHA1的40-50%
    Whirlpool digest algorithms
    最安全的摘要算法,512位,已被列入ISO标准,目前最新版本为3.0(2003年发布)
    Tiger digest algorithms
    号称最快的摘要算法,192位,专门为64位CPU进行了优化
    ECB support
    电子密码本,最简单的加密方法
    CBC support
    密码块链,IPSec需要使用它
    DES and Triple DES EDE cipher algorithms
    老迈的(DES)和尚佳的(Triple DES)对称加密算法
    Blowfish cipher algorithm
    又老又慢的对称加密算法
    Twofish cipher algorithm
    很强的对称加密算法,使用较广
    Twofish cipher algorithms (i586)
    很强的对称加密算法,使用较广(针对i586的版本)
    Serpent cipher algorithm
    很强的对称加密算法
    AES cipher algorithms
    最佳的对称加密算法(Rijndael),128/192/256位,强度最高,快速且节省内存
    AES cipher algorithms (i586)
    最佳的对称加密算法(Rijndael),128/192/256位,强度最高,快速且节省内存(针对i586的版本)
    CAST5 (CAST-128) cipher algorithm
    对称加密算法
    CAST6 (CAST-256) cipher algorithm
    对称加密算法
    TEA, XTEA and XETA cipher algorithms
    较弱的对称加密算法
    ARC4 cipher algorithm
    脆弱的流对称加密算法
    Khazad cipher algorithm
    对称加密算法
    Anubis cipher algorithm
    对称加密算法
    Deflate compression algorithm
    压缩算法,当在IPSec中使用IPCOMP协议时才需要
    Michael MIC keyed digest algorithm
    摘要算法,仅仅用于校验iSCSI设备传输的数据,因为算法本身比较脆弱
    CRC32c CRC algorithm
    摘要算法,可用于校验iSCSI设备传输的数据
    Testing module
    快速且丑陋的测试模块
    Hardware crypto devices
    仅有VIA C7系列处理器支持硬件加密(VIA PadLock高级加密引擎)

    Library routines
    库子程序
    仅有那些不包含在内核原码中的第三方内核模块才可能需要,可以全不选,内核中若有其他部分依赖它,会自动选上

    CRC-CCITT functions
    传送8-bit字符,欧洲标准
    CRC16 functions
    传送8-bit字符,美国标准
    CRC32 functions
    用于点对点的同步数据传输中,传输网络数据包所必须的
    CRC32c (Castagnoli, et al) Cyclic Redundancy-Check
    用于点对点的同步数据传输中,比如iSCSI设备

    Load an Alternate Configuration File
    读入一个外部配置文件
    Save Configuration to an Alternate File
    将配置保存到一个外部文件

    Linux 2.6.19.x 内核编译配置选项简介(一)[转载]

    这篇文章主要写的是x86体系下的配置,不过很多选项和ARM是一样的。 

    Linux 2.6.19.x 内核编译配置选项简介

    作者:金步国


    版权声明

    本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。

    其他作品

    本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作品的列表:

    BUG报告,切磋与探讨

    由于作者水平有限,因此不能保证作品内容准确无误,请在阅读中自行鉴别。如果你发现了作品中的错误,请您来信指出,哪怕是错别字也好,任何提高作品质量的建议我都将虚心接纳。如果你愿意就作品中的相关内容与我进行进一步切磋与探讨,也欢迎你与我联系。联系方式:Email: csfrank@citiz.net ; QQ: 70171448 ; MSN: csfrank122@hotmail.com


    本文作者将不定期的根据最新的内核进行添加(同时仍然保留老版本内核的选项),欢迎常来光临并帮助指出其中的错误.

    Code maturity level options
    代码成熟度选项

    Prompt for development and/or incomplete code/drivers
    显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择

    General setup
    常规设置

    Local version - append to kernel release
    在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到
    Automatically append version information to the version string
    自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持
    Support for paging of anonymous memory (swap)
    使用交换分区或者交换文件来做为虚拟内存
    System V IPC
    System V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么
    IPC Namespaces
    IPC命名空间支持,不确定可以不选
    POSIX Message Queues
    POSIX消息队列,这是POSIX IPC中的一部分
    BSD Process Accounting
    将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息
    BSD Process Accounting version 3 file format
    使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式
    Export task/process statistics through netlink
    通过netlink接口向用户空间导出任务/进程的统计信息,与BSD Process Accounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的
    Enable per-task delay accounting
    在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间
    UTS Namespaces
    UTS名字空间支持,不确定可以不选
    Auditing support
    审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计
    Enable system-call auditing support
    支持对系统调用的审计
    Kernel .config support
    把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息
    Enable access to .config through /proc/config.gz
    允许通过/proc/config.gz访问内核的配置信息
    Cpuset support
    只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它
    Kernel->user space relay support (formerly relayfs)
    在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口
    Initramfs source file(s)
    initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白
    Optimize for size (Look out for broken compilers!)
    编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码
    Enable extended accounting over taskstats
    收集额外的进程统计信息并通过taskstats接口发送到用户空间
    Configure standard kernel features (for small systems)
    配置标准的内核特性(为小型系统)
    Enable 16-bit UID system calls
    允许对UID系统调用进行过时的16-bit包装
    Sysctl syscall support
    不需要重启就能修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核行为的参数或变量
    Load all symbols for debugging/kksymoops
    装载所有的调试符号表信息,仅供调试时选择
    Include all symbols in kallsyms
    在kallsyms中包含内核知道的所有符号,内核将会增大300K
    Do an extra kallsyms pass
    除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项
    Support for hot-pluggable devices
    支持热插拔设备,如usb与pc卡等,Udev也需要它
    Enable support for printk
    允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择
    BUG() support
    显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略
    Enable ELF core dumps
    内存转储支持,可以帮助调试ELF格式的程序
    Enable full-sized data structures for core
    在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能
    Enable futex support
    快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序
    Enable eventpoll support
    支持事件轮循的系统调用
    Use full shmem filesystem
    完全使用shmem来代替ramfs.shmem是基于共享内存的文件系统(可能用到swap),在启用TMPFS后可以挂载为tmpfs供用户空间使用,它比简单的ramfs先进许多
    Use full SLAB allocator
    使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用
    Enable VM event counters for /proc/vmstat
    允许在/proc/vmstat中包含虚拟内存事件记数器

    Loadable module support
    可加载模块支持

    Enable loadable module support
    打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中
    Module unloading
    允许卸载已经加载的模块
    Forced module unloading
    允许强制卸载正在使用中的模块(比较危险)
    Module versioning support
    允许使用其他内核版本的模块(可能会出问题)
    Source checksum for all modules
    为所有的模块校验源码,如果你不是自己编写内核模块就不需要它
    Automatic kernel module loading
    让内核通过运行modprobe来自动加载所需要的模块,比如可以自动解决模块的依赖关系

    Block layer
    块设备层

    Enable the block layer
    块设备支持,使用硬盘/USB/SCSI设备者必选
    Support for Large Block Devices
    仅在使用大于2TB的块设备时需要
    Support for tracing block io actions
    块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据
    Support for Large Single Files
    仅在可能使用大于2TB的文件时需要
    IO Schedulers
    IO调度器
    Anticipatory I/O scheduler
    假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)
    Deadline I/O scheduler
    使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)
    CFQ I/O scheduler
    使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统
    Default I/O scheduler
    默认IO调度器

    Processor type and features
    中央处理器(CPU)类型及特性

    Symmetric multi-processing support
    对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭
    Subarchitecture Type
    处理器的子架构,大多数人都应当选择"PC-compatible"
    Processor family
    处理器系列,请按照你实际使用的CPU选择
    Generic x86 support
    通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选
    HPET Timer Support
    HPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上
    Maximum number of CPUs
    支持的最大CPU数,每增加一个内核将增加8K体积
    SMT (Hyperthreading) scheduler support
    支持Intel的超线程(HT)技术
    Multi-core scheduler support
    针对多核CPU进行调度策略优化
    Preemption Model
    内核抢占模式
    No Forced Preemption (Server)
    适合服务器环境的禁止内核抢占
    Voluntary Kernel Preemption (Desktop)
    适合普通桌面环境的自愿内核抢占
    Preemptible Kernel (Low-Latency Desktop)
    适合运行实时程序的主动内核抢占
    Preempt The Big Kernel Lock
    可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境
    Machine Check Exception
    让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等)
    Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4
    每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志
    check for P4 thermal throttling interrupt
    当P4的cpu过热时显示一条警告消息
    Enable VM86 support
    虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要
    Toshiba Laptop support
    Toshiba笔记本模块支持
    Dell laptop support
    Dell笔记本模块支持
    Enable X86 board specific fixups for reboot
    修正某些旧x86主板的重起bug,这种主板基本绝种了
    /dev/cpu/microcode - Intel IA32 CPU microcode support
    使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效
    /dev/cpu/*/msr - Model-specific register support
    在多cpu系统中让特权CPU访问x86的MSR寄存器
    /dev/cpu/*/cpuid - CPU information support
    能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)
    Firmware Drivers
    固件驱动程序
    BIOS Enhanced Disk Drive calls determine boot disk
    有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持
    BIOS update support for DELL systems via sysfs
    仅适用于DELL机器
    Dell Systems Management Base Driver
    仅适用于DELL机器
    High Memory Support
    最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"
    Memory split
    如果你不是绝对清楚自己在做什么,不要改动这个选项
    Memory model
    一般选"Flat Memory",其他选项涉及内存热插拔
    64 bit Memory and IO resources
    使用64位的内存和IO资源
    Allocate 3rd-level pagetables from highmem
    在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存
    Math emulation
    数学协处理器仿真,486DX以上的cpu就不要选它了
    MTRR (Memory Type Range Register) support
    打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误
    Boot from EFI support
    EFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及
    Enable kernel irq balancing
    让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行
    Use register arguments
    使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码
    Enable seccomp to safely compute untrusted bytecode
    只有嵌入式系统可以不选
    Timer frequency
    内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"
    kexec system call
    提供kexec系统调用,可以不必重启而切换到另一个内核
    kernel crash dumps
    被kexec启动后产生内核崩溃转储
    Physical address where the kernel is loaded
    内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它
    Support for hot-pluggable CPUs
    对热插拔CPU提供支持
    Compat VDSO support
    如果Glibc版本大于等于2.3.3就不选,否则就选上

    Power management options
    电源管理选项

    Power Management support
    电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态
    Legacy Power Management API
    传统的电源管理API,比如软关机和系统休眠等接口
    Power Management Debug Support
    仅供调试使用
    Driver model /sys/devices/.../power/state files
    内核帮助文档反对使用该选项,即将被废除
    ACPI (Advanced Configuration and Power Interface) Support
    必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APM
    AC Adapter
    如果你的系统可以在AC和电池之间转换就可以选
    Battery
    通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选
    Button
    守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它
    Video
    仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持
    Generic Hotkey
    统一的热键驱动,建议不选
    Fan
    允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多
    Dock
    支持由ACPI控制的集线器(docking stations)
    Processor
    让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖
    Thermal Zone
    系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁
    ASUS/Medion Laptop Extras
    ASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能
    IBM ThinkPad Laptop Extras
    IBM ThinkPad专用
    Toshiba Laptop Extras
    Toshiba笔记本专用
    Disable ACPI for systems before Jan 1st this year
    输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)
    Debug Statements
    详细的ACPI调试信息,不搞开发就别选
    Power Management Timer Support
    这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它
    ACPI0004,PNP0A05 and PNP0A06 Container Driver
    支持内存和CPU的热插拔
    Smart Battery System
    支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差
    APM (Advanced Power Management) BIOS Support
    APM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项
    Ignore USER SUSPEND
    只有NEC Versa M系列的笔记本才需要选择这一项
    Enable PM at boot time
    系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机
    Make CPU Idle calls when idle
    系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭
    Enable console blanking using APM
    在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效
    RTC stores time in GMT
    将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心
    Allow interrupts during APM BIOS calls
    允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它
    Use real mode APM BIOS call to power off
    此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它
    CPU Frequency scaling
    允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行
    Enable CPUfreq debugging
    允许对CPUfreq进行调试
    CPU frequency translation statistics
    通过sysfs文件系统输出CPU频率变换的统计信息
    CPU frequency translation statistics details
    输出详细的CPU频率变换统计信息
    Default CPUFreq governor
    默认的CPU频率调节器
    'performance' governor
    '性能'优先,静态的将频率设置为cpu支持的最高频率
    'powersave' governor
    '节能'优先,静态的将频率设置为cpu支持的最低频率
    'userspace' governor for userspace frequency scaling
    既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)
    'ondemand' cpufreq policy governor
    '立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机
    'conservative' cpufreq governor
    '保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境
    ACPI Processor P-States driver
    将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor
    {省略的部分请按照自己实际使用的CPU选择}
    /proc/acpi/processor/../performance interface
    内核帮助文档反对使用该选项,即将被废除
    Relaxed speedstep capability checks
    放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开

    Bus options (PCI, PCMCIA, EISA, MCA, ISA)
    总线选项

    PCI support
    PCI支持,如果使用了PCI或PCI Express设备就必选
    PCI access mode
    PCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备)
    PCI Express support
    PCI Express支持(目前主要用于显卡和千兆网卡)
    PCI Express Hotplug driver
    如果你的主板和设备都支持PCI Express热插拔就可以选上
    Use polling mechanism for hot-plug events
    对热插拔事件采用轮询机制,仅用于测试目的
    Root Port Advanced Error Reporting support
    由PCI Express AER驱动程序处理发送到Root Port的错误信息
    Message Signaled Interrupts (MSI and MSI-X)
    PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSI
    PCI Debugging
    将PCI调试信息输出到系统日志里
    Interrupts on hypertransport devices
    允许本地的hypertransport设备使用中断
    ISA support
    现在基本上没有ISA的设备了,如果你有就选吧
    MCA support
    微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线
    NatSemi SCx200 support
    在使用AMD Geode处理器的机器上才可能有
    PCCARD (PCMCIA/CardBus) support
    PCMCIA卡(主要用于笔记本)支持
    Enable PCCARD debugging
    仅供调试
    16-bit PCMCIA support
    一些老的PCMCIA卡使用16位的CardBus
    32-bit CardBus support
    当前的PCMCIA卡基本上都是32位的CardBus
    CardBus yenta-compatible bridge support
    使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择
    {省略的部分请按照自己实际使用的PCMCIA卡选择}
    PCI Hotplug Support
    PCI热插拔支持,如果你有这样的设备就到子项中去选吧

    Executable file formats
    可执行文件格式

    Kernel support for ELF binaries
    ELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选
    Kernel support for a.out and ECOFF binaries
    早期UNIX系统的可执行文件格式,目前已经被ELF格式取代
    Kernel support for MISC binaries
    允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它

    Networking
    网络

    Networking options
    网络选项
    Network packet debugging
    在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没
    Packet socket
    这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议
    Packet socket: mmapped IO
    让Packet socket驱动程序使用IO映射机制以使连接速度更快
    Unix domain sockets
    一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslog
    Transformation user configuration interface
    为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持
    Transformation sub policy support
    XFRM子策略支持,仅供开发者使用
    PF_KEY sockets
    用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它
    TCP/IP networking
    TCP/IP协议当然要选
    IP: multicasting
    群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要
    IP: advanced router
    高级路由,如果想做一个路由器就选吧
    IP: policy routing
    策略路由
    IP: equal cost multipath
    用于路由的基于目的地址的负载均衡
    IP: verbose route monitoring
    显示冗余的路由监控信息
    IP: kernel level autoconfiguration
    在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西
    IP: tunneling
    IP隧道,将一个IP报文封装在另一个IP报文内的技术
    IP: GRE tunnels over IP
    基于IP的GRE(通用路由封装)隧道
    IP: multicast routing
    多重传播路由
    IP: ARP daemon support
    这东西尚处于试验阶段就已经被废弃了
    IP: TCP syncookie support
    抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo 1 >/proc/sys/net/ipv4/tcp_syncookies"命令
    IP: AH transformation
    IPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改
    IP: ESP transformation
    IPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制
    IP: IPComp transformation
    IPComp(IP静荷载压缩协议),用于支持IPsec
    IP: IPsec transport mode
    IPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头
    IP: IPsec tunnel mode
    IPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构
    IP: IPsec BEET mode
    IPsec BEET模式
    INET: socket monitoring interface
    socket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它
    TCP: advanced congestion control
    高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补
    IP: Virtual Server Configuration
    IP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了
    The IPv6 protocol
    你要是需要IPv6就选吧
    NetLabel subsystem support
    NetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了
    Security Marking
    对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选
    Network packet filtering (replaces ipchains)
    Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃
    Network packet filtering debugging
    仅供开发者调试Netfilter使用
    Bridged IP/ARP packets filtering
    如果你希望使用一个针对桥接的防火墙就打开它
    Core Netfilter Configuration
    核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)
    Netfilter netlink interface
    允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.
    Netfilter NFQUEUE over NFNETLINK interface
    通过NFNETLINK接口对包进行排队
    Netfilter LOG over NFNETLINK interface
    通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块
    Layer 3 Independent Connection tracking
    独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议
    Netfilter Xtables support
    如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上
    "CLASSIFY" target support
    允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它
    "CONNMARK" target support
    类似于"MARK",但影响的是连接标记的值
    "DSCP" target support
    允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos
    "MARK" target support
    允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为
    "NFQUEUE" target Support
    用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个
    "NOTRACK" target support
    允许规则指定哪些包不进入链接跟踪/NAT子系统
    "SECMARK" target support
    允许对包进行安全标记,用于安全子系统
    "CONNSECMARK" target support
    针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用
    "comment" match support
    允许你在iptables规则集中加入注释
    "connbytes" per-connection counter match support
    允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数
    "connmark" connection mark match support
    允许针对每个会话匹配先前由"CONNMARK"设置的标记值
    "conntrack" connection tracking match support
    连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用
    "DCCP" protocol match support
    DCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务
    "DSCP" match support
    允许对IP包头的DSCP字段进行匹配
    "ESP" match support
    允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧
    "helper" match support
    加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块
    "length" match support
    允许对包的长度进行匹配
    "limit" match support
    允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击
    "mac" address match support
    允许根据以太网的MAC进行匹配,常用于无线网络环境
    "mark" match support
    允许对先前由"MARK"标记的特定标记值进行匹配
    IPsec "policy" match support
    使用IPsec就选上吧
    Multiple port match support
    允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)
    "physdev" match support
    允许对到达的或将要离开的物理桥端口进行匹配
    "pkttype" packet type match support
    允许对封包目的地址类别(广播/群播/直播)进行匹配
    "quota" match support
    允许对总字节数的限额值进行匹配
    "realm" match support
    允许对iptables中的路由子系统中的realm值进行匹配
    "sctp" protocol match support
    流控制传输协议(SCTP),十年以后也许能够普及的东西
    "state" match support
    这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配
    "statistic" match support
    允许根据一个给定的百分率对包进行周期性的或随机性的匹配
    "string" match support
    允许根据包所承载的数据中包含的特定字符串进行匹配
    "tcpmss" match support
    允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配
    IP: Netfilter Configuration
    针对IPv4的Netfilter配置
    Connection tracking (required for masq/NAT)
    链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力
    Connection tracking flow accounting
    允许针对每个连接记录已经传送的字节/包数,常用于connbytes match
    Connection mark tracking support
    允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持
    Connection tracking security mark support
    允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)
    Connection tracking events
    连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变
    Connection tracking netlink interface
    支持基于netlink的用户空间接口
    SCTP protocol connection tracking support
    SCTP是IP网面向多媒体通信的新一代的流控制传输协议
    FTP protocol support
    FTP协议
    IRC protocol support
    IRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生
    NetBIOS name service protocol support
    NetBIOS名字服务协议
    TFTP protocol support
    TFTP是基于UDP的比FTP简单的文件传输协议
    Amanda backup protocol support
    Amanda备份协议
    PPTP protocol support
    点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉
    H.323 protocol support
    ITU-T提出的用于IP电话的协议
    SIP protocol support
    IETE提出的用于IP电话的协议
    IP Userspace queueing via NETLINK
    已废弃
    IP tables support (required for filtering/masq/NAT)
    要用iptables就肯定要选上
    IP range match support
    允许对ip地址的范围进行匹配
    TOS match support
    允许对ip包头的TOS(Type Of Service)字段进行匹配
    recent match support
    可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配
    ECN match support
    允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法
    AH match support
    允许对IPSec包头的AH字段进行匹配
    TTL match support
    允许对ip包头的TTL(生存期)字段进行匹配
    Owner match support
    允许对本地生成的包按照其宿主(user,group,process,session)进行匹配
    address type match support
    允许对地址类型(单播,本地,广播)进行匹配
    hashlimit match support
    是limit的升级,它基于你选择的ip地址与/或端口动态的创建以limit为桶(bucket)的哈希表.它可以创建诸如"为每个特定的目标IP分配10kpps"或"允许每个特定的源IP分配500pps"之类的规则
    Packet filtering
    定义filter表以允许对包进行过滤
    REJECT target support
    允许返回一个ICMP错误而不是简单的丢弃包
    LOG target support
    允许将符合条件的包头信息通过syslog进行记录
    ULOG target support
    透过netlink socket将符合条件的封包交给用户空间的ulogd守护进程.反对使用该选项,因为它已经被NETFILTER_NETLINK_LOG代替
    TCPMSS target support
    允许修改TCP包头中的MSS(最大分段长度)选项值
    Full NAT
    允许进行伪装/端口转发以及其它的NAT功能,仅在你需要使用iptables中的nat表时才需要选择
    Packet mangling
    在iptables中启用mangle表以便对包进行各种修改,常用于改变包的路由
    raw table support (required for NOTRACK/TRACE)
    在iptables中添加一个'raw'表,该表在netfilter框架中非常靠前,并在PREROUTING和OUTPUT链上有钩子,从而可以对收到的数据包在连接跟踪前进行处理
    ARP tables support
    ARP表支持.只有在局域网中才有ARP欺骗问题,另外路由器也会遭到ARP欺骗
    ARP packet filtering
    ARP包过滤.对于进入和离开本地的ARP包定义一个filter表,在桥接的情况下还可以应用于被转发ARP包
    ARP payload mangling
    允许对ARP包的荷载部分进行修改,比如修改源和目标物理地址
    IPv6: Netfilter Configuration
    针对IPv6的Netfilter配置,需要的话可以参考前面IPv4的Netfilter配置进行选择
    DECnet: Netfilter Configuration
    针对DECnet的Netfilter配置
    Bridge: Netfilter Configuration
    针对桥接的Netfilter配置
    DCCP Configuration
    数据报拥塞控制协议在UDP的基础上增加了流控和拥塞控制机制,使数据报协议能够更好地用于流媒体业务的传输
    SCTP Configuration
    流控制传输协议是一种新兴的传输层协议.TCP协议一次只能连接一个IP地址而在SCTP协议一次可以连接多个IP地址且可以自动平衡网络负载,一旦某一个IP地址失效会自动将网络负载转移到其他IP地址上
    TIPC Configuration
    透明内部进程间通信协议,以共享内存为基础实现任务和资源的调度,专门用于内部集群通信
    Asynchronous Transfer Mode (ATM)
    异步传输模式(ATM)支持
    802.1d Ethernet Bridging
    802.1d以太网桥
    802.1Q VLAN Support
    802.1Q虚拟局域网
    DECnet Support
    DECnet是一种很生僻的协议
    ANSI/IEEE 802.2 LLC type 2 Support
    看不懂可以不选
    The IPX protocol
    IPX协议
    Appletalk protocol support
    与Mac机器通信的协议
    CCITT X.25 Packet Layer
    大约没人需要这东西
    LAPB Data Link Driver
    大约没人需要这东西
    Acorn Econet/AUN protocols
    一种被Acorn计算机使用的又老又慢的协议
    WAN router
    广域网路由
    QoS and/or fair queueing
    如果你需要Qos或公平队列就选吧
    Network testing
    网络测试,仅供调试使用
    Amateur Radio support
    业余无线电支持
    IrDA (infrared) subsystem support
    红外线支持,比如无线鼠标或无线键盘
    Bluetooth subsystem support
    蓝牙支持
    Generic IEEE 802.11 Networking Stack
    通用无线局域网(IEEE 802.11系列协议)支持

    Device Drivers
    设备驱动程序

    Generic Driver Options
    驱动程序通用选项
    Select only drivers that don't need compile-time external firmware
    只显示那些不需要内核对外部设备的固件作map支持的驱动程序,除非你有某些怪异硬件,否则请选上
    Prevent firmware from being built
    不编译固件.固件一般是随硬件的驱动程序提供的,仅在更新固件的时候才需要重新编译.建议选上
    Userspace firmware loading support
    提供某些内核之外的模块需要的用户空间固件加载支持,在内核树之外编译的模块可能需要它
    Driver Core verbose debug messages
    让驱动程序核心在系统日志中产生冗长的调试信息,仅供调试
    Connector - unified userspace <-> kernelspace linker
    统一的用户空间和内核空间连接器,工作在netlink socket协议的顶层.不确定可以不选
    Report process events to userspace
    向用户空间报告进程事件(fork,exec,id变化(uid,gid,suid)
    Memory Technology Devices (MTD)
    特殊的存储技术装置,如常用于数码相机或嵌入式系统的闪存卡
    Parallel port support
    并口支持(传统的打印机接口)
    Plug and Play support
    即插即用支持,若未选则应当在BIOS中关闭"PnP OS".这里的选项与PCI设备无关
    PnP Debug Messages
    该选项仅供调试使用
    ISA Plug and Play support
    ISA设备即插即用支持
    Plug and Play BIOS support
    Linux使用"Plug and Play BIOS"规范v1.0A(1994年)中定义的PNPBIOS自动检测主板上的资源和设备,但是其中的某些特性目前尚未实现,比如:事件通知/扩展坞(Docking Station)信息/ISAPNP服务.如果你希望由内核检测主板上的设备并为其分配资源(此时BIOS中的"PnP OS"必须开启)可以选上,此外,PNPBIOS还有助于防止主板上的设备与其他总线设备冲突.不过需要注意的是ACPI将会逐渐取代PNPBIOS(虽然目前两者可以共存),所以如果你的系统不使用ISA设备并且支持ACPI,建议你不要选中该选项并将BIOS中的"PnP OS"关闭
    Plug and Play BIOS /proc interface
    该选项仅供调试使用
    Plug and Play ACPI support
    让Linux使用PNPACPI自动检测主板上内建的设备并为其分配资源(即使这些设备已被BIOS禁用),它有助于避免设备之间的资源(如中断)冲突
    Block devices
    块设备
    Normal floppy disk support
    通用软驱支持
    XT hard disk support
    古董级产品
    Parallel port IDE device support
    通过并口与计算机连接的IDE设备,比如某些老旧的外接光驱或硬盘之类
    Compaq SMART2 support
    基于Compaq SMART2控制器的磁盘阵列卡
    Compaq Smart Array 5xxx support
    基于Compaq SMART控制器的磁盘阵列卡
    Mylex DAC960/DAC1100 PCI RAID Controller support
    古董级产品
    Micro Memory MM5415 Battery Backed RAM support
    一种使用电池做后备电源的内存
    Loopback device support
    Loopback是指拿文件来模拟块设备,比如可以将一个iso9660镜像文件挂成一个文件系统
    Cryptoloop Support
    使用系统提供的加密API对Loopback设备加密,但不能用于日志型文件系统
    Network block device support
    让你的电脑成为网络块设备的客户端
    Promise SATA SX8 support
    基于Promise公司的SATA SX8控制器的RAID卡
    Low Performance USB Block driver
    它不是用来支持U盘的,不懂的就别选
    RAM disk support
    内存中的虚拟磁盘,大小固定(由下面的选项决定,也可给内核传递"ramdisk_size=参数"来决定),它的功能和代码都比shmem简单许多
    Default number of RAM disks
    默认RAM disk的数量
    Default RAM disk size (kbytes)
    仅在你真正知道它的含义时才允许修改
    Default RAM disk block size (bytes)
    每一个RAM disk的默认块大小,设为PAGE_SIZE的值时效率最高
    Initial RAM filesystem and RAM disk (initramfs/initrd) support
    如果启动计算机所必须的模块都在内核里的话可以不选此项
    Packet writing on CD/DVD media
    CD/DVD刻录支持
    Free buffers for data gathering
    用于收集写入数据的缓冲区个数(每个占用64Kb内存),缓冲区越多性能越好
    Enable write caching
    为CD-R/W设备启用写入缓冲,目前这是一个比较危险的选项
    ATA over Ethernet support
    以太网ATA设备支持
    Misc devices
    杂项设备
    ATA/ATAPI/MFM/RLL support
    通常是IDE硬盘和ATAPI光驱.纯SCSI系统且不使用这些接口可以不选
    Max IDE interfaces
    最大IDE接口数,两个IDE插槽一般相当于4个接口
    Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
    EIDE支持是当然要选的,否则540MB以上的硬盘都不认识而且不支持主从设备
    Support for SATA (deprecated; conflicts with libata SATA driver)
    反对使用,该选项与libata SATA驱动有冲突
    Use old disk-only driver on primary interface
    没人用这些古董了
    Include IDE/ATA-2 DISK support
    ATA-2支持,除非你的硬盘是古董,否则必选
    Use multi-mode by default
    如果不确定就别选,除非出现帮助中指出的错误
    PCMCIA IDE support
    通过PCMCIA卡与计算机连接的IDE设备,比如某些外置硬盘或光驱
    Include IDE/ATAPI CDROM support
    有IDE光驱的就选
    Include IDE/ATAPI TAPE support
    有IDE磁带的就选
    Include IDE/ATAPI FLOPPY support
    有IDE软驱的就选
    SCSI emulation support
    SCSI仿真,以前刻录光碟时需要,现在不需要了
    IDE Taskfile Access
    对介质进行直接的原始访问,它是一个复杂且有效的测试和校验硬件的方案,可以在驱动层之下执行数据恢复工作
    generic/default IDE chipset support
    通用IDE芯片组支持
    CMD640 chipset bugfix/support
    586以前的主板上常用,毛病多多
    PNP EIDE support
    外接的即插即用EIDE卡支持
    PCI IDE chipset support
    基于PCI总线的IDE芯片组支持,帮助IDE驱动自动检测和配置所有基于PCI的IDE接口
    Sharing PCI IDE interrupts support
    与其他PCI设备共享中断,一来可能冲突,二来降低性能,不选为妙
    Boot off-board chipsets first support
    不使用外接IDE控制器的就别选,使用外接IDE控制器的注意看帮助
    Generic PCI IDE Chipset Support
    通用的PCI IDE芯片组支持,如果你的芯片组在下面能找到就别选
    OPTi 82C621 chipset enhanced support
    OPTi 82C621 EIDE控制器
    RZ1000 chipset bugfix/support
    486/586年代的玩艺
    Generic PCI bus-master DMA support
    通用的PCI总线控制器DMA支持,586以上的系统都支持
    Force enable legacy 2.0.X HOSTS to use DMA
    历史遗留问题,别管它,不选
    Use PCI DMA by default when available
    默认启用DMA,586以上的系统都支持,建议选择
    Enable DMA only for disks
    只对硬盘启用DMA,若你的光驱不支持DMA就选上
    {此处省略的部分按照自己主板上实际使用的芯片组进行选择}
    Other IDE chipset support
    其它IDE芯片组支持(多数需要在引导时指定特定的内核参数),如果你使用这样的芯片组就按实际情况选择子项吧
    IGNORE word93 Validation BITS
    ATA-4和ATA-5规范中对于如何在80针的数据线上探测解释的不明确,导致了两种不同标准的产品同时出现,这可能导致ATA-66/100降低为ATA-33,若出现这个问题,可以打开这个选项忽略这种不同,但是又有可能导致另外的问题
    Old hard disk (MFM/RLL/IDE) driver
    旧版本的MFM/RLL/IDE驱动,不建议使用
    SCSI device support
    SCSI设备
    RAID Transport Class
    用于SCSI设备的软件RAID支持,需要配合外部工具
    SCSI device support
    有任何SCSI/SATA/USB/光纤/FireWire/IDE-SCSI仿真设备之一就必须选上
    legacy /proc/scsi/ support
    一些老的刻录程序可能需要它
    SCSI disk support
    SCSI硬盘或U盘
    SCSI tape support
    SCSI磁带
    SCSI OnStream SC-x0 tape support
    另一种SCSI磁带
    SCSI CDROM support
    SCSI CDROM
    Enable vendor-specific extensions
    仅在古董级的SCSI CDROM设备上才需要
    SCSI generic support
    若有SCSI硬盘/CD-ROM/tape之外的SCSI设备才需要选择
    SCSI media changer support
    一种SCSI备份设备
    Probe all LUNs on each SCSI device
    在每个SCSI设备上探测逻辑设备数.只在一个SCSI设备上有多个逻辑设备(模拟多个SCSI设备,比如多口读卡器)时才需要选它,一般的SCSI设备不需要
    Verbose SCSI error reporting
    以易读的方式报告SCSI错误,内核将会增大12K
    SCSI logging facility
    启用SCSI日志(默认并不开启,需要在挂载/proc后执行echo "scsi log token [level]" > /proc/scsi/scsi命令才能打开日志),可用于跟踪和捕获SCSI设备的错误
    SCSI Transports
    SCSI接口类型,下面的子项可以全不选,内核中若有其他部分依赖它,会自动选上
    Parallel SCSI (SPI) Transport Attributes
    传统且常见的并行SCSI(Ultra320/160之类)
    FiberChannel Transport Attributes
    光纤通道
    iSCSI Transport Attributes
    iSCSI是利用TCP/IP网络传送SCSI命令和数据的I/O技术
    SAS Transport Attributes
    串行SCSI传输属性支持(SAS对于的关系SPI犹如SATA对于ATA)
    SAS Domain Transport Attributes
    为使用了SAS Domain的驱动程序提供帮助
    Compile the SAS Domain Transport Attributes in debug mode
    仅供调试使用
    SCSI low-level drivers
    底层SCSI驱动程序,按你实际使用的产品选择
    iSCSI Initiator over TCP/IP
    用于iSCSI在TCP/IP网络上传播的起动程序
    {此处省略的部分按照自己实际使用的控制器进行选择,仅用一个例子解说子项}
    Adaptec AIC79xx U320 support
    以基于PCI-X的Adaptec Ultra 320 SCSI控制器为例解说子项
    Maximum number of TCQ commands per device
    每个SCSI设备的标记指令队列的最大长度(上限253).上限越高性能越好,但是对于SCSI设备较多的系统来说可能造成内存分配失败.此值还可以通过tag_info内核引导参数指定
    Initial bus reset delay in milli-seconds
    初始总线reset之后的延时微秒数(默认5000)
    Enable Read Streaming for All Targets
    对所有的标记队列启用Read Streaming(可以增强效能,但是在一些Adaptec早期的U320产品上有缺陷),此特性还可以通过rd_strm内核引导参数指定
    Compile in Debugging Code
    仅用于调试
    Debug code enable mask (16383 for all debugging)
    出错代码的掩码,0表示禁止所有,16383表示打开所有
    Decode registers during diagnostics
    将出错代码的解释内容编译进去,这样就不需要查看aic7xxx.reg中的出错代码表以确定出错代码的含意了
    PCMCIA SCSI adapter support
    通过PCMCIA卡与计算机连接的SCSI设备
    Serial ATA and Parallel ATA drivers
    SATA与PATA设备
    ATA device support
    SATA或PATA接口的硬盘或光驱等设备
    AHCI SATA support
    SATA高级主机控制器接口.要使用NCQ功能就必须选中它,另外BIOS中的SATA工作模式亦要选AHCI模式
    Generic ATA support
    基于新的ATA层的通用ATA控制器驱动,仅在你的芯片组在列表中找不到时才需要
    {此处省略的部分按照自己主板上实际使用的芯片组进行选择}
    Old CD-ROM drivers (not SCSI, not IDE)
    老旧的CD-ROM驱动,这种CD-ROM既不使用SCSI接口,也不使用IDE接口
    Multi-device support (RAID and LVM)
    多设备支持(RAID和LVM).RAID和LVM的功能是使多个物理设备组建成一个单独的逻辑磁盘
    RAID support
    软件RAID(需要使用外部工具),若你有硬件RAID控制器,可以不选
    Linear (append) mode
    追加模式(简单的将一个分区追加在另一个分区之后)
    RAID-0 (striping) mode
    RAID-0(等量分割)模式
    RAID-1 (mirroring) mode
    RAID-1(镜像)模式
    RAID-10 (mirrored striping) mode
    RAID 0+1模式
    RAID-4/RAID-5/RAID-6 mode
    这些模式比较复杂,一般不用
    Support adding drives to a raid-5 array
    RAID-5阵列可以通过添加额外的驱动器进行扩展(restriping),这个选项允许在线进行这样的操作,同时要求mdadm的版本大于2.4.1
    Multipath I/O support
    多路IO支持是指在服务器和存储设备之间使用冗余的物理路径组件创建"逻辑路径",如果这些组件发生故障并造成路径失败,多路径逻辑将为I/O使用备用路径以使应用程序仍然可以访问其数据
    Faulty test module for MD
    用于MD(Multi-device)的缺陷测试模块
    Device mapper support
    Device-mapper是一个底层的卷管理器,不用LVM就别选了
    Fusion MPT device support
    Fusion MPT设备支持
    IEEE 1394 (FireWire) support
    IEEE 1394(火线)
    I2O device support
    I2O(智能IO)设备使用专门的I/O处理器负责中断处理/缓冲存取/数据传输等烦琐任务以减少CPU占用,一般的主板上没这种东西

    用AT91RM9200做网页服务器

    最近工作项目的板子在加工,就在淘宝买了个AT91RM9200的板子。没想到买回来SDRAM是坏的,于是自己换了。因为不想麻烦,也就没有退货,直接给差评了事。
    接下来用开发板作了个WEB服务器,我打算以后把Blog上没有办法添加的东西全部放到那里去。现在还在测试阶段,我住的地方用的是ADSL,不太稳定,请大家见谅。网址:http://cosine.oicp.net。(2009年2月21日追加:此站关闭,上面的文件我搬到SkyDrive上了)
     
    做这个服务器其实很简单,但我已经是不太菜的菜鸟了,就不写那么详细了,可以参考我过去的2410/2440开发文档。下面是作过程提纲:

    根文件系统的制作是困扰我很长时间的问题,现在终于有些解决的眉目了。而且现在我用的是udev,实现了1年前的梦想,呵呵。先写到这里,我的机器正在运行Build-root,打字都卡,受不了了。