GPMC总线问题
AM3359 GPMC总线上挂了NAND,现在想再挂一个ST16C554(串口扩展芯片),驱动移植过程中:内核无法启动直接死在booting kernel那里,跟踪发现是因为gpmc_cs_request的问题,不知道是什么导致的,不申请地址空间,内核能够起来。加上这句就不行了。跪求大神指点。。谢谢 申请地址空间冲突了吧...... 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;
}
= = 这我随便怎么设。。不同设备最终都会设成这个默认值。是这里发生冲突了么?谢谢解答。 if (cpu_is_am33xx()) {
*base = 0x8000000;
*size = 0x10000000;
}
这是哪里来的?...... 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)初始化函数调用,您看下,谢谢回答 看代码的话就是说,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 = {
{ 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.pdata = pdata;
gpmc_device.flag = GPMC_DEVICE_NAND;
omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
omap_init_elm();
}
这个是不是有冲突...... 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被映射到这个空间,那我再去申请另一个设备,即便是对它设定了。。到时候又成了默认值,出现两个设备同一地址跟大小,,是这样冲的吧? 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
以上三个函数中打印了寄存器的值,默认值应该是没有影响的,后两个函数在第一个函数之后再去配了寄存器,所以不会是地址空间冲突吧= = ╮(╯▽╰)╭ 再找找其他原因了。 怎么弄都一样只要一加gpmc_cs_request() 就死在了Uncompressing Linux... done, booting the kernel.
求指点啊 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,)就不行,不知道为啥= = 15228876176 发表于 2015-6-10 20:17
今天突然发现gpmc_cs_request(cs=1,)就可以,但是gpmc_cs_request(cs=2,)就不行,不知道为啥= = ...
不太清楚,没有详细研究过...... 请楼主留下qq,看看能否支持您! 今天突然发现gpmc_cs_request(cs=1,)就可以,但是gpmc_cs_request(cs=2,)就不行,不知道为啥= =
这个我知道为什么!!
请加我qq
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, 盈鹏飞科技 发表于 2015-6-11 12:43
请楼主留下qq,看看能否支持您!
= = 我买的你们的板子 我有您的QQ9908。。。 楼主,请问你的问题解决了吗?我现在遇到了和你一样的问题,搞了好久也没解决?
页:
[1]