当前位置:  编程技术>移动开发
本页文章导读:
    ▪Tiny210 U-BOOT(十一)-DDR2初始化源码分析        Tiny210 U-BOOT(十一)----DDR2初始化源码分析1.u-boot关于DDR的源码分析在mem_setup.S中,一点一点来,先看第一段 /* DMC0 Drive Strength (Setting 2X) */ ldr r0, =ELFIN_GPIO_BASE ldr r1, =0x0000AAAA str .........
    ▪ ViewPager切换动画片PageTransformer使用        ViewPager切换动画PageTransformer使用Android从3.0开始,就添加了很多动画,ViewPager当然也不例外,相对于非常平庸的默认切换动画,Google给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransf.........
    ▪ <Example_MarkerBasedAR>中Marker.cpp的源码与详细汉语注释       <Example_MarkerBasedAR>中Marker.cpp的源码与详细中文注释/***************************************************************************** * Marker.cpp * Example_MarkerBasedAR ********************************************************.........

[1]Tiny210 U-BOOT(十一)-DDR2初始化源码分析
    来源: 互联网  发布时间: 2014-02-18
Tiny210 U-BOOT(十一)----DDR2初始化源码分析

1.u-boot关于DDR的源码分析在mem_setup.S中,一点一点来,先看第一段

   /* DMC0 Drive Strength (Setting 2X) */
    ldr    r0, =ELFIN_GPIO_BASE

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_0DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_1DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_2DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_3DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_4DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_5DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_6DRV_SR_OFFSET]

    ldr    r1, =0x0000AAAA
    str    r1, [r0, #MP1_7DRV_SR_OFFSET]

    ldr    r1, =0x00002AAA
    str    r1, [r0, #MP1_8DRV_SR_OFFSET]
首先在初始化DDR之前,引入一个关于DRAM Drive Strength的概念----DRAM Drive Strength(也被称为:driving strength),表示“DRAM驱动强度”。这个参数用来控制内存数据总线的信号强度,数值越高代表信号强度越高,增加信号强度可以提高超频的稳定性。但是并非信号强度高就一定好。
所以,这里我们需要配置这个Drive Striegth,DDR2内存的所有线都需要配置,这里我们从地址线开始看,我们的内存是挂载在Memory Port1(以下简称MP1)上,所以,先在S5PV210的芯片手册搜索Xm1ADDR。

在P63页,找到MP1的各个pin脚的描述,继续向下搜索。

在P107页,Pin脚复用的描述表里找到他的GPIO口定义

Xm1ADDR[0]~[7]的GPIO的MP1_0[0]~7是复用的,OK,搜索MP1_0。

在P122页最终找到MP1_0DRV,在这个寄存器的描述中,显示这个寄存器就是用来配置我们的内存的Drive Strength的寄存器,搜索MP1_0DRV。


找到MP1_0DRV的寄存器的配置表,这里给出的初始值是AAAA,我总共是0-7,8根线,每根线我配的值都是10,也就是2x,符合我们上面介绍DRAM Driver Strength的描述,OK,到这里我们的MP1_0寄存器----Xm1ADDR[0]~[7]的Driver Strength配置完毕。剩下的就按照上面的方法,再把剩下的线全部配好,初始均按芯片手册的参考值配为2x,也就是10。现在再回过头来看上面的初始化代码,清楚多了,整个这么一长串代码,其实只做了一件事,就是给MP1上接的内存的每一根线都配置Driver Strength的值为2x,这里有一个地方,需要注意一下,最后一个MP1_8他的参考配置为0x2AAA。照样的,再配置DM1,把Memory Port2也配置完毕,这里我们没有用到MP2,不配置,应该也没有关系。继续看下一段代码:

/* DMC0 initialization at single Type*/
    ldr    r0, =APB_DMC_0_BASE

    ldr    r1, =0x00101000                @PhyControl0 DLL parameter setting, manual 0x00101000
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x00000086                @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case
    str    r1, [r0, #DMC_PHYCONTROL1]

    ldr    r1, =0x00101002                @PhyControl0 DLL on
    str    r1, [r0, #DMC_PHYCONTROL0]

    ldr    r1, =0x00101003                @PhyControl0 DLL start
    str    r1, [r0, #DMC_PHYCONTROL0]

根据芯片手册给出的参考步骤,第2步如下:

2.依照时钟频率正确配置PhyControl0.ctrl_start_point和PhyControl0.ctrl_inc bit-fields的值。配置的PhyControl0.ctrl_dll_on值为'1'以打开PHY DLL。

那开始配置PhyControl0的相关位,P614页找到DRAM的寄存器配置表,找到有关PhyControl0的寄存器为PHYCONTROL0

OK,我们需要正确配置PhyControl0寄存器的ctrl_start_point和ctrl_inc这两个位的值,OK,查看寄存器的描述


ctrl_start_point和ctrl_inc这两位芯片手册上给的参考值为0x10,先配这两位,则为:
ctrl_start_point: 0x10 ---- 10000(二进制)
ctrl_inc: 0x10 ---- 10000(二进制)
其余的位全部配成0,最终为10000 00010000 00000000 ---- 0x00101000,代码如下:
    ldr    r0, =APB_DMC_0_BASE

    ldr    r1, =0x00101000                @PhyControl0 DLL parameter setting, manual 0x00101000
    str    r1, [r0, #DMC_PHYCONTROL0]
第2步配置完成,接着往下看第3步--3.DQS Cleaning:依照时钟频率和内存的tAC参数正确设置PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields位的值。

查看PhyControl1的ctrl_shiftc和ctrl_offsetc这两位的描述

我们的内存是DDR2-800,所以ctrl_shiftc配置为0x6 ---- 110,ctrl_offsetc的配置暂时参考三星的裸板参数配置为0,ctrl_ref配置为1000,整理代码如下:

 ldr    r1, =0x00000086                @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case
 str    r1, [r0, #DMC_PHYCONTROL1]
按照第2步的要求,打开PLL,将PhyControl0.ctrl_dll_on配置为1
    ldr    r1, =0x00101002                @PhyControl0 DLL on
    str    r1, [r0, #DMC_PHYCONTROL0]
继续第4步--4.配置PhyControl0.ctrl_start位的值为'1'
    ldr    r1, =0x00101003                @PhyControl0 DLL start
    str    r1, [r0, #DMC_PHYCONTROL0]
后面的步骤,全部是按照三星的芯片手册上的那28步来一步一步的在操作寄存器,没有一步有漏掉,所以,对比着芯片手册上的那28步一行一行的查看代码就OK了。有一点,在配置完16-25步后,到第26步时--配置第26步--26.如果有两组DDR芯片,重复14-25步配置chip1的内存,刚刚配置的是chip0,也就是第一组内存芯片。这里就把第16-25步重新再做一次,初始化chip1就OK了。代码太多,这里就不详细重复了,我这里参考的是三星的裸板的DDR源码。至此,DDR的源码也分析完成,下面,应该可以开始将这些移植进一个新的u-boot中去了。









    
[2] ViewPager切换动画片PageTransformer使用
    来源: 互联网  发布时间: 2014-02-18
ViewPager切换动画PageTransformer使用

Android从3.0开始,就添加了很多动画,ViewPager当然也不例外,相对于非常平庸的默认切换动画,Google给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransformer,实际上我们也可以通过实现ViewPager.PageTransformer来做出完全不同的切换动画效果。关键是要理解transformPage(View view, float position)的参数。view理所当然就是滑动中的那个view,position这里是float类型,不是平时理解的int位置,而是当前滑动状态的一个表示,比如当滑动到正全屏时,position是0,而向左滑动,使得右边刚好有一部被进入屏幕时,position是1,如果前一页和下一页基本各在屏幕占一半时,前一页的position是-0.5,后一页的posiotn是0.5,所以根据position的值我们就可以自行设置需要的alpha,x/y信息。

下面,我们来看看Google官方提供的两种动画效果的代码,很简单,相信每个人看过之后,都能自己实现一种动画效果,

DepthPageTransformer:

public class DepthPageTransformer implements PageTransformer {
	private static float MIN_SCALE = 0.75f;

	@SuppressLint("NewApi")
	@Override
	public void transformPage(View view, float position) {
		int pageWidth = view.getWidth();
		if (position < -1) { // [-Infinity,-1)
								// This page is way off-screen to the left.
			view.setAlpha(0);
		} else if (position <= 0) { // [-1,0]
									// Use the default slide transition when
									// moving to the left page
			view.setAlpha(1);
			view.setTranslationX(0);
			view.setScaleX(1);
			view.setScaleY(1);
		} else if (position <= 1) { // (0,1]
									// Fade the page out.
			view.setAlpha(1 - position);
			// Counteract the default slide transition
			view.setTranslationX(pageWidth * -position);
			// Scale the page down (between MIN_SCALE and 1)
			float scaleFactor = MIN_SCALE + (1 - MIN_SCALE)
					* (1 - Math.abs(position));
			view.setScaleX(scaleFactor);
			view.setScaleY(scaleFactor);
		} else { // (1,+Infinity]
					// This page is way off-screen to the right.
			view.setAlpha(0);

		}
	}

}

ZoomOutPageTransformer:

public class ZoomOutPageTransformer implements PageTransformer {
	private static float MIN_SCALE = 0.85f;

	private static float MIN_ALPHA = 0.5f;

	@Override
	public void transformPage(View view, float position) {
		int pageWidth = view.getWidth();
		int pageHeight = view.getHeight();

		if (position < -1) { // [-Infinity,-1)
								// This page is way off-screen to the left.
			view.setAlpha(0);
		} else if (position <= 1) { // [-1,1]
									// Modify the default slide transition to
									// shrink the page as well
			float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
			float vertMargin = pageHeight * (1 - scaleFactor) / 2;
			float horzMargin = pageWidth * (1 - scaleFactor) / 2;
			if (position < 0) {
				view.setTranslationX(horzMargin - vertMargin / 2);
			} else {
				view.setTranslationX(-horzMargin + vertMargin / 2);
			}
			// Scale the page down (between MIN_SCALE and 1)
			view.setScaleX(scaleFactor);
			view.setScaleY(scaleFactor);
			// Fade the page relative to its size.
			view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)
					/ (1 - MIN_SCALE) * (1 - MIN_ALPHA));
		} else { // (1,+Infinity]
					// This page is way off-screen to the right.
			view.setAlpha(0);
		}
	}
}


有了这两种效果,我们在代码中设置一下就生效了:mPager.setPageTransformer(true, new DepthPageTransformer());


下面是效果图:第一张是DepthPageTransformer效果,第二张是ZoomOutPageTransformer效果。

 

OK,最后奉上源代码:http://download.csdn.net/detail/weidi1989/6443601



    
[3] <Example_MarkerBasedAR>中Marker.cpp的源码与详细汉语注释
    来源: 互联网  发布时间: 2014-02-18
<Example_MarkerBasedAR>中Marker.cpp的源码与详细中文注释
/*****************************************************************************
 *   Marker.cpp
 *   Example_MarkerBasedAR
 ******************************************************************************
 *   by Khvedchenia Ievgen, 5th Dec 2012
 *   http://computer-vision-talks.com
 ******************************************************************************
 *   Ch2 of the book "Mastering OpenCV with Practical Computer Vision Projects"
 *   Copyright Packt Publishing 2012.
 *   http://www.packtpub.com/cool-projects-with-opencv/book
 *****************************************************************************/

#include "Marker.hpp"
#include "DebugHelpers.hpp"

Marker::Marker()
: id(-1)// id初始化为-1
{
}

// 重载了‘<’运算符
bool operator<(const Marker &M1,const Marker&M2)
{
    return M1.id<M2.id;
}

// 顺时针旋转标记矩阵
cv::Mat Marker::rotate(cv::Mat in)
{
    cv::Mat out;
    in.copyTo(out);
    for (int i=0;i<in.rows;i++)
    {
        for (int j=0;j<in.cols;j++)
        {
            out.at<uchar>(i,j)=in.at<uchar>(in.cols-j-1,i);
        }
    }
    return out;
}

// 计算标记矩阵的海明距离
int Marker::hammDistMarker(cv::Mat bits)
{
    // bits中的每一行,都要与ids中的所有行进行比较
    int ids[4][5]=
    {
        // id的顺序无所谓
        {1,0,0,0,0},
        {1,0,1,1,1},
        {0,1,0,0,1},
        {0,1,1,1,0}
    };
    
    int dist=0;
    
    // rows
    for (int y=0;y<5;y++)
    {
        int minSum=1e5; // hamming distance to each possible word
        
        for (int p=0;p<4;p++)
        {
            int sum=0;
            // 统计海明距离
            // cols
            for (int x=0;x<5;x++)
            {
                sum += (bits.at<uchar>(y,x) == ids[p][x]) ? 0 : 1;
            }
            // 求bits中第y行与ids中第p行的最小距离
            if (minSum>sum)
                minSum=sum;
        }
        
        // 计算bits中所有行的总距离
        dist += minSum;
    }
    
    return dist;
}

// mat转id
int Marker::mat2id(const cv::Mat &bits)
{
    int val=0;
    for (int y=0;y<5;y++)
    {
        val<<=1;// val=val<<1
        // 只有1和3位是有用的,其他3位(0 2 4)是校验位
        if ( bits.at<uchar>(y,1)) val|=1;
        val<<=1;
        if ( bits.at<uchar>(y,3)) val|=1;
    }
    return val;
}

int Marker::getMarkerId(cv::Mat &markerImage,int &nRotations)
{
    assert(markerImage.rows == markerImage.cols);
    assert(markerImage.type() == CV_8UC1);
    
    cv::Mat grey = markerImage;
    
    // Threshold image
    cv::threshold(grey, grey, 125, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
    
#ifdef SHOW_DEBUG_IMAGES
    cv::showAndSave("Binary marker", grey);
#endif
    
    //Markers  are divided in 7x7 regions, of which the inner 5x5 belongs to marker info
    //the external border should be entirely black
    // 检测是否是标记的边界
    int cellSize = markerImage.rows / 7;
    
    for (int y=0;y<7;y++)
    {
        int inc=6;
        
        if (y==0 || y==6) inc=1; //for first and last row, check the whole border
        
        for (int x=0;x<7;x+=inc)
        {
            int cellX = x * cellSize;
            int cellY = y * cellSize;
            // 在grey矩阵中取ROI矩阵
            cv::Mat cell = grey(cv::Rect(cellX,cellY,cellSize,cellSize));
            
            int nZ = cv::countNonZero(cell);
            
            if (nZ > (cellSize*cellSize) / 2)
            {
                return -1;//can not be a marker because the border element is not black!
            }
        }
    }
    
    cv::Mat bitMatrix = cv::Mat::zeros(5,5,CV_8UC1);
    
    //get information(for each inner square, determine if it is  black or white)
    // 根据5*5的黑白格子元素来设置bitMatrix矩阵:白色=1 黑色=0
    for (int y=0;y<5;y++)
    {
        for (int x=0;x<5;x++)
        {   // 从5*5的第一个格子开始
            int cellX = (x+1)*cellSize;
            int cellY = (y+1)*cellSize;
            // 在grey矩阵中取ROI矩阵
            cv::Mat cell = grey(cv::Rect(cellX,cellY,cellSize,cellSize));
            
            int nZ = cv::countNonZero(cell);
            if (nZ> (cellSize*cellSize) /2)
                bitMatrix.at<uchar>(y,x) = 1;
        }
    }
    
    //check all possible rotations
    cv::Mat rotations[4];
    int distances[4];
    
    rotations[0] = bitMatrix;
    distances[0] = hammDistMarker(rotations[0]);
    // 将第一个标记的海明距离作为最小距离
    // 键值对里存的时 1.最小距离 2.对应标记的索引
    std::pair<int,int> minDist(distances[0],0);
    
    for (int i=1; i<4; i++)
    {
        //get the hamming distance to the nearest possible word
        // 将其余的三种旋转可能标记的海明距离与最小距离进行比较ß
        rotations[i] = rotate(rotations[i-1]);
        distances[i] = hammDistMarker(rotations[i]);

        if (distances[i] < minDist.first)
        {
            minDist.first  = distances[i];
            minDist.second = i;
        }
    }
    // 保存识别出的标记的索引
    nRotations = minDist.second;
    if (minDist.first == 0)
    {
        return mat2id(rotations[minDist.second]);
    }
    
    return -1;
}

void Marker::drawContour(cv::Mat& image, cv::Scalar color) const
{
    float thickness = 2;
    
    cv::line(image, points[0], points[1], color, thickness, CV_AA);
    cv::line(image, points[1], points[2], color, thickness, CV_AA);
    cv::line(image, points[2], points[3], color, thickness, CV_AA);
    cv::line(image, points[3], points[0], color, thickness, CV_AA);
}


另附上TinyLA.cpp中的相关注释:

bool isInto(cv::Mat &contour, std::vector<cv::Point2f> &b)
{
  for (size_t i=0;i<b.size();i++)
  {
      // 检查指定的点和指定的多边形的相对位置关系(在多边形内、外、边上或顶点上)
      // 返回值:该点和多边形上最近的一条边有符号的距离(>0表示在内部,<0表示在外部,=0表示在边上)
      // 当最后一个参数值为0的时候,返回的距离只会是100或-100.
      if (cv::pointPolygonTest( contour,b[i],false)>0) return true;
  }
  return false;
}










    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
c/c++ iis7站长之家
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3