This thread has been locked.

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

am335X添加DM9000问题

Other Parts Discussed in Thread: AM3354

你好,我使用am3354添加第三路网络dm9000a, 我使用内核自带的驱动,然后添加

#define DM9000_BASE 0x08000000                                      //csn1

static struct pinmux_config dm9000_pin_mux[] = {
{NULL, 0},
};

static struct resource dm9000_resource[] = {
[0] ={
.start = DM9000_BASE,
.end = DM9000_BASE+ 0x3,
.flags = IORESOURCE_MEM
},
[1]={
.start = DM9000_BASE + (1<<21),
.end = DM9000_BASE + (1<<21) + 0x03,
.flags = IORESOURCE_MEM
},
[2] ={
.start = GPIO_TO_PIN(2, 6), //中断号
.end = GPIO_TO_PIN(2, 6),
.flags = (IORESOURCE_IRQ | IRQF_TRIGGER_RISING |IRQF_TRIGGER_FALLING)
}
};
static struct dm9000_plat_data device_dm9000_platdata = {

.flags= DM9000_PLATF_16BITONLY,

};

struct platform_device device_dm9000 = {
.name= "dm9000",
.id= 0,
.num_resources= ARRAY_SIZE(dm9000_resource),
.resource= dm9000_resource,
.dev= {
.platform_data = &device_dm9000_platdata,
}
};j

结果在

db->addr_req = request_mem_region(db->addr_res->start, iosize,
pdev->name);

这里一直申请补成功,我想问问大家有遇到这个问题的吗?希望能够一起交流

联系:402097953

  • 请问是用GPMC和DM9000连接么?如果同时也有NAND驱动,可能是地址空间有冲突

  • nand占用了csn0  csn3,,怎么可能和csn1冲突呢?

  • \arch\arm\mach-omap2\gpmc-nand.c中的gpmc_nand_init()是nand初始化函数,会调用gpmc_cs_request()为cs0分配地址空间,默认CS0应该是0x8000000开始的256MB空间。

    你看看你CS1的空间是不是和这个空间冲突了

  • 看到这里我更加迷惑了,

    void gpmc_cs_get_memconf(int cs, u32 *base, u32 *size)
    {
    u32 l;
    u32 mask;

    l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
    *base = (l & 0x3f) << GPMC_CHUNK_SHIFT;
    mask = (l >> 8) & 0x0f;
    *size = (1 << GPMC_SECTION_SHIFT) - (mask << GPMC_CHUNK_SHIFT);

    if (cpu_is_am33xx()) {
    *base = 0x8000000;
    *size = 0x10000000;
    }
    }

    这个函数中,基地址一直是0x8000000,不管是cs0(nand)还是其他挂载的设备,基地址都是0x800 0000,这不是明显冲突了?

    这个函数为什么要加上这个cpu_is_am33xx()呢?

    然后我在dm9000.c文件里面添加了个函数dm9000_probe-->mem_base=gpmc_init(DM9000_CS);

    static unsigned long gpmc_init( int GPMC_CS )
    {
    unsigned int val;
    unsigned int base, size;
    unsigned long mem_base;

    val = gpmc_read_reg(GPMC_REVISION);

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

    //gpmc_write_reg(GPMC_IRQENABLE, 0);
    //gpmc_write_reg(GPMC_TIMEOUT_CONTROL, 0);

    /*Disable Chip Select*/
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, gpmc_dm9000[6]&(~GPMC_CONFIG7_CSVALID) );

    if (!gpmc_cs_mem_enabled(GPMC_CS))
    {
    gpmc_cs_get_memconf(GPMC_CS, &base, &size);  //这里不管GPMC_CS是多少  获取base一直是0x800 0000 为什么呢?
    printk("base= 0x%x, size=0x%x\n", base, size);
    if (gpmc_cs_insert_mem(GPMC_CS, base, size) < 0)
    BUG();
    }

    mdelay(20);
    /* Delay for settling */
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG1, gpmc_dm9000[0]);
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG2, gpmc_dm9000[1]);
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG3, gpmc_dm9000[2]);
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG4, gpmc_dm9000[3]);
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG5, gpmc_dm9000[4]);
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG6, gpmc_dm9000[5]);
    /*Enable the config*/
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, gpmc_dm9000[6]);

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

    if (gpmc_cs_request(GPMC_CS, SZ_4K, (unsigned long *)&mem_base) < 0)
    {
    printk("Failed request for GPMC mem for usrp_e\n");
    return -1;
    }
    printk("Got CS%d, address = 0x%lx\n",GPMC_CS, mem_base);
    val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
    printk("GPMC_CS_CONFIG7 value 0x%x\n", val);

    /* if ( !request_mem_region(mem_base, SZ_4K, "mem_fpga") )
    {
    printk(KERN_ERR "Request_mem_region failed.\n");
    gpmc_cs_free(GPMC_CS);
    return -1;
    }
    */
    return mem_base;
    }

    gpmc_cs_get_memconf获取的基地址 难道不应该和 GPMC_CS_CONFIG7基地址一样? 为什么还要单独配置GPMC_CS_CONFIG7呢?

    gpmc_cs_request还有个基地址,这个基地址又是什么呢?

    对于dm9000该使用哪个基地址作为数据地址呢?

    如果使用gpmc_cs_request,返回的基地址是0x01000000,程序在申请基地址内存的时候出错。

    Unable to handle kernel paging request at virtual address 01000000

  • gpmc_cs_get_memconf()会把CS0的基地址和大小固定为0x8000000和256M,这个不要改。你的DM9000如果挂在CS1上,用gpmc_cs_request()分配出来的基地址应该是0x18000000之后的地址才对。

    NAND的驱动不要做改动,也就是CS0的部分不要动,再这个基础上gpmc_cs_request()函数分配下CS1的空间并用printk()打出来看看是多少。

  • 如果不使用

    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, gpmc_dm9000[6]);来配置

    gpmc_cs_get_memconf()分配的基地址是0x100 0000, 这个显然不对。

    在申请基地址的时候任然出错

    然后我将gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, gpmc_dm9000[6]);(基地址配置成0x1900 0000)

    任然不对,还是申请基地址出问题。

  • 我确认一下,你这里定义的宏“#define DM9000_BASE 0x08000000 ”,是想把0x08000000起始地址分配给当前的DM9K吗?片选为CS1?

    在你当前的设计中,GPMC总线有几个片选是使能了的?把使能了片选信号GPMC_CONFIG7配置都发出来,核对一下地址区间的划分是否有问题。

    PS: 建议你参考一下这篇文章,明确一下地址池的划分,这样会有利于你分析这个问题:http://www.deyisupport.com/files/m/sitara_arm/11905.aspx

  • 这里定义的宏“#define DM9000_BASE 0x08000000 ”,应该是不准确的

    感觉像是从三星的系统里面直接移植过来的

  • 你好,按照你说的那个文档,我修改了一下基地址,变成

    #define STNOR_GPMC_CONFIG1 0x00001000  //?16位模式,非引脚复用?
    #define STNOR_GPMC_CONFIG2 0x00080800  //片选信号CS OffTime 48ns
    #define STNOR_GPMC_CONFIG3 0x00020201  //不使用数据/地址信号切换nADV?
    #define STNOR_GPMC_CONFIG4 0x08000800   //读使能#OE、写使能信号#WE持续48ns
    #define STNOR_GPMC_CONFIG5 0x01060D0D  //读取周期?78ns,访问36ns?
    #define STNOR_GPMC_CONFIG6 0x00000F80  // 连续访问周期间隔90ns
    #define STNOR_GPMC_CONFIG7 0x00000F50   // DM9000物理地址0x1000 0000, 16MB window

    static unsigned long gpmc_init( int GPMC_CS )
    {
     unsigned int  val;
     unsigned int  base, size;
     unsigned long mem_base;

     val = gpmc_read_reg(GPMC_REVISION);

     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7,  gpmc_dm9000[6]&(~GPMC_CONFIG7_CSVALID) ); 
     /*Disable Chip Select*/
     if (!gpmc_cs_mem_enabled(GPMC_CS))//GPMC_CONFIG7_CSVALID查看是否被占用
     {
      gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7,  gpmc_dm9000[6]&(~GPMC_CONFIG7_CSVALID) );
      gpmc_cs_get_memconf(GPMC_CS, &base, &size);
      my_debug("base= 0x%x, size=0x%x\n", base, size);
      if (gpmc_cs_insert_mem(GPMC_CS, base, size) < 0)
       BUG();
       gpmc_cs_enable_mem(GPMC_CS, base, size);
     }
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7,  gpmc_dm9000[6]&(~GPMC_CONFIG7_CSVALID) ); 
     mdelay(30);
     /* Delay for settling */
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG1, gpmc_dm9000[0]);
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG2, gpmc_dm9000[1]);
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG3, gpmc_dm9000[2]);
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG4, gpmc_dm9000[3]);
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG5, gpmc_dm9000[4]);
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG6, gpmc_dm9000[5]);
     /*Enable the config*/
     gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, gpmc_dm9000[6]|GPMC_CONFIG7_CSVALID);

     val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
     my_debug("GPMC_CS_CONFIG7 = 0x%x\n", val);

     if (gpmc_cs_request(GPMC_CS, SZ_16M, (unsigned long *)&mem_base) < 0)
     {
      printk("Failed request for GPMC mem for usrp_e\n");
      return -1;
     }
     my_debug("Got CS%d, mem_base = 0x%lx\n",GPMC_CS, mem_base);
     val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
     my_debug("GPMC_CS_CONFIG7 = 0x%x\n", val);

     return mem_base;
    }

    按照这种可以编译成功,但是我配置gpio2_6,使用了函数OMAP_GPIO_IRQ函数,然后得到中断号230

    但是我直接在中断拉高低电平,中断没有反应,中断作为输入脚我也配置了。

    想问下

    第1:我的7个config配置合适不?

    第2:我的中断号获取的合适不?

    第3:中断为什么没任何反应呢?

    谢谢

     

  • 我这边用gpmc_cs_request()分了一下CS1的地址,打印出来是0x01000000,但是驱动挂载之后没出现什么问题

  • 请问下我这边最近在使用GPMC扩展网卡,KSZ8852,我的内存分配OK了,而且也能从CMD,IO,IW,CS3引脚测量到信号,可是那些时间参数的寄存器却一直配置不好,不知道您能否帮忙设置下CONFIG2--CONFIG6寄存器呢?

    硬件信息:

    芯片型号:KSZ8852             位宽硬件设置:16bit            335x的cs引脚:CS3

    下面贴上来KSZ8852的时序图:

     

    请TI的工程师支持下,谢谢了