当前位置:  编程技术>移动开发
本页文章导读:
    ▪davinci 达芬奇 钟表驱动分析 dm365/dm368 struct clk        davinci 达芬奇 时钟驱动分析 dm365/dm368 struct clk【blog.csdn.net/lanmanck】 本文纯属啰嗦帖子,没有很高的技术含量,仅供参考。 以dm365的spi为例说明之: 1、先在dm365.c里定义几个宏: 定义PLL1/2的属.........
    ▪ 稿件4:multipart/form-data详细介绍        文章4:multipart/form-data详细介绍 转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8159701 主要内容 1.什么是Multipart/form-data? 2.上传具体的步骤: 3.关于Multipart/form-data的格式 1)概述 2).........
    ▪ 正则表达式的简略使用       正则表达式的简单使用在 4.0 之后,系统就有了它自己的类(NSRegularExpression,NSRegularExpression)来使用正则表达式,,之前都是要添加第三方类库 RegexKitLite 来使用 这两个类的简单使用: NSStri.........

[1]davinci 达芬奇 钟表驱动分析 dm365/dm368 struct clk
    来源: 互联网  发布时间: 2014-02-18
davinci 达芬奇 时钟驱动分析 dm365/dm368 struct clk

【blog.csdn.net/lanmanck】

本文纯属啰嗦帖子,没有很高的技术含量,仅供参考。

以dm365的spi为例说明之:

1、先在dm365.c里定义几个宏:

定义PLL1/2的属性:static struct pll_data pll1_data{定义寄存器基址灯}

定义参考时钟:static struct clk ref_clk={定义晶振时钟}

定义PLL1的时钟:static struct clk pll1_clk={定义parent(父类)为ref_clk,data(属性)为pll1_data}

  定义PLL1输出的时钟源,例如static struct clk pll1_sysclk6={定义parent(父类)为pll1_clk,}

定义PLL2的时钟:static struct clk pll2_clk={定义parent(父类)为ref_clk,data(属性)为pll2_data}

  定义PLL2输出的时钟源,例如static struct clk pll2_sysclk3={定义parent(父类)为pll2_clk,}

2、定义外设使用的PLL输出源:

static struct clk vpss_dac_clk={定义parent为pll1_sysclk3,LPSC=DM365_LPSC_DAC_CLK}

static struct clk spi2_clk={定义parent为pll1_sysclk4,LPSC=DM365_LPSC_SPI2}


3、定义参考时钟、pll时钟、pll输出源的查找表:

static struct clk_lookup dm365_clks[]={例如CLK("spi_davinci.2",NULL,&spi2_clk)}

4、查找表赋值给struct davinci_soc_info davinci_soc_info_dm365.cpu_clks

5、系统注册时调用davinci_common_init(struct davinci_soc_info *a),此函数会判断.cpu_clks是否有效,

如果有效,则调用davinci_clk_init进行clock初始化,看看davinci_clk_init()都干了些啥


6、davinci_clk_init() 挨个遍历查找表的clk(最后一位成员)

如果查找表中定义的clk->recalc为0(一般都为0),则赋值重计算的api。

例如找到pll1_clk,发现pll_data为pll1_data,则赋值为clk->recalc = clk_pllclk_recalc。

又如,找到标志位clk->flags & CLK_PLL,表示这个clk是PLL输出源,则赋值为clk->recalc = clk_sysclk_recalc。

又如,找到clk有父类clk->parent,表示这个是个PSC时钟,赋值为clk_recalc = clk_leafclk_recalc

因为这几个if有优先级,所以基本上顺序为:PLL、PLL输出源、外设时钟


接着,如果这个clk是PLL,则ioremap这个PLL的寄存器基址,用来后面的配置


现在,调用clk->recalc()来获得当前clk的实际时钟:clk->rate = clk->recalc(clk);

如果时钟管理有效(clk->lpsc),则把标志位置上clk->flags |= CLK_PSC;


调用clk_register(clk)注册该时钟到内核中进行管理


最后如果标志位flags有ALWAYS_ENABLED,则使能该clk:clk_enable(clk);


7、实例:SPI2就是调用clk_leafclk_recalc()来得到自己的bus clock,实际上该函数返回的就是parent的clock,

我们看到spi2_clk定义时parent=pll1_sysclk4,相当于spi2的bus时钟就是pll1_sysclk4,而这个时钟是通过

clk_sysclk_recalc()算出来的。


OK, 就这么多!



    
[2] 稿件4:multipart/form-data详细介绍
    来源: 互联网  发布时间: 2014-02-18
文章4:multipart/form-data详细介绍
转载请注明出处 http://blog.csdn.net/yankai0219/article/details/8159701
主要内容
1.什么是Multipart/form-data?
2.上传具体的步骤:
3.关于Multipart/form-data的格式
1)概述
2)详细介绍


1.什么是Multipart/form-data?
Multipart/form-data是上传文件的一种方式。

Multipart/form-data其实就是浏览器用表单上传文件的方式。最常见的情境是:在写邮件时,向邮件后添加附件,附件通常使用表单添加,也就是用multipart/form-data格式上传到服务器。

2.上传具体的步骤:
     
首先,客户端和服务器建立连接(TCP协议)。

第二,客户端可以向服务器端发送数据。因为上传文件实质上也是向服务器端发送请求。

第三,客户端按照符合“multipart/form-data”的格式向服务器端发送数据。(这一点非常重要)。

3.关于Multipart/form-data的格式
1)概述
     其实关于Multipart/form-data的格式有多重不同的表示方法,但是我认为最权威的一种说法如下:
First, there are some basics you need to understand about multipart/formdata posts. Each part consists of at least a NAME and a CONTENTS part. If the part is made for file upload, there are also a stored CONTENT-TYPE and a FILENAME. Below, we'll discuss what options you use to set these properties in the parts you want to add to your post.
首先,你需要理解一些关于multipart/formdata post的一些基础知识。每一个part包含至少一个NAME和一个CONTENT部分。如果这个part用来上传文件,那么也可以有CONTENT-TYPE和FILENAME这些信息。(from http://curl.haxx.se/libcurl/c/curl_formadd.html)
     我喜欢通过wireshark来抓包,充分理解其内容。抓包网站:迅载网盘。抓包内容:上传文件时的POST请求。抓包中表示Multipart/form-data的字段:MIME Multipart Media Encapsulation。



2)详细介绍:
     首先:介绍wireshark中字段与Multipart/form-data的对应关系:
          MIME Multipart Media Encapsulation:代表整个Multipart/form-data上传文件中的数据。
          Encapsulated multipart part:代表表单中不同部分的数据。
          Boundary:用来隔开表单中不同部分的数据。
     其次,详细介绍:
     1) MIME Multipart Media Encapsulation ,Type:multipart/form-data,Boundary:“----------ei4Ij5I5Ef1gL6KM7Ef1ch2ae0ei4 ”
          这行指出这个请求是multipart/form-data格式的,且boundary是“----------ei4Ij5I5Ef1gL6KM7Ef1ch2ae0ei4”这个字符串。
     2)关于Boundary:  Boundary:用来隔开表单中不同部分的数据。实际上,每部分数据的开头都是由“--”+boundary开始的(这是MIME标准中讲述的标准内容)。
     3)  Encapsulated multipart part:紧跟着boundary的是该部分数据的描述:
          Content-Dispostion:form-data;name="Filename"\r\n
             每一个part至少一个name和一个content部分。
   
     



    
[3] 正则表达式的简略使用
    来源: 互联网  发布时间: 2014-02-18
正则表达式的简单使用

在 4.0 之后,系统就有了它自己的类(NSRegularExpression,NSRegularExpression)来使用正则表达式,,之前都是要添加第三方类库 RegexKitLite 来使用

这两个类的简单使用:

NSString *str = @"3sdfh*odsi";
    
    //匹配第一个字符是数字
    NSRegularExpression *regex1 = [NSRegularExpression regularExpressionWithPattern:@"\\b\\d.*" options:0 error:nil];
    if (regex1 != nil) {
        NSTextCheckingResult *result1 = [regex1 firstMatchInString:str options:0 range:NSMakeRange(0, [str length])];
        if (result1) {
            NSLog(@"第一个是数字");
        }else{
            NSLog(@"第一个不是数字");
        }
    }
    //匹配特殊字符  \W	 (W是大写)匹配任意不是字母,数字,下划线,汉字的字符
    NSRegularExpression *regex2 = [NSRegularExpression regularExpressionWithPattern:@".*\\W.*" options:0 error:nil];
    if (regex2) {
        NSTextCheckingResult *result2 = [regex2 firstMatchInString:str options:0 range:NSMakeRange(0, [str length])];
        if (result2) {
            NSLog(@"有特殊字符");
        }else{
            NSLog(@"没有特殊字符");
        }
    }



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪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