6410平台移植dm9000ae驱动到u-boot

6410uboot网络DM9000AE移植相关文件 OK6410uboot网络DM9000AE移植相关文件,将文件负责到相应位置,编译。 立即下载

    自从上次十分简单地移植dm9000到试验箱后,就一直没关注具体的细节,直到这几天自己移植 dm9000ae的驱动时才发现网友遇到的问题。u-boot自带的dm9000驱动是针对dm9000,一款比较老的isa接口芯片,而现在一般用的是 dm9000ae升级版芯片。这个升级并非完全兼容,稍不注意,就会有莫名其妙的错误。

      1.超时问题,症状为不断地出现T。通过wireshark的抓包,有发送也有返回的包,但返回的包并没有被处理,直到T,然后重新发包。对比Linux的驱动,在收包前Linux会有
               ior(db,0xf4);
               ior(db,0xf5);
这两个动作。添加后问题解决。在这里说是缓冲区要复位,但我对比dm9000和dm9000ae的datasheet,都是说IMR位7置一时,缓冲区满时会自动复位。看不出dm9000和dm9000ae有什么差别...

      2.tftp传送失败。传送uImage,bootm后出现"Bad Data CRC"。wireshark抓包,发送和接收都正常。通过cmp与串口传过来的uImage对比,发现每1468个字节后会有8个字节的丢失。打开驱动的debug,print收到的包,发现收到的数据都正确,只不过包的最大长度为1460,后面的8个字节在随后的包中被上层丢弃了。同时,wireshark显示tftp的分包大小为1468,修改tftp的最大分包大小为1460,问题解决。

      3.每次接收都先停顿一个T。抓包,发现第一个arp包没有被抓到,即dm9000还没正常工作。而且每次接收都会等待一个T,即接收完后dm9000被停止。讲eth_init添加到board的初始化并注释eth_halt的内容,一切搞定^_^。

        总结很轻松,过程总是充满辛酸...经过半年的coding,分析能力也有了很大的提高。另外,工作很忙,希望大家不要问我要代码.

 

 

/*
  dm9000.c: Version 1.2 12/15/2003

    A Davicom DM9000 ISA NIC fast Ethernet driver for Linux.
    Copyright (C) 1997  Sten Wang

    This program is free software; you can redistribute it and/or
    modify it under the terms of the GNU General Public License
    as published by the Free Software Foundation; either version 2
    of the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

  (C)Copyright 1997-1998 DAVICOM Semiconductor,Inc. All Rights Reserved.

V0.11    06/20/2001    REG_0A bit3=1, default enable BP with DA match
    06/22/2001     Support DM9801 progrmming
              E3: R25 = ((R24 + NF) & 0x00ff) | 0xf000
             E4: R25 = ((R24 + NF) & 0x00ff) | 0xc200
             R17 = (R17 & 0xfff0) | NF + 3
             E5: R25 = ((R24 + NF - 3) & 0x00ff) | 0xc200
             R17 = (R17 & 0xfff0) | NF

v1.00                   modify by simon 2001.9.5
                    change for kernel 2.4.x

v1.1   11/09/2001          fix force mode bug

v1.2   03/18/2003       Weilun Huang <weilun_huang@davicom.com.tw>:
            Fixed phy reset.
            Added tx/rx 32 bit mode.
            Cleaned up for kernel merge.

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

       12/15/2003       Initial port to u-boot by Sascha Hauer <saschahauer@web.de>

TODO: Homerun NIC and longrun NIC are not functional, only internal at the
      moment.
*/

#include <common.h>
#include <command.h>
#include <net.h>
#include <asm/io.h>

#ifdef CONFIG_DRIVER_DM9000

#include "dm9000x.h"

/* Board/System/Debug information/definition ---------------- */

#define DM9801_NOISE_FLOOR    0x08
#define DM9802_NOISE_FLOOR    0x05

/* #define CONFIG_DM9000_DEBUG */

#ifdef CONFIG_DM9000_DEBUG
#define DM9000_DBG(fmt,args...) printf(fmt ,##args)
#else                /*  */
#define DM9000_DBG(fmt,args...)
#endif                /*  */
enum DM9000_PHY_mode { DM9000_10MHD = 0, DM9000_100MHD =
        1, DM9000_10MFD = 4, DM9000_100MFD = 5, DM9000_AUTO =
        8, DM9000_1M_HPNA = 0x10
};
enum DM9000_NIC_TYPE { FASTETHER_NIC = 0, HOMERUN_NIC = 1, LONGRUN_NIC = 2
};

/* Structure/enum declaration ------------------------------- */
typedef struct board_info {
    u32 runt_length_counter;    /* counter: RX length < 64byte */
    u32 long_length_counter;    /* counter: RX length > 1514byte */
    u32 reset_counter;    /* counter: RESET */
    u32 reset_tx_timeout;    /* RESET caused by TX Timeout */
    u32 reset_rx_status;    /* RESET caused by RX Statsus wrong */
    u16 tx_pkt_cnt;
    u16 queue_start_addr;
    u16 dbug_cnt;
    u8 phy_addr;
    u8 device_wait_reset;    /* device state */
    u8 nic_type;        /* NIC type */
    unsigned char srom[128];
} board_info_t;
board_info_t dmfe_info;

/* For module input parameter */
static int media_mode = DM9000_AUTO;
static u8 nfloor = 0;

/* function declaration ------------------------------------- */
int eth_init(bd_t * bd);
int eth_send(volatile void *, int);
int eth_rx(void);
void eth_halt(void);
static int dm9000_probe(void);
static u16 phy_read(int);
static void phy_write(int, u16);
static u16 read_srom_word(int);
static u8 DM9000_ior(int);
static void DM9000_iow(int reg, u8 value);

/* DM9000 network board routine ---------------------------- */

#define DM9000_outb(d,r) ( *(volatile u8 *)r = d )
#define DM9000_outw(d,r) ( *(volatile u16 *)r = d )
#define DM9000_outl(d,r) ( *(volatile u32 *)r = d )
#define DM9000_inb(r) (*(volatile u8 *)r)
#define DM9000_inw(r) (*(volatile u16 *)r)
#define DM9000_inl(r) (*(volatile u32 *)r)

#ifdef CONFIG_DM9000_DEBUG
static void
dump_regs(void)
{
    DM9000_DBG("/n");
    DM9000_DBG("NCR   (0x00): %02x/n", DM9000_ior(0));
    DM9000_DBG("NSR   (0x01): %02x/n", DM9000_ior(1));
    DM9000_DBG("TCR   (0x02): %02x/n", DM9000_ior(2));
    DM9000_DBG("TSRI  (0x03): %02x/n", DM9000_ior(3));
    DM9000_DBG("TSRII (0x04): %02x/n", DM9000_ior(4));
    DM9000_DBG("RCR   (0x05): %02x/n", DM9000_ior(5));
    DM9000_DBG("RSR   (0x06): %02x/n", DM9000_ior(6));

    DM9000_DBG("/n");
}
#endif                /*  */

/*
  Search DM9000 board, allocate space and register it
*/
int
dm9000_probe(void)
{
    u32 id_val;
    id_val = DM9000_ior(DM9000_VIDL);
    id_val |= DM9000_ior(DM9000_VIDH) << 8;
    id_val |= DM9000_ior(DM9000_PIDL) << 16;
    id_val |= DM9000_ior(DM9000_PIDH) << 24;
    if (id_val == DM9000_ID) {
        printf("dm9000 i/o: 0x%x, id: 0x%x /n", CONFIG_DM9000_BASE,
               id_val);
        return 0;
    } else {
        printf("dm9000 not found at 0x%08x id: 0x%08x/n",
               CONFIG_DM9000_BASE, id_val);
        return -1;
    }
}

/* Set PHY operationg mode
*/
static void
set_PHY_mode(void)
{
    u16 phy_reg4 = 0x01e1, phy_reg0 = 0x1000;
    if (!(media_mode & DM9000_AUTO)) {
        switch (media_mode) {
        case DM9000_10MHD:
            phy_reg4 = 0x21;
            phy_reg0 = 0x0000;
            break;
        case DM9000_10MFD:
            phy_reg4 = 0x41;
            phy_reg0 = 0x1100;
            break;
        case DM9000_100MHD:
            phy_reg4 = 0x81;
            phy_reg0 = 0x2000;
            break;
        case DM9000_100MFD:
            phy_reg4 = 0x101;
            phy_reg0 = 0x3100;
            break;
        }
        phy_write(4, phy_reg4);    /* Set PHY media mode */
        phy_write(0, phy_reg0);    /*  Tmp */
    }
    DM9000_iow(DM9000_GPCR, 0x01);    /* Let GPIO0 output */
    DM9000_iow(DM9000_GPR, 0x00);    /* Enable PHY */
}

/*
    Init HomeRun DM9801
*/
static void
program_dm9801(u16 HPNA_rev)
{
    __u16 reg16, reg17, reg24, reg25;
    if (!nfloor)
        nfloor = DM9801_NOISE_FLOOR;
    reg16 = phy_read(16);
    reg17 = phy_read(17);
    reg24 = phy_read(24);
    reg25 = phy_read(25);
    switch (HPNA_rev) {
    case 0xb900:        /* DM9801 E3 */
        reg16 |= 0x1000;
        reg25 = ((reg24 + nfloor) & 0x00ff) | 0xf000;
        break;
    case 0xb901:        /* DM9801 E4 */
        reg25 = ((reg24 + nfloor) & 0x00ff) | 0xc200;
        reg17 = (reg17 & 0xfff0) + nfloor + 3;
        break;
    case 0xb902:        /* DM9801 E5 */
    case 0xb903:        /* DM9801 E6 */
    default:
        reg16 |= 0x1000;
        reg25 = ((reg24 + nfloor - 3) & 0x00ff) | 0xc200;
        reg17 = (reg17 & 0xfff0) + nfloor;
    }
    phy_write(16, reg16);
    phy_write(17, reg17);
    phy_write(25, reg25);
}

/*
    Init LongRun DM9802
*/
static void
program_dm9802(void)
{
    __u16 reg25;
    if (!nfloor)
        nfloor = DM9802_NOISE_FLOOR;
    reg25 = phy_read(25);
    reg25 = (reg25 & 0xff00) + nfloor;
    phy_write(25, reg25);
}

/* Identify NIC type
*/
static void
identify_nic(void)
{
    struct board_info *db = &dmfe_info;    /* Point a board information structure */
    u16 phy_reg3;
    DM9000_iow(DM9000_NCR, NCR_EXT_PHY);
    phy_reg3 = phy_read(3);
    switch (phy_reg3 & 0xfff0) {
    case 0xb900:
        if (phy_read(31) == 0x4404) {
            db->nic_type = HOMERUN_NIC;
            program_dm9801(phy_reg3);
            DM9000_DBG("found homerun NIC/n");
        } else {
            db->nic_type = LONGRUN_NIC;
            DM9000_DBG("found longrun NIC/n");
            program_dm9802();
        }
        break;
    default:
        db->nic_type = FASTETHER_NIC;
        break;
    }
    DM9000_iow(DM9000_NCR, 0);
}

/* General Purpose dm9000 reset routine */
static void
dm9000_reset(void)
{
    DM9000_DBG("resetting/n");
    DM9000_iow(DM9000_NCR, NCR_RST);
    udelay(1000);        /* delay 1ms */
}

/* Initilize dm9000 board
*/
int
eth_init(bd_t * bd)
{
    int i, oft, lnk;
    DM9000_DBG("eth_init()/n");

    /* RESET device */
    dm9000_reset();
    dm9000_probe();

    /* NIC Type: FASTETHER, HOMERUN, LONGRUN */
    identify_nic();

    /* GPIO0 on pre-activate PHY */
    DM9000_iow(DM9000_GPR, 0x00);    /*REG_1F bit0 activate phyxcer */

    /* Set PHY */
    set_PHY_mode();

    /* Program operating register */
    DM9000_iow(DM9000_NCR, 0x0);    /* only intern phy supported by now */
    DM9000_iow(DM9000_TCR, 0);    /* TX Polling clear */
    DM9000_iow(DM9000_BPTR, 0x3f);    /* Less 3Kb, 200us */
    DM9000_iow(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8));    /* Flow Control : High/Low Water */
    DM9000_iow(DM9000_FCR, 0x0);    /* SH FIXME: This looks strange! Flow Control */
    DM9000_iow(DM9000_SMCR, 0);    /* Special Mode */
    DM9000_iow(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);    /* clear TX status */
    DM9000_iow(DM9000_ISR, 0x0f);    /* Clear interrupt status */

    /* Set Node address */
/*
    for (i = 0; i < 6; i++)
        ((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
*/
 
    char *tmp = getenv ("ethaddr");
    char *end;

    for (i=0; i<6; i++) {
        bd->bi_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;
        if (tmp)
            tmp = (*end) ? end+1 : end;
    }
 
    printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x/n", bd->bi_enetaddr[0],
           bd->bi_enetaddr[1], bd->bi_enetaddr[2], bd->bi_enetaddr[3],
           bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
    for (i = 0, oft = 0x10; i < 6; i++, oft++)
        DM9000_iow(oft, bd->bi_enetaddr[i]);
    for (i = 0, oft = 0x16; i < 8; i++, oft++)
        DM9000_iow(oft, 0xff);

    /* read back mac, just to be sure */
    for (i = 0, oft = 0x10; i < 6; i++, oft++)
        DM9000_DBG("%02x:", DM9000_ior(oft));
    DM9000_DBG("/n");

    /* Activate DM9000 */
    DM9000_iow(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);    /* RX enable */
    DM9000_iow(DM9000_IMR, IMR_PAR);    /* Enable TX/RX interrupt mask */
#if 0
    i = 0;
    while (!(phy_read(1) & 0x20)) {    /* autonegation complete bit */
        udelay(1000);
        i++;
        if (i == 10000) {
            printf("could not establish link/n");
            return 0;
        }
    }

    /* see what we've got */
    lnk = phy_read(17) >> 12;
    printf("operating at ");
    switch (lnk) {
    case 1:
        printf("10M half duplex ");
        break;
    case 2:
        printf("10M full duplex ");
        break;
    case 4:
        printf("100M half duplex ");
        break;
    case 8:
        printf("100M full duplex ");
        break;
    default:
        printf("unknown: %d ", lnk);
        break;
    }
    printf("mode/n");
#endif
    return 0;
}

/*
  Hardware start transmission.
  Send a packet to media from the upper layer.
*/
int
eth_send(volatile void *packet, int length)
{
    char *data_ptr;
    u32 tmplen, i;
    int tmo;
    DM9000_DBG("eth_send: length: %d/n", length);
    for (i = 0; i < length; i++) {
        if (i % 8 == 0)
            DM9000_DBG("/nSend: 02x: ", i);
        DM9000_DBG("%02x ", ((unsigned char *) packet)[i]);
    } DM9000_DBG("/n");

    /* Move data to DM9000 TX RAM */
    data_ptr = (char *) packet;
    DM9000_outb(DM9000_MWCMD, DM9000_IO);

#ifdef CONFIG_DM9000_USE_8BIT
    /* Byte mode */
    for (i = 0; i < length; i++)
        DM9000_outb((data_ptr[i] & 0xff), DM9000_DATA);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_16BIT
    tmplen = (length + 1) / 2;
    for (i = 0; i < tmplen; i++)
        DM9000_outw(((u16 *) data_ptr)[i], DM9000_DATA);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_32BIT
    tmplen = (length + 3) / 4;
    for (i = 0; i < tmplen; i++)
        DM9000_outl(((u32 *) data_ptr)[i], DM9000_DATA);

#endif                /*  */

    /* Set TX length to DM9000 */
    DM9000_iow(DM9000_TXPLL, length & 0xff);
    DM9000_iow(DM9000_TXPLH, (length >> 8) & 0xff);

    /* Issue TX polling command */
    DM9000_iow(DM9000_TCR, TCR_TXREQ);    /* Cleared after TX complete */

    /* wait for end of transmission */
    tmo = get_timer(0) + 5 * CFG_HZ;
    while (DM9000_ior(DM9000_TCR) & TCR_TXREQ) {
        if (get_timer(0) >= tmo) {
            printf("transmission timeout/n");
            break;
        }
    }
    DM9000_DBG("transmit done/n/n");
    return 0;
}

/*
  Stop the interface.
  The interface is stopped when it is brought.
*/
void
eth_halt(void)
{
    DM9000_DBG("eth_halt/n");
#if 0
    /* RESET devie */
    phy_write(0, 0x8000);    /* PHY RESET */
    DM9000_iow(DM9000_GPR, 0x01);    /* Power-Down PHY */
    DM9000_iow(DM9000_IMR, 0x80);    /* Disable all interrupt */
    DM9000_iow(DM9000_RCR, 0x00);    /* Disable RX */
#endif
}

/*
  Received a packet and pass to upper layer
*/
int
eth_rx(void)
{
    u8 rxbyte, *rdptr = (u8 *) NetRxPackets[0];
    u16 RxStatus, RxLen = 0;
    u32 tmplen, i;
#ifdef CONFIG_DM9000_USE_32BIT
    u32 tmpdata;
#endif
    DM9000_ior(0xF4);     
    DM9000_ior(0xF5);     
    /* Check packet ready or not */
    DM9000_ior(DM9000_MRCMDX);    /* Dummy read */
    rxbyte = DM9000_inb(DM9000_DATA);    /* Got most updated data */
    if (rxbyte == 0)
        return 0;

    /* Status check: this byte must be 0 or 1 */
    if (rxbyte > 1) {
        DM9000_iow(DM9000_RCR, 0x00);    /* Stop Device */
        DM9000_iow(DM9000_ISR, 0x80);    /* Stop INT request */
        DM9000_DBG("rx status check: %d/n", rxbyte);
    }
    DM9000_DBG("receiving packet/n");

    /* A packet ready now  & Get status/length */
    DM9000_outb(DM9000_MRCMD, DM9000_IO);

#ifdef CONFIG_DM9000_USE_8BIT
    RxStatus = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) << 8);
    RxLen = DM9000_inb(DM9000_DATA) + (DM9000_inb(DM9000_DATA) << 8);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_16BIT
    RxStatus = DM9000_inw(DM9000_DATA);
    RxLen = DM9000_inw(DM9000_DATA);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_32BIT
    tmpdata = DM9000_inl(DM9000_DATA);
    RxStatus = tmpdata;
    RxLen = tmpdata >> 16;

#endif                /*  */
    DM9000_DBG("rx status: 0x%04x rx len: %d/n", RxStatus, RxLen);

    /* Move data from DM9000 */
    /* Read received packet from RX SRAM */
#ifdef CONFIG_DM9000_USE_8BIT
    for (i = 0; i < RxLen; i++)
        rdptr[i] = DM9000_inb(DM9000_DATA);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_16BIT
    tmplen = (RxLen + 1) / 2;
    for (i = 0; i < tmplen; i++)
        ((u16 *) rdptr)[i] = DM9000_inw(DM9000_DATA);

#endif                /*  */
#ifdef CONFIG_DM9000_USE_32BIT
    tmplen = (RxLen + 3) / 4;
    for (i = 0; i < tmplen; i++)
        ((u32 *) rdptr)[i] = DM9000_inl(DM9000_DATA);

#endif                /*  */
    if ((RxStatus & 0xbf00) || (RxLen < 0x40)
        || (RxLen > DM9000_PKT_MAX)) {
        if (RxStatus & 0x100) {
            printf("rx fifo error/n");
        }
        if (RxStatus & 0x200) {
            printf("rx crc error/n");
        }
        if (RxStatus & 0x8000) {
            printf("rx length error/n");
        }
        if (RxLen > DM9000_PKT_MAX) {
            printf("rx length too big/n");
            dm9000_reset();
        }
    } else {

        /* Pass to upper layer */
        DM9000_DBG("passing packet to upper layer/n");
        NetReceive(NetRxPackets[0], RxLen);
        return RxLen;
    }
    return 0;
}

/*
  Read a word data from SROM
*/
static u16
read_srom_word(int offset)
{
    DM9000_iow(DM9000_EPAR, offset);
    DM9000_iow(DM9000_EPCR, 0x4);
    udelay(200);
    DM9000_iow(DM9000_EPCR, 0x0);
    return (DM9000_ior(DM9000_EPDRL) + (DM9000_ior(DM9000_EPDRH) << 8));
}

/*
   Read a byte from I/O port
*/
static u8
DM9000_ior(int reg)
{
    DM9000_outb(reg, DM9000_IO);
    return DM9000_inb(DM9000_DATA);
}

/*
   Write a byte to I/O port
*/
static void
DM9000_iow(int reg, u8 value)
{
    DM9000_outb(reg, DM9000_IO);
    DM9000_outb(value, DM9000_DATA);
}

/*
   Read a word from phyxcer
*/
static u16
phy_read(int reg)
{
    u16 val;

    /* Fill the phyxcer register into REG_0C */
    DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);
    DM9000_iow(DM9000_EPCR, 0xc);    /* Issue phyxcer read command */
    udelay(100);        /* Wait read complete */
    DM9000_iow(DM9000_EPCR, 0x0);    /* Clear phyxcer read command */
    val = (DM9000_ior(DM9000_EPDRH) << 8) | DM9000_ior(DM9000_EPDRL);

    /* The read data keeps on REG_0D & REG_0E */
    DM9000_DBG("phy_read(%d): %d/n", reg, val);
    return val;
}

/*
   Write a word to phyxcer
*/
static void
phy_write(int reg, u16 value)
{

    /* Fill the phyxcer register into REG_0C */
    DM9000_iow(DM9000_EPAR, DM9000_PHY | reg);

    /* Fill the written data into REG_0D & REG_0E */
    DM9000_iow(DM9000_EPDRL, (value & 0xff));
    DM9000_iow(DM9000_EPDRH, ((value >> 8) & 0xff));
    DM9000_iow(DM9000_EPCR, 0xa);    /* Issue phyxcer write command */
    udelay(500);        /* Wait write complete */
    DM9000_iow(DM9000_EPCR, 0x0);    /* Clear phyxcer write command */
    DM9000_DBG("phy_write(reg:%d, value:%d)/n", reg, value);
}
#endif                /* CONFIG_DRIVER_DM9000 */

PCB阻焊工艺全解析:从油墨选择到显影测试的完整指南 本文深入解析PCB阻焊工艺全流程,从材料科学角度对比液态光成像(LPI)油墨、干膜阻焊等核心材料特性,系统阐述前处理、涂覆、预烤曝光、显影固化等关键步骤的工艺要点与参数控制。重点探讨了如何通过优化油墨选择与工艺参数,解决常见缺陷,提升PCB的可靠性、美观度及可制造性,为工程师提供从理论到产线实战的完整指南。 阅读详情

相关推荐

从翼型到湍流:用生活化案例图解空气动力学核心概念(中英双语版)

本文通过飞机机翼、F1赛车、高尔夫球等生活化案例,图解空气动力学核心概念。深入浅出地解释了攻角如何产生升力、边界层与流动分离如何影响阻力、马赫数如何划分速度世界,以及涡流与湍流的特性与应用。文章还介绍了计算流体动力学(CFD)这一现代数字风洞工具,帮助读者直观理解这些塑造现代交通与运动设计的无形之力。

metaverse5vr的博客 475

S3C6410开发全纪录(三)《UBOOT中添加DM9000AE网卡驱动》

UBOOT中添加DM9000AE网卡驱动

涂睿的专栏 7372

新手避坑指南:用镭神C32和KVH 1750 IMU做标定,为什么直接上lidar_align会失败?

本文详细解析了使用镭神C32激光雷达和KVH 1750 IMU进行标定时常见的失败原因及解决方案。从IMU的微分传感器特性到Lidar-IMU标定的数学本质,再到可行的标定方案和实操注意事项,帮助新手避开认知陷阱,掌握正确的标定方法。

weixin_30162121的博客 327

移植OK6410'S dm9000ae…

转载自:http://lagignition.blog.163.com/blog/static/12873002320110443341961/

不积跬步无以至千里,千里之行始于足下! 1053

DDR4 IP的用户接口

DDR4 IP核用户接口

bowen_wener的博客 1926

物联网开发笔记(34)- 使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

使用Micropython开发ESP32开发板之控制步进电机(28BYJ-48)

zhusongziye的博客 1万+

移植dm9000ae驱动到u-boot

[6410]移植dm9000ae驱动到u-bootu-boot版本1.1.6(1)在smdk6410.h中注释掉CS8900信息,添加DM9000信息注意参考原理图,DM9000使用了CSn1,基地址为18000000//#define CONFIG_DRIVER_CS8900 0 /* we have a CS8900 on-board *///#define CS8900_BASE   0x18800300//#define CS8900_BUS16   1 /* the Linux driver do

激情成就梦想--关注移动互联网 2529

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

[6410][android]给android cupcake移植FB、Nand、触摸屏和DM9000ae驱动

今天搞了四个驱动,终于把基本功能补全了,累死我咯(1)移植framebufferdrivers/video复制samsung文件夹到cupcake内核line236 增加config FB_S3Ctristate "S3C Framebuffer Support"select FB_CFB_FILLRECTselect FB_CFB_COPYAREAselect FB_CFB_IMAGEBLITdepends on FB && (ARCH_S3C64XX || ARCH_S5PC1XX)default n-

tomew的专栏 1421

HRnet的pytorch实现

HRnet的pytorch实现

奋土的博客 1953

【WRF-DART第一期】WRF/DART概述

【WRF-DART第一期】WRF/DART概述

WW、forever的博客 107

OK6410上uboot1.1.6的dm9000AE移植

本文参考了前面转载的那几篇帖子进行移植,特别要注意你现在正在移植的uboot版本是不是和网上的那些博客解说时用的是同一个版本,否则你在1.1.6中作死都不会找到dm9000_initialize()这个函数!!! 重申:我用的是uboot-1.1.6版本,是飞凌OK6410光盘里面拷贝过来的!还有飞凌官方的uboot是支持dm9000,但是尼玛仔细看下自己板子上的网卡芯片,DM9000AE!!

qinjinghua2012的专栏 1334

【全志V821_FoxPi】6-2 IMX219 MIPI摄像头适配

全志V821芯片适配IMX219 MIPI摄像头(2lane)教程,基于FoxPi开发板V1.2 SDK。文章详细介绍了IMX219的技术参数(800万像素、1/4英寸CMOS、支持1080P@30fps输出)及模组接口原理图。重点展示了设备树配置方法,包括PIO引脚定义(TWI0使用PA3/PA4,复位引脚PA2)、TWI0节点设置(100kHz时钟)以及VIND0节点中sensor0的完整配置(I2C地址0x20、MCLK0、RAW格式输出等)。配置过程强调需注意IMX219的器件地址转换(0x10→0

第四维度的博客 2254

OK6410编译U_BOOT,使之支持DM9000AE(一)

步骤如下: #tar zxf uboot1.26_FORLINX_6410.tgz  –C  /home/FOLINX_SHARE/uboot1.1.6_256M      解压,解压到/home/FOLINX_SHARE/uboot1.1.6_256M目录下 #cd  /home/FOLINX_SHARE/uboot1.1.6_256M                进入/home/

Sun_Rise2011的专栏 2504

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

移植OK6410'S dm9000ae驱动到u-boot

Cited from: http://blog.youkuaiyun.com/willand1981/archive/2010/07/01/5706424.aspx u-boot版本1.1.6 (1)在smdk6410.h中注释掉CS8900信息,添加DM9000信息 注意参考原理图,DM9000使用了CSn1,基地址为18000000 //#define CONFIG_DRIVER_CS8900

千重浪Linux技术工作室 1453

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

U-BOOT 6410平台DM9000AE的移植

<br />由于Uboot2010.03对S3C6410有了很好的支持,所以采用Uboot2010.03版本。<br />一、             移植环境<br />主  机:VMWare--Fedora 8 <br />开发板:天嵌TQ6410—256M nandflash,Kernel:2.6.30.4 <br />编译器:EABI-4.3.3_V0.1 <br />u-boot:u-boot-2010.08<br />二、       源码获得<br />              Uboot源

激情成就梦想--关注移动互联网 2231

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

uboot 添加 DM9000支持,作为uboot移植网卡驱动参考

uboot 添加 DM9000支持,作为uboot移植网卡驱动参考

king_sundi的专栏 5691

S3C6410开发全纪录(三)《UBOOT中添加DM9000AE网卡驱动》 .

http://blog.youkuaiyun.com/turui/article/details/6635509   我们获得的UBOOT的代码中实际是有DM9000的网口驱动的,位于:driver/dm9000x.c 在S3C6410的配置中,中并没有将之打开,而其他的芯片中有使用 特别需要注意的是dm9000的驱动与dm9000AE的驱动还是有区别的,如果直接使用代码中自带的dm9000驱动流程,

landishu的专栏 1414

UBOOT-2012-10在OK6410平台的移植(五)修改网卡驱动DM9000AE

1.屏蔽掉/include/configs/smdk6410.h中关于CS8900宏定义这部分,加上DM9000的定义: #define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE (0x18000300) /*XM0CSN1*/ #define DM9000_IO (CONFIG_DM9000_BASE) #define DM900

qq874692826的专栏 650

友坚U-boot-1.1.6学习及移植dm9000a驱动

1.  u-boot的源码顶层目录说明 目    录                特    性                解 释 说 明 board                平台依赖              /board/samsung/smdk6410 cpu                    平台依赖             /cpu/s3c64xx/s3c64

longtian635241的专栏 3341
上一篇: U-BOOT下使用bootm引导内核方法
下一篇: u-boot移植手册
willand1981
博客等级 码龄18年 136粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值