今天郁闷中,遇到一个奇怪的问题

hjklhu   2009-9-23 20:53 楼主
在eboot下我写了如下代码:
volatile S3C2440A_IOPORT_REG *s2440IOP ;
s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);

s2440IOP->GPFDAT &=0xFB;
mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=0xFB无效,加上延时才有效,也就是bit[2]不会等于零
s2440IOP->GPFDAT &=0xFE;

mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=0xFB无效,加上延时才有效
——这个问题我觉得很奇怪,对于地址,是uncache地址了,怎么2440速度这么慢呢!
我觉得很不解,加个延时,啥都好了,不会2440会这么奇怪吧。

还有,如果这样写                s2440IOP->GPFDAT=(s2440IOP->GPFDAT&0xFB)&0xFE;又完全正确,真是神了。

还有
// Set GPF0  as output pin
        s2440IOP->GPFCON &=~(1<<1);
        s2440IOP->GPFCON |=(1<<0);

这样一个与与一个或搭配又完全正确,

请问各位大侠,我是否犯了严重基础错误,我检查了一个下午,也找不出原因。

请指点,多谢。


回复评论 (58)

下班,嘿嘿。
一个小问题折腾N久。
点赞  2009-9-23 20:57
其实当我们真正关注这些基础性的问题的时候,就意味着我们真在具备原始创新(1次开发)的能力!
   

我写驱动都是这样的
s2440IOP->GPFCON &=~(1 < <1);
s2440IOP->GPFCON |=(1 < <0);
有些语句如:
s2440IOP->GPFDAT &=0xFE;
我也会写上两边,确保生效,   
  是不是速度问题我也不知道!  
点赞  2009-9-23 21:14
其实最郁闷的是
自己的写的驱动跟 三星 BSP的驱动 总是有很大的差距,   
----------------
很多问题:比如稳定性 忧劣性 等 都做的不是很好,感觉就是勉强能用而已。
     ---------------
点赞  2009-9-23 21:20

5楼 123 

s2440IOP->GPFDAT &=0xFB;
mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=0xFB无效,加上延时才有效,也就是bit[2]不会等于零
s2440IOP->GPFDAT &=0xFE;

把上面的改成

s2440IOP->GPFDAT &=~(1<<2);
mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=~(1<<2); 无效,加上延时才有效,也就是bit[2]不会等于零
s2440IOP->GPFDAT &=~(1<<0);


如果我去掉这个延时会一样导致s2440IOP->GPFDAT &=~(1<<2); 无效

好多问题,所以希望各位指点一下,虽然简单,我想不出有什么好的解决办法,所以厚着脸皮来问了,嘿嘿。

点赞  2009-9-23 22:06
中间是不是改变了GPIOF[2]的输入输出控制寄存器,一般改变DAT的之前都配置下GPFCON。或者用个临时变量保存数据寄存器的值,然后对这个值操作,完成后写入数据寄存器。(没用过2440,浅见。)
点赞  2009-9-23 22:34
请教下gooogleman,2440跑10寸的屏效果怎么样,有没有试过?
点赞  2009-9-23 22:42
引用: 引用 6 楼 rockursoul 的回复:
请教下gooogleman,2440跑10寸的屏效果怎么样,有没有试过?


没有,我只用过3.5和4.3的

大家都反映2440驱动这么大LCD会有问题,目前飞凌,TQ等都没有做10寸的屏幕。
点赞  2009-9-23 22:47
谢谢,呵呵~
引用: 引用 7 楼 gooogleman 的回复:
引用 6 楼 rockursoul 的回复:
请教下gooogleman,2440跑10寸的屏效果怎么样,有没有试过?


没有,我只用过3.5和4.3的

大家都反映2440驱动这么大LCD会有问题,目前飞凌,TQ等都没有做10寸的屏幕。
点赞  2009-9-23 23:03
嘿嘿,明天要解决这个奇怪的问题。
点赞  2009-9-23 23:55
怀疑还是Cache的问题,再检查一下端口寄存器所在地址空间是否启用了Cache
点赞  2009-9-24 08:20
引用: 引用 10 楼 ccyu 的回复:
怀疑还是Cache的问题,再检查一下端口寄存器所在地址空间是否启用了Cache


s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);


This function returns the cached or uncached virtual address for a specified physical address.

VOID* OALPAtoVA(
  UINT32 pa,
  BOOL cached
)
Parameters
pa
[in] Specified physical address.
cached
[in] Indicates whether the virtual address is cached. A value of TRUE indicates that it is a cached address. A value of FALSE indicates that it is uncached.
Return Values
Returns the cached or uncached virtual address.
我现在已经是uncached了

我直接用uncached 地址访问试试。




点赞  2009-9-24 08:38
引用: 引用 10 楼 ccyu 的回复:
怀疑还是Cache的问题,再检查一下端口寄存器所在地址空间是否启用了Cache


很无语哦,我直接用uncached 地址访问也要延时才能达到目的,咋回事,郁郁了!

#define rGPFCON (*(volatile unsigned *)0xB1600050)
#define rGPFDAT (*(volatile unsigned *)0xB1600054)
#define rGPFUP  (*(volatile unsigned *)0xB1600058)

以前我在camera驱动中就是这么做的。真是晕死了。
点赞  2009-9-24 09:15
除了软件上不启用Cache,还需要设置硬件寄存器不启用Cache,一般是MMU中的Region Configuration Register中来设置,这个需要在Bootloader中修改的。
点赞  2009-9-24 09:47
对了,你顺便把Write Buffer也关闭试试
点赞  2009-9-24 09:52
引用: 引用 14 楼 ccyu 的回复:
对了,你顺便把Write Buffer也关闭试试


嗯,现在发现延时要足够,否则也会不成功。

慢慢尝试。学习!
点赞  2009-9-24 10:03
有的硬件相关的设置确实需要增加延时。你试试把延时去掉,然后同样的赋值动作连续做两到三遍,能否有效果。
点赞  2009-9-24 10:11
学习,帮顶
点赞  2009-9-24 10:30
根据你说得发现一个问题,
你说这样操作是可以的:
还有
// Set GPF0  as output pin
s2440IOP->GPFCON &=~(1 < <1);
s2440IOP->GPFCON |=(1 < <0);

这样一个与与一个或搭配又完全正确,

但是
s2440IOP->GPFDAT &=~(1 < <2);
mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=~(1 < <2); 无效,加上延时才有效,也就是bit[2]不会等于零
s2440IOP->GPFDAT &=~(1 < <0);

从上面的代码来看没有什么特别的差异,从你的代码看是把这个IO设置成了Output,
会不会硬件连接会导致这个问题?
还有你试过别的GPIO的DAT也有同样的问题吗?
点赞  2009-9-24 10:40
引用: 引用 18 楼 gsymichael 的回复:
根据你说得发现一个问题,
你说这样操作是可以的:
还有
// Set GPF0? as output pin
s2440IOP->GPFCON &=~(1 < <1);
s2440IOP->GPFCON |=(1 < <0);

这样一个与与一个或搭配又完全正确,
但是
s2440IOP->GPFDAT &=~(1 < <2);
mdelay(1);//如果我去掉这个延时,会导致s2440IOP->GPFDAT &=~(1 < <2); 无效,加上延时才有效,也就是bit[2]不会等于零
s2440IOP->GPFDAT &=~(1 < <0);
从上面的代码来看没有什么特别的差异,从你的代码看是把这个IO设置成了Output,
会不会硬件连接会导致这个问题?
还有你试过别的GPIO的DAT也有同样的问题吗?


我在OS起来后使用应用程序控制,完全没有问题的。
现在加入了一些延时就可以控制了。

这个问题比较奇怪。
点赞  2009-9-24 10:50
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复