Author:DriverMonkey
phone:13410905075
mail:bookworepeng@hotmail.com
QQ:196568501
因为开发上的用的是DDR2 而我们项目中用的是DDR3,所以需要我们进行修改
1. 刚开始调试的时候按照TI FAE 给的文档调试 DDR3(文档名:DDR3 Software Leveling and Registers Configuration.pdf 作者:garry)
但是一直有问题,卡在了用CCS5 运行 DDR3_slave_ratio_search_auto.out 这个软件的时候 老是进入了死循环
2. 继续找资料,最后在github 上找到了一个用DDR3例子
3. 移植例子,系统起来
以下是我移植的代码:
#define DDR3_EMIF_READ_LATENCY 0x100006 /* Enable Dynamic Power Down */ #define DDR3_EMIF_TIM1 0x0888A39B #define DDR3_EMIF_TIM2 0x26337FDA #define DDR3_EMIF_TIM3 0x501F830F #define DDR3_EMIF_SDCFG 0x61C04AB2 #define DDR3_EMIF_SDREF 0x0000093B #define DDR3_ZQ_CFG 0x50074BE4 #define DDR3_DLL_LOCK_DIFF 0x1 #define DDR3_RATIO 0x40 #define DDR3_INVERT_CLKOUT 0x1 #define DDR3_RD_DQS 0x3B #define DDR3_WR_DQS 0x85 #define DDR3_PHY_WR_DATA 0xC1 #define DDR3_PHY_FIFO_WE 0x100 #define DDR3_IOCTRL_VALUE 0x18B /* Micron ???? on 1.5 and later EVMs */ #define DDR3_EMIF_TIM2_EVM 0x26517FDA #define DDR3_EMIF_TIM3_EVM 0x501F851F #define DDR3_RD_DQS_EVM 0x3A #define DDR3_WR_DQS_EVM 0x0CD #define DDR3_PHY_FIFO_WE_EVM 0x10B #define DDR3_PHY_WR_DATA_EVM 0x106 #define DATA1_RD_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x16C) #define EMIF0_0_ZQ_CONFIG (EMIF4_0_CFG_BASE + 0xC8) #define DATA1_WR_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x180) #define DATA1_FIFO_WE_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x1AC) #define DATA1_WR_DATA_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x1C4) #define MDDR_SEL_DDR2 0xefffffff /* IOs set for DDR2-STL Mode */ #define CKE_NORMAL_OP 0x00000001 /* Normal Op:CKE controlled by EMIF */ static void config_emif_ddr3(void) { /*Program EMIF0 CFG Registers*/ writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1); writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1_SHADOW); writel(DDR3_EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_2); writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1); writel(DDR3_EMIF_TIM1, EMIF4_0_SDRAM_TIM_1_SHADOW); writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2); writel(DDR3_EMIF_TIM2, EMIF4_0_SDRAM_TIM_2_SHADOW); writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3); writel(DDR3_EMIF_TIM3, EMIF4_0_SDRAM_TIM_3_SHADOW); writel(DDR3_EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL); writel(DDR3_EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL_SHADOW); writel(DDR3_ZQ_CFG, EMIF0_0_ZQ_CONFIG); writel(DDR3_EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG); } #ifndef PRCM_MOD_EN #define PRCM_MOD_EN 0x2 #endif void enable_ddr3_clocks(void) { /* Enable the EMIF_FW Functional clock */ writel(PRCM_MOD_EN, CM_PER_EMIF_FW_CLKCTRL); /* Enable EMIF0 Clock */ writel(PRCM_MOD_EN, CM_PER_EMIF_CLKCTRL); /* Poll if module is functional */ while ((readl(CM_PER_EMIF_CLKCTRL)) != PRCM_MOD_EN); } static void phy_config_cmd(void) { writel(DDR3_RATIO, CMD0_CTRL_SLAVE_RATIO_0); writel(DDR3_INVERT_CLKOUT, CMD0_INVERT_CLKOUT_0); writel(DDR3_RATIO, CMD1_CTRL_SLAVE_RATIO_0); writel(DDR3_INVERT_CLKOUT, CMD1_INVERT_CLKOUT_0); writel(DDR3_RATIO, CMD2_CTRL_SLAVE_RATIO_0); writel(DDR3_INVERT_CLKOUT, CMD2_INVERT_CLKOUT_0); } static void phy_config_data(void) { writel(DDR3_RD_DQS, DATA0_RD_DQS_SLAVE_RATIO_0); writel(DDR3_WR_DQS, DATA0_WR_DQS_SLAVE_RATIO_0); writel(DDR3_PHY_FIFO_WE, DATA0_FIFO_WE_SLAVE_RATIO_0); writel(DDR3_PHY_WR_DATA, DATA0_WR_DATA_SLAVE_RATIO_0); writel(DDR3_RD_DQS, DATA1_RD_DQS_SLAVE_RATIO_0); writel(DDR3_WR_DQS, DATA1_WR_DQS_SLAVE_RATIO_0); writel(DDR3_PHY_FIFO_WE, DATA1_FIFO_WE_SLAVE_RATIO_0); writel(DDR3_PHY_WR_DATA, DATA1_WR_DATA_SLAVE_RATIO_0); } static void config_am335x_ddr3(void) { enable_ddr3_clocks(); config_vtp(); phy_config_cmd(); phy_config_data(); /* set IO control registers */ writel(DDR3_IOCTRL_VALUE, DDR_CMD0_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_CMD1_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_CMD2_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_DATA0_IOCTRL); writel(DDR3_IOCTRL_VALUE, DDR_DATA1_IOCTRL); /* IOs set for DDR3 */ writel(readl(DDR_IO_CTRL) & MDDR_SEL_DDR2, DDR_IO_CTRL); /* CKE controlled by EMIF/DDR_PHY */ writel(readl(DDR_CKE_CTRL) | CKE_NORMAL_OP, DDR_CKE_CTRL); config_emif_ddr3(); }
今天遇到一个很郁闷的问题:新做的ipad程序中,界面居然在未作任何配置的情况下不支持旋转了。
通过在uitabbarcontroller的旋转事件添加nslog发现,其完全没有被触发。
通过网上查资料 在cocochina上找到了答案
是位hanzengbo 的朋友的解答 原文如下
“昨天忙乎了一天,没搞定。今天早上终于搞定了。贴出来希望能对遇到相似问题的哥们有用。前面搜到的答案都说是uitabbarcontroller的问题。但是我重新写了个小程序,也使用了tabbar这个控件,发现每个窗体也是能触发旋转事件的。昨天在tabbarcontroller这个地方弄了一天,一直没有弄成功。但是有一点可以肯定,就是旋转事件是被父窗体劫持了,从而使得tabbar中的每个窗体不能接受到旋转事件。今天来重新看了一下程序,发现问题在于我的程序开始有个启动窗体,在delegate文件中,我把tabbarcontroller的view加进了这个启动窗体,所以整个程序的父窗体就是这个启动窗体。我在启动窗体的旋转事件中打印log信息,能够成功。为了让tabbar的每个view能够响应旋转事件,就只能让他们成为单独的父窗体。所以我修改启动窗体代码,首先在delegate中addsubview 启动窗体,然后addsubview tabbar的窗体,在启动画面显示一定时间后,就把启动窗体从window中remove掉,这样下面的tabbar窗体就显示出来了,而且tabbar的窗体成为了父窗体,能够正常接受到旋转时间。”
和我一样,我也有登录窗 嘿嘿 太巧了
[[[self.view.superview subviews] objectAtIndex:0] removeFromSuperView];
搞定 。
界面正常了 。ios要学的东西真很多,为自己鼓劲 特此记录
注:
要翻转的时候,首先响应的方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return YES则支持翻转,NO则不支持。
紧接着
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
被调用。这个方法是发生在翻转开始之前。一般用来禁用某些控件或者停止某些正在进行的活动,比如停止视频播放。
再来是
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
这个方法发生在翻转的过程中,一般用来定制翻转后各个控件的位置、大小等。可以用另外两个方法来代替:willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: 和 willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
最后调用的是
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
这个方法发生在整个翻转完成之后。一般用来重新启用某些控件或者继续翻转之前被暂停的活动,比如继续视频播放。
1.view controller没有完成代理方法
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
也要实现了shouldAutorotateToInterfaceOrientation方法,同时shouldAutorotateToInterfaceOrientation方法要返回YES来支持所有的旋转方向
2.view controller的UIView属性嵌入在UIWindow中,并非是一个附加的view controller
你可能会发现shouldAutorotateToInterfaceOrientation方法只会在view controller启动的时候被调用,不会因为设置的旋转而在被调用。这是因为view controller束缚着他们所管理的视图,view controller是用来处理时间的响应链的一部分。view controller是从UIResponder继承而来,同时他被插入到他所管理的视图和他的superview之间。因此,通常的做法是在你的app中有一个主view controller来作为响应链的一部分。通常来说会添加一个主view controller,例如UINavigationController, UITabBarController或者UIViewController到UIWindow上。
例如
[myWindow addSubview:primaryViewController.view];
如果你添加了另外一个view controller的UIView属性到UIWindow(anotherController和主view controller在同一个等级上)
[myWindow addSubview:anotherController.view];
anotherController将不会接受旋转事件,只有第一个view controller(primaryViewController)会接受旋转事件。
3.你添加了view controller的UIView属性到UIWindow作为subview,但是过早的release它。
UIWindow会retain视图,而不是view controller。你不能过早的release他。在UIApplicationDelegate子类中定义他为retain属性。
4.在UITabBarController或者UINavigationController中的子view controller没有对同一方向的支持。
为了确保所有的子view controller旋转正确,你的每一个view controller,每一个tab或者额navigation都要完成shouldAutorotateToInterfaceOrientation,而且必须支持对于同一方向的旋转,也就是说对于同一方向的位置要返回为YES。
5.重写-(id)init:或者 -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle 方法的时候没有调用super。
对于对象的初始化,在你的view controller的init或者initWithNibName方法中必须要调用super。
/////////////
音频视频播放:http://blog.sina.com.cn/s/blog_6f1a34260100tlvx.html
////////转载
iphone提供了优秀的重力加速计,能够很灵敏地感应到手机的屏幕状态。在我们开发iphone应用时,为了提高用户体验,会来监听屏幕的当前状态。
对于UIViewController来说,提供了好几种方法。
最简单的就是我们可以使用Interface Builder这个工具来帮助我们实现简单的屏幕界面适配,只需要在IB 中的Size Insepector 中通过对Autosizing 的
设置来实现。但这只能做到简单界面的实现,如果界面比较复杂,可能就需要我们通过代码来实现。
第二个我们可以通过对 willAnimateRotationToInterfaceOrientation:duration:这个方法的重写来配置我们的自动旋转。
第三,你也可以通过对willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:与willAnimateSencondHalfOfRotationToInterfaceOrientation:duration:两个方法的重写来更加精细地配置我们的自动旋转视图。特别需要注意 的就是前一个方法在执行时,此时的UIInterfaceOrientation仍然是旋转前的原有值,只有后一个方法在执行时UIInterfaceOrientation才是屏幕旋转后的值。
上一篇介绍编译Android4.2的文章中提到在新编出来的系统中Google Service app都没有了,这并不是我们少加了什么参数或者忘编了什么东西,而是这些google自有的app和服务都是不开放的,并非包含在Android代码里。参考“
Q:How can I get access to the Google apps for Android, such as Maps?
A:The Google apps for Android, such as YouTube, Google Maps and Navigation, Gmail, and so on are Google properties that are not part of Android, and are licensed separately. Contact android-partnerships@google.com for inquiries related to those apps.”
所以我们编出来的系统或者其他第三方ROM默认都没有Google app,我们得自己想办法恢复。其实很简单!
网上有老外打包好的google服务包,包括apk、framework层的jar包和运行时依赖的.so库等文件,下载这样的Google服务包,使用他们提供的recovery文件恢复到手机即可。
第一步:下载recovery程序和google app包:
1.可以从这里下载最新的google app包,Nexus4对应的地址是:http://clockworkmod.com/rommanager/developers/mako?name=Google%20Nexus%204,选择最下面的Google apps,下载最新的压缩包:gapps-jb-20121212-signed.zip。(注:这个网站还有很多其他型号手机的ROM下载,基本上一线厂商的明星手机都包括了,但是我找了半天居然没发现SONY。。。)
2.下载recovery程序:http://download2.clockworkmod.com/recoveries/recovery-clockwork-6.0.2.3-mako.img
第二步:拷贝google app包到手机sd卡,例如文件名叫gapps-jb-20130301-signed.zip
重启手机进入bootloader模式,执行:
1.fastboot flash recovery recovery.img (recovery.img就是自己刚刚下载的recovery文件,可能会叫其它名字)
sending 'recovery' (7628 KB)...
OKAY [ 0.478s]
writing 'recovery'...
OKAY [ 0.393s]
finished. total time: 0.872s
2.进入recovery模式,选择update from sdcard, 然后选择“0”,进入sdcard选择存放gapps-jb-20130301-signed.zip的目录,选中该文件执行安装即可(界面上具体的名字和命令名我记不清了,按提示操作应该就行,这个过程中间可以选择wipe cache和wipe userdate,反正我觉得无所谓做不做)。
至此已经基本完成。
但是进入目录后发现gmail、map等程序还是木有,没办法,人家提供的google app.zip里没有这些apk,但是现在已经可以连上google player了,就手动从market上下载需要用到的程序吧。不知道还有没有更好的办法?