打印
[嵌入式Linux]

GPMC总线问题

[复制链接]
3941|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
15228876176|  楼主 | 2015-6-8 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
mini1986| | 2015-6-8 13:08 | 只看该作者
申请地址空间冲突了吧......

使用特权

评论回复
板凳
15228876176|  楼主 | 2015-6-8 16:56 | 只看该作者
mini1986 发表于 2015-6-8 13:08
申请地址空间冲突了吧......

重新检查了,寄存器配置里没有出现地址空间冲突,但是发现gpmc_mem_init(void)初始化中        for (cs = 0; cs < GPMC_CS_NUM; cs++) {
                u32 base, size;
                if (!gpmc_cs_mem_enabled(cs))
                        continue;
                gpmc_cs_get_memconf(cs, &base, &size);
                if (gpmc_cs_insert_mem(cs, base, size) < 0)
                        BUG();
        }
遍历寄存器时,gpmc_cs_get_memconf()中这样说:
        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;
        }
= = 这我随便怎么设。。不同设备最终都会设成这个默认值。是这里发生冲突了么?谢谢解答。

使用特权

评论回复
地板
mini1986| | 2015-6-8 17:09 | 只看该作者
if (cpu_is_am33xx()) {
                *base = 0x8000000;
                *size = 0x10000000;
        }
这是哪里来的?......

使用特权

评论回复
5
15228876176|  楼主 | 2015-6-8 17:27 | 只看该作者
mini1986 发表于 2015-6-8 17:09
if (cpu_is_am33xx()) {
                *base = 0x8000000;
                *size = 0x10000000;

arch/arm/mach-omap2/gpmc.c 中 gpmc_cs_get_memconf()函数里  由gpmc_mem_init(void)初始化函数调用,您看下,谢谢回答

使用特权

评论回复
6
mini1986| | 2015-6-9 08:32 | 只看该作者
看代码的话就是说,cpu_is_am33xx成立的话就执行 *base = 0x8000000;*size = 0x10000000;,是cpu决定了地址跟大小.
看看board里面的static void evm_nand_init(int evm_id, int profile)
{
        struct omap_nand_platform_data *pdata;
        struct gpmc_devices_info gpmc_device[2] = {
                { NULL, 0 },
                { NULL, 0 },
        };

        setup_pin_mux(nand_pin_mux);
        pdata = omap_nand_init(am335x_nand_partitions,
                ARRAY_SIZE(am335x_nand_partitions), 0, 0,
                &am335x_nand_timings);
        if (!pdata)
                return;
        pdata->ecc_opt =OMAP_ECC_BCH8_CODE_HW;
        pdata->elm_used = true;
        gpmc_device[0].pdata = pdata;
        gpmc_device[0].flag = GPMC_DEVICE_NAND;

        omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
        omap_init_elm();
}
这个是不是有冲突......

使用特权

评论回复
7
15228876176|  楼主 | 2015-6-9 08:52 | 只看该作者
mini1986 发表于 2015-6-9 08:32
看代码的话就是说,cpu_is_am33xx成立的话就执行 *base = 0x8000000;*size = 0x10000000;,是cpu决定了地址 ...

void evm_nand_init(int evm_id, int profile)里除了配置了时序,没有对地址跟空间大小做设定,按照默认地址跟大小的配置(0x8000000,0x10000000)的话,nand被映射到这个空间,那我再去申请另一个设备,即便是对它设定了。。到时候又成了默认值,出现两个设备同一地址跟大小,,是这样冲的吧?

使用特权

评论回复
8
15228876176|  楼主 | 2015-6-9 09:16 | 只看该作者
mini1986 发表于 2015-6-9 08:32
看代码的话就是说,cpu_is_am33xx成立的话就执行 *base = 0x8000000;*size = 0x10000000;,是cpu决定了地址 ...

gpmc_mem_init...
[    0.118072] CONFIG1_0 0x800
[    0.118072] CONFIG7_0 0x48
[    0.118072] CONFIG1_2 0x1000
[    0.118072] CONFIG7_2 0xf00

[    0.118103] gpmc_nand_init...
[    0.118347] CONFIG1_0 0x800
[    0.118347] CONFIG7_0 0xf48
[    0.118347] CONFIG1_2 0x1000
[    0.118347] CONFIG7_2 0xf00

[    0.120544] com335x_gpmc_init...
[    0.120788] CONFIG1_0 800
[    0.120788] CONFIG7_0 f48
[    0.120819] CONFIG1_2 28000000
[    0.120819] CONFIG7_2 f41

以上三个函数中打印了寄存器的值,默认值应该是没有影响的,后两个函数在第一个函数之后再去配了寄存器,所以不会是地址空间冲突吧= = ╮(╯▽╰)╭ 再找找其他原因了。

使用特权

评论回复
9
15228876176|  楼主 | 2015-6-9 14:57 | 只看该作者
  怎么弄都一样只要一加gpmc_cs_request() 就死在了  Uncompressing Linux... done, booting the kernel.
求指点啊

使用特权

评论回复
10
15228876176|  楼主 | 2015-6-10 20:17 | 只看该作者
mini1986 发表于 2015-6-9 08:32
看代码的话就是说,cpu_is_am33xx成立的话就执行 *base = 0x8000000;*size = 0x10000000;,是cpu决定了地址 ...

:L今天突然发现gpmc_cs_request(cs=1,)就可以,但是gpmc_cs_request(cs=2,)就不行,不知道为啥= =   

使用特权

评论回复
11
mini1986| | 2015-6-11 11:17 | 只看该作者
15228876176 发表于 2015-6-10 20:17
今天突然发现gpmc_cs_request(cs=1,)就可以,但是gpmc_cs_request(cs=2,)就不行,不知道为啥= =    ...

不太清楚,没有详细研究过......

使用特权

评论回复
12
盈鹏飞科技| | 2015-6-11 12:43 | 只看该作者
请楼主留下qq,看看能否支持您!

使用特权

评论回复
13
盈鹏飞科技| | 2015-6-11 12:44 | 只看该作者
今天突然发现gpmc_cs_request(cs=1,)就可以,但是gpmc_cs_request(cs=2,)就不行,不知道为啥= =
这个我知道为什么!!
请加我qq

使用特权

评论回复
14
15228876176|  楼主 | 2015-6-11 14:06 | 只看该作者
mini1986 发表于 2015-6-11 11:17
不太清楚,没有详细研究过......

现在问题更奇怪了,原因竟然是先gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7,0xf41);导致gpmc_cs_request(cs=1,)不成功卡死,不先写CONFIG7  能gpmc_cs_request(cs=1,)返回分配的基地址是0x1000000,

使用特权

评论回复
15
15228876176|  楼主 | 2015-6-11 14:07 | 只看该作者
盈鹏飞科技 发表于 2015-6-11 12:43
请楼主留下qq,看看能否支持您!

= = 我买的你们的板子 我有您的QQ9908。。。

使用特权

评论回复
16
269620154| | 2016-11-24 10:26 | 只看该作者
楼主,请问你的问题解决了吗?我现在遇到了和你一样的问题,搞了好久也没解决?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

56

帖子

0

粉丝