搜档网
当前位置:搜档网 › GT平台驱动开发

GT平台驱动开发

GT平台驱动开发
GT平台驱动开发

魂牵梦萦高通平台Driver开发的参考文档

版权说明

需要的本文本中所包含的一切信息,包括文字,图表,数据,图形,图象,方法和思想

都是联想移动通信科技有限公司财产,未经联想移动通信科技有限公司书面授权,任何

个人和组织都无权透露,拷贝,复制,拍照和传输该文本中的一切信息。

联想移动通信科技有限公司版权所有联想移动产品开发部软件处- I -

修订记录

联想移动产品开发部软件处- II -

目录

第1章前言 (3)

1.1 文档目的及开发背景 (3)

1.2 参考文献 (3)

1.3 术语和缩写解释 (3)

第2章综述 (5)

2.1 高通平台的硬件架构 (5)

2.2 高通平台驱动文件结构 (6)

2.3 ARM相关知识 (6)

2.3.1 ARM基本知识 (6)

2.3.2 ARM存储器格式 (9)

第3章Driver相关模块介绍 (10)

3.1 REX简介 (10)

3.2 Boot (11)

3.2.1 Nor Boot (13)

3.2.2 Nand Boot (13)

3.2.3 Boot流程 (14)

3.3 Gpio (15)

3.3.1 GPIO的作用 (15)

3.3.2 GPIO的用法 (16)

3.3.3 GPIO注意事项 (19)

3.4 内存管理 (19)

3.4.1 队列(Queue) (19)

3.4.2 DS存储池 (20)

3.4.3 Watermark –flow control point (22)

3.5 Sleep (25)

3.5.1 Sleep硬件相关知识 (25)

3.5.2 Sleep软件相关知识 (26)

3.5.3 查Sleep电流方法 (27)

3.6 SIO (28)

3.6.1 SIO模块的架构 (28)

3.6.2 SIO数据处理流程 (29)

3.7 重启问题分析 (30)

3.7.1 软件狗检测异常 (30)

3.7.2 发生data abort导致重启 (31)

3.7.3 指针未初始化引起的系统重启 (31)

3.7.4 注意事项 (32)

联想移动产品开发部软件处- I -

联想移动产品开发部软件处- II -

第1章前言

1.1 文档目的及开发背景

1.3 术语和缩写解释

联想移动产品开发部软件处- 3 -

联想移动产品开发部软件处- 4 -

第2章综述

2.1 高通平台的硬件架构

目前开发EVDO的手机或模块大部分采用了QSC6085平台。高通QSC系列的平台是高度集成化,它将PMIC、RF相关模块也集成到一块芯片里(其他公司很少做到这点),对硬件来说可以省很多事。除了上述特殊模块之外,当然也包括一般的LCD、KPD、AUDIO CODEC等很多驱动模块!具体如下图所示:

QSC6085处理器采用ARM9核+DSP的架构,一般就不需要再加DSP去处理Audio和图片。它集成这么多,其他硬件厂商的饭碗都被他抢了,不过这也是大势所趋!

联想移动产品开发部软件处-

5 -

2.2 高通平台驱动文件结构

在一般高通工程(60X5系列)目录下有一个Drivers文件夹,在该文件夹下包含了60X5系列平台上所有驱动文件,分门别类!

从上图中我们可以看到,每一个驱动都有独立的文件夹,这样对于新手学习代码来说比较容易找到相关代码。

2.3 ARM相关知识

因为高通处理器采用的ARM内核,遵循ARM指令,我们有必要学习一下ARM的一些基础知识。一般驱动开发中很少涉及到ARM指令,除了BOOT以及flash开发,大部分都在C语言环境中开发。在这部分我讲的不会太深入,如果大家想深入了解ARM架构,可以去看《ARM体系结构与编程》这本书,相当经典!

2.3.1 ARM基本知识

ARM 采用的是32位架构。也就是说ARM CPU内部的总线是32位的,每条ARM汇编指令都是32位的指令。一个CPU时钟周期最多可以处理一条32位指令或者读取一个32位的数据。32位的指令意味着,与8位和16位的CPU相比,在一个时钟周期内,指令可以携带更多的信息。

联想移动产品开发部软件处-

6 -

ARM 有7个基本工作模式:

User:非特权模式,大部分任务执行在这种模式

正常程序执行的模式

FIQ:当一个高优先级(fast)中断产生时将会进入这种模式

高速数据传输和通道处理

IRQ:当一个低优先级(normal)中断产生时将会进入这种模式

通常的中断处理

Supervisor:当复位或软中断指令执行时将会进入这种模式

供操作系统使用的一种保护模式

Abort: 当存取异常时将会进入这种模式

虚拟存储及存储保护

Undef:当执行未定义指令时会进入这种模式

软件仿真硬件协处理器

System: 使用和User模式相同寄存器集的特权模式

特权级的操作系统任务

ARM 有37个32-Bits长的寄存器.

1 个用作PC( program counter)

1个用作CPSR(current program status register)

5个用作SPSR(saved program status registers)

30 个通用寄存器

当前处理器的模式决定着哪组寄存器可操作. 任何模式都可以存取:

相应的r0-r12子集 相应的 r13 (the stack pointer, sp) and r14 (the link register, lr) 相应的 r15 ( the program counter, pc)

相应的CPSR(current program status register, cpsr)

特权模式 (除system模式) 还可以存取;

相应的 spsr (saved program status register)

联想移动产品开发部软件处-

7 -

联想移动产品开发部软件处 - 8 -

Z = 1-结果为0,0-结果不为0

C =1-进位,0-借位

V =1-结果溢出,0结果没溢出

Q 位:仅ARM 5TE/J 架构支持,指示增强型DSP 指令是否溢出

J 位:ARM 5TE/J 架构支持 J = 1: 处理器处于Jazelle 状态

中断禁止位:

I = 1: 禁止 IRQ.

F = 1: 禁止 FIQ.

T Bit: T = 0: 处理器处于 ARM 状态T = 1: 处理器处于 Thumb 状态

Mode 位(处理器模式位):

0b10000 User

0b10001 FIQ

0b10010 IRQ

0b10011 Supervisor

0b10111 Abort

0b11011 Undefined

0b11111 System

2.3.2 ARM存储器格式

在ARM体系中,每个字单元包含4个字节单元或者两个半字单元;一个半字单元中包含两个字节单元。但是在字单元中,4个字节哪一个是高位字节,哪一个是低位字节则有两种不同的格式;big_endian格式和little-endian格式。比如一个整型数0x12345678在内存中如下图所示

-----------

| 78 | xxxx_0000

-----------

| 56 | xxxx_0001

-----------

| 34 | xxxx_0002

-----------

| 12 | xxxx_0003

-----------

Little Endian

-----------

| 12 | xxxx_0000

-----------

| 34 | xxxx_0001

-----------

| 56 | xxxx_0002

-----------

| 78 | xxxx_0003

-----------

Big Endian

联想移动产品开发部软件处-

9 -

第3章Driver相关模块介绍

3.1 REX简介

虽说目前QSC60x5平台上采用L4操作系统,REX只是L4上面的一个Task。但高通为了开发的兼容性,提供的API仍然采用老的一套接口(可能内部实现不一样),很容易将老的代码移植到新的架构中。那么我还试必要介绍一下REX。

REX是一个操作系统的名字,它是Real-time Executive的缩写。它是美国的QUALCOMM开发的,REX是一个简单的、高效的、抢占式的、多任务的、嵌入式实时操作系统。它最初是为应用于Intel 的80186而设计的,如今它已经被移植到了ARM微处理器上。

下面是它比较重要的几个概念(其实和其他操作系统一样):

1、 Task

REX把任务当作独立运作的实体,每一个任务都有自己独立的堆栈和优先级。每个任务都有一个数据结构,我们称为―任务控制块‖(TCB)。REX允许在运行时,在任何时间动态的创建任意数量的任务。但是创建的任务越多,REX的性能便稍微递降,这是因为你创建的任务越多,任务列表越长。所以你需要确保你创建的任务数量尽量小。另外,REX任务的负载量还跟你选择的处理器有关。

下面的图描述了REX任务的启动过程:

TCB也是一个比较重要的结构体,各个task都有一个全局变量tcb,这个tcb包含了很多重要信息如,任务优先级、堆栈指针,信号量等,这些有时对查死机问题很有帮助。

2、任务调度

联想移动产品开发部软件处-

10 -

REX总是选择处于就绪态的最高优先级的任务进行调度,如果任务的优先级不是唯一的,REX可能选择任何一个处于就绪态的最高优先级的任务进行调度。被选择的任务会一直执行,直到它自愿挂起或者中断发生而激活了更高优先级的任务。

当被挂起的任务的等待条件得到满足时,该任务就变成了就绪态。如果所有的认为都挂起的时候,那么空闲认为就被执行。

REX提供了一种机制,允许任务可以动态的提高或降低自己或其它任务的优先级。

3、信号量

信号量是任务之间进行通信和同步的桥梁。信号量是REX提供的一种任务间通信的机制。每个任务都有一套与之相关联的通用信号量,信号量通常作为任务的TCB的一部分,它们被用来通知任务某种事件的发生,任务的信号量可以被任何其它任务或中断设置或清除。

信号量实际上是一种约定机制,在多任务内核中普遍使用,信号量用于:

控制共享资源的使用权(满足互斥条件);

标志某事件的发生;

使2个任务的行为同步。

4、中断

REX是一个可剥夺的内核。当从中断返回的时候,控制权就被传递给处于最高优先级的就绪任务,而没有必要返回到被ISR中断了的任务处。

一般我们只会挂载GPIO中断,后续会介绍。

5、定时器

定时器,英文是timer。和其它内核一样,REX要求给用户提供定时时间,来实现超时控制等功能。REX中有些信号是事件触发引起,也可以由timer引起。一旦由于某种原因,等待的事件信号一直等不到,这时可以用timer定时来产生信号量。

关于以上几个概念,高通都提供了相关接口操作,具体参看代码!

3.2 Boot

高通平台系统Memory组成可以分为:NAND+SDRAM和NOR+PSRAM 。两者配置不能并存,这也就决定了有两种boot模式,具体决定采用哪种Boots方式是Boot_mode引脚决定。

联想移动产品开发部软件处-

11 -

高通60x5系列采用了Multi-Image-Boot技术,这可以从高通的代码看出,

从上述枚举变量中可以看出,flash中有多个image.其中QCSBL+OEMSBL =SBL,SBL就相当于bootloader, Bootloader主要是在Nand启动方式中起作用!原因后续介绍!

其中每个Image又是由三个部分组成:

联想移动产品开发部软件处-

12 -

联想移动产品开发部软件处 - 13 -

3.2.2 Nand Boot

Nand Flash 没有地址线,代码不能直接运行,因此需要Bootloader,那么bootloader 的作用:

可以看出相对NOR boot,Nand boot复杂很多。它需要将falsh中的Image复制到SDRAM,然后才能执行。并且要对各个image进行校验。

3.2.3 Boot流程

Boot是一个很复杂的过程,尤其是Nand Boot,需要你对ARM架构很深的了解,这边只是简单示意相关流程,具体大家可以参考代码!

联想移动产品开发部软件处-

14 -

3.3 Gpio

3.3.1 GPIO的作用

GPIO 作为QSC60X5 与外界沟通的桥梁,主要有四个作用:

1.通过GPIO 向外部输出一个高/低电平,控制外部的器件或者通知外部器件某事件的发生。例如我们可以通过GPIO 输出一个高电平点亮一个LED,或者输出低电平关掉一个LED。2.通过GPIO 读入一个外界的高低电平输入,检测外部器件的当前状态。例如键盘按键是否按下的探测。

3.将GPIO 口作为外部中断信号的一个输入口,实时检测外部事件的发生。

4.将GPIO 用作其他特定用途。例如用作I2C 通信、数据线、地址线等。

联想移动产品开发部软件处- 15 -

3.3.2 GPIO的用法

1.配置一个GPIO 口。通常一个GPIO 有多种功能,我们可以将GPIO 配置为符合我们当前需要的功能;同时我们也可以将GPIO配置为内部具有上拉电阻、下拉电阻或者没有任何上下拉电阻。文件GPIO_60x5.c 中定义了配置GPIO 的函数接口

void gpio_tlmm_config(GPIO_SignalType gpio_signal)

{

}

gpio_signal 指定要配置成的功能,文件GPIO_60x5.h 枚举出了每个GPIO 的可配置的功能选项:

typedef enum

{

GPIO_OUTPUT_3 = GPIO_OUT(3,0),

GPIO_INPUT_3 = GPIO_IN(3,0,GPIO_PULL_DOWN),

SDCC_DATA0 = GPIO_ALT(3,0,1,GPIO_PULL_UP),

DBG_BUS_IN_7 = GPIO_ALT(3,0,2,GPIO_PULL_DOWN),…

}

例子:

SDCC_DATA0 = GPIO_ALT(3,0,1,GPIO_PULL_UP) gpio_tlmm_config(SDCC_DATA); /* 将GPIO3 配置为SD卡的数据线1*/ gpio_tlmm_config(GPIO_INTPUT_3); /* 将GPIO26 配置为通用的有下拉电阻的输入端口*/

2.从GPIO 输出高/低电平。首先应该通过函数接口gpio_out来确定GPIO输出高电平或者低电平,然后通过函数接口gpio_tlmm_config把该GPIO配置为通用功能(非特定功能),在该配置函数中调用一个宏函数接口BIO_TRISTATE 打开GPIO 使能,将此电平输出出去。

void gpio_out(GPIO_SignalType gpio_signal,GPIO_ValueType gpio_value) /*将GPIO 寄存器设置输出的电平*/ BIO_TRISTATE(io, mask, val) /*GPIO 寄存器中的值输出出去:输出使能*/

例子:使GPIO 31 输出低电平

联想移动产品开发部软件处-

16 -

gpio_out(GPIO_OUTPUT_31, GPIO_LOW_VALUE);

gpio_tlmm_config(GPIO_OUTPUT_31);

3.从GPIO 读入外部器件输入的高/低电平,检测外部的事件或者状态。只能从一个输出已被disable 的GPIO 读入输入的高/低电平,也就是说只能从一个已被设置为输入模式的GPIO 读入高/低电平。从GPIO 读入外部输入的高/低电平的宏函数接口:

GPIO_ValueType gpio_in

(

GPIO_SignalType gpio_signal

),

gpio_signal解释见上面的说明,而返回值

typedef enum

{

GPIO_LOW_VALUE = 0,

GPIO_HIGH_VALUE = 1

} GPIO_ValueType;

例:判断GPIO3的当前状态

gpio_tlmm_config(GPIO_INTPUT_3);

if (gpio_in(GPIO_INTPUT_3) == GPIO_LOW_VALUE)

{

…..

}

4.将GPIO 设置为某个中断信号的输入口。这样外部器件一旦有中断信号(高电平或者低电平)输入到此GPIO 端口,将直接触发一个中断,指定的ISR 将被调用,处理中断事件。中断的好处在于中断事件可以实时得到处理,无论系统是否处于睡眠状态。接口函数有两个:

A)gpio_int_set_detect(gpio_int_type which_group_int, gpio_int_detect_type detect) /*指定边沿触发还是电平触发*/

B) boolean gpio_int_set_handler

(

gpio_int_type which_group_int,

联想移动产品开发部软件处-

17 -

高通平台充电方案

Qualcomm平台充电总结 1.锂离子电池充放电特性 1.1. 锂离子电池充电电压的上限必须受控制,一般不超过4.2V。(视具体情况,一般控制在4.10V-4.35V不等) 1.2.单体电池充电电流通常限制在1C以下。 1.3.单体电池放电电流通常控制在3C以下。 1.4.单体电池放电电压通常不能低于 2.2V。 电池电量与电压对照曲线 2.充电通路晶体管的控制和功率限制 外部通路晶体管的控制驱动器包含在了PM IC中;这个驱动的输出可以内部晶体管应用,也可以通过CHG-CTL-N脚供外部应用。如果需要的话,一般操作时PM IC使用通路晶体管的闭环控制来校准VDD电压,快速充电(恒流充电)时的检测电流(IDET),或者充电最后状态的电池电压。通路晶体管的阻抗也被增加以用来过流保护。 控制通路晶体管同样允许用来过热保护:PM IC通过电压和电流的测量来监控通路晶体管中消耗

的功率。如果计算出的功率超过设计限制,CHG-CTL-N控制信号就会减小通路晶体管的通路电流。 2.1.通路晶体管的功率消耗限制是可编程的: 1)晶体管的消耗功率是使用VCHG(或USB-VBUS)和ISNS-P脚上的电压测量以及基于敏感电阻两端(ISNS-P和ISNS-M脚)电压的电流测量来计算的。 2)可编程的管耗限制(单位为瓦特)为0.4,0.5,0.6,0.75,1.0,1.5,2.0和“无限制”。 这些可编程限制采取一个0.100ohm的敏感电阻。 2.2设计者需要考虑以下几点来帮助减少通路晶体管的功率消耗: 1)使用一个只比锂电池最高电压高一点的外部供应电压来使越过通路晶体管的电压最小化。 2)设计充电器电压,使它的输出电压在快速充电期间崩溃,从而减少越过通路晶体管的电压。 恒流充电期间要控制充电电流和通路晶体管管耗,因为这个阶段的充电电流较大,而充电三极管超过一定功率就容易发热甚至烧毁。所以通常情况下,恒流充电期间,我们都要求充电三极管处于饱和态,Vce很小以降低管耗,只有在usb充电或有特殊要求的wall充电中,才会让充电三极管工作在放大区,这个在5中会有讨论。 2.3.平台限流的影响。 1)如果平台限流大于wall charger额定电流,充电通路三极管状态由pm控制在饱和区(表现为恒流充电期间Vbus电压会被拉低,充电三极管处于饱和态,Vce很小,管耗很小); 2)如果平台限流小于wall charger额定电流,充电通路三极管状态由pm控制在放大区,以提高充电三极管CE极间阻抗,来降低通过的电流(表现为充电Vbus电压不会被拉低,三极管无法进入饱和态,Vce很大——管耗大,发热大)。 3.充电过程解析 PM IC提供了支持锂电池充电的线路,它利用了MSM使能的四种技术:涓流充电,恒流充电,恒压充电,脉冲充电。电池电压,外部供应电压和最大检测电流度量都可以通过一个模拟多路器供MSM使用。这就使得MSM设备可以监控充电参数,做决策和控制充电过程。

高通8909平台NQ210调试

高通8909平台NQ210调试说明 高通平台电信VOLTE仅在Android 7.1上实现,而原来的NFC解决方案(PN547)只支持到Android6.0,所以有了高通8909+NQ210+Android7.1这个组合,以实现电信VOLTE+NFC。 F9 R4.1+NQ210 NFC性能调试过程中,几点说明: 1,配置文件需要将NXP的RF_BLK参数合入到高通默认参数 2,注重Rx端匹配调节,对读卡性能有较大提升。调试方法详见附件 3,最终的NFC电路可以不用DCDC,也不用MOS管实现读卡、点对点和开关机卡模拟。性能如下,满足我们要求 配置文件 高通参考设计里给了两个配置文件 /system/etc/libnfc-brcm.conf /system/etc/libnfc-qrd_default.conf 其中libnfc-qrd_default.conf没有NXP_RF_CONF_BLK的六组配置参数,NXP_CORE_CONF_EXTN 的配置参数也不全 从WPI给的配置文件libnfc-nxp_RF - EMVCO.CONF中,将NXP_RF_CONF_BLK六组参数和NXP_CORE_CONF_EXTN配置参数全部拷到libnfc-qrd_default.conf中,并将此文件替换手机中的默认文件。若出现卡模拟性能不佳,也可以在补全的配置文件中通过修改相位来进行优化。

配置文件中需要重点注意的是,NXP_EXT_TVDD_CFG的配置一定要和硬件对应。其中Config1是不采用DCDC的,Config2和3都是采用DCDC供电的。对于我们的项目,在没有DCDC下性能也能满足要求,所以NXP_EXT_TVDD_CFG=0x01 NFC匹配电路 F9 R4.1+NQ210最终的匹配电路如下: 其中:L4802+C4818/L4803+C4820是EMI Filter,采用默认值即可。 C4814+R4806/C4816+R4808是Rx通路匹配,对读卡性能同样有较大影响。靠近读卡器无法正确读卡,而远离读卡器就能正确读卡的问题,也可以通过Rx通路来优化。 中间的串电容,并电容就是NFC天线的发射匹配,NQ210的发射阻抗在30ohm,和PN547的50ohm有所不同。在实验室也可以以读卡/身份证距离为测试标准,盲调匹配电路。 这里重点针对Rx通路的优化进行说明。通常保持电容1nF不变,通过调节电阻来优化Rx通路。判断标准是要保证AGC值在500-800之间,可通过如下步骤优化电阻: 1,修改配置文件A0, 40, 01, 01-> A0, 40, 01, 81,让log中能看到AGC值 2,将修改后的配置文件导入手机,重启手机后并重现打开NFC 3,通过adb logcat输出log,在log中找到“6F13”地址的后四位数字,如5C02即代表0X025C,转换成10进制就是604 4,若AGC太小则减小电阻值,若AGC太大就增大电阻值。同时兼顾实测情况下的NFC性能最终来确认电阻值。 我们最终选用的3.3K电阻,对应的AGC值为604,满足要求。

wdm驱动开发之路

WDM驱动开发之路 写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。功到自然成嘛。不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。 按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。 今天我们一起讨论第一部分,了解篇。 (一)了解篇 WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。作为驱动开发人员来说,它在两者中有很多的不同。并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。 要写驱动程序,首先要了解操作系统的结构。在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。但实际上,Windows2000的WDM实现中有很多例程在Windows98中没有实现,一旦试图加载这样的WDM驱动程序到Windows98中,则不能正常加载,当然我们也有办法实现它,那就是利用“桩”技术。具体可参见Walter Oney写的《Programming the Microsoft Windows Driver Model》一书。我们首先来看看Windows 2000的系统结构,然后再来看看Windows 98的。 图一是Windows 2000的系统结构图。从图中我们可以看出:整个系统被分为两个态,用户态和核心态。 从图中可以明显看出I/O操作最后是怎样作用到硬件上的。用户态应用程序对Windows 子系统进行win32 API调用,这个调用由系统服务接口作用到I/O管理器(严格地说,在Windows 系统中不存在I/O管理器这样的独立模块,这个只是为了方便叙述而将各种核心功能调用的集合称作I/O管理器,业界人士都这样称呼这个部分),I/O管理器进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传给驱动程序。简单情况下,驱动程序直接执行这个请求包,并与硬件打交道,从而完成I/O请求工作,最后由I/O管理器将执行结果返回给用户态程序。但在WDM体系结构中,大部分实行分层处理。即在图中“设备驱动“这部分,分成了若干层,典型地分成高层驱动程序、中间层驱动程序、底层驱动程序。每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。以文件系统驱动为例,最高层驱动只知道文件如何在磁盘上表示,但不知到怎样得到数据。最低层驱动程序只知道怎样从磁盘取出512B为单的数据块,但不知道文件怎样表示。举个更具体的生活例子。主人(最高层驱动)知道(并且需要)笔计本电脑,但不知道具体放在什么位置;而仆人(最底层驱动)却知道它放在具体什么地方,但

基于Unity3D和高通Vuforia SDK的AR开发

基于Unity3D和高通Vuforia SDK的AR开发 发表时间:2017-12-13T09:47:20.257Z 来源:《科技中国》2017年8期作者:刘伟杨希文盼向兴婷 [导读] 摘要:本文基于Unity3D这一专业游戏引擎和高通Vuforia SDK制作一款简单的AR,模型通过3d max等三维建模软件进行制作。本文主要介绍基于Unity3D如何制作出一款适合教育领域的AR应用软件,并对AR的研究方向与前景做出探讨。 摘要:本文基于Unity3D这一专业游戏引擎和高通Vuforia SDK制作一款简单的AR,模型通过3d max等三维建模软件进行制作。本文主要介绍基于Unity3D如何制作出一款适合教育领域的AR应用软件,并对AR的研究方向与前景做出探讨。 关键词:增强现实(Augmented Reality),Unity 3D,教育领域 一、概述及研究现状 增强现实(Augmented Reality),简称AR技术。一种实时的记算摄影机摄影位置及角度并加上相应图形的技术,在显示屏中把虚拟世界叠加到现实世界中,用户可以通过设备与其进行交流互动。 目前,国内的AR技术发展迅速,在教育领域的应用也备受关注,具有广阔的发展前景。国内的AR多应用于儿童教育(出版物)等,随着移动手机性能的提升和AR技术(特别是图片识别技术)的发展,未来AR一定会在教育领域蓬勃发展,并且还会在社交、旅游、军事、医疗、游戏等诸多领域实现成功应用。 二、设计与实现模块 AR制作流程主要有:模型导入Unity—基于高通网站制作识别图——导入SDK,在Unity3D中完成后期制作(动画,模型渲染,脚本驱动,特效,声音等)——打包发布到安卓(Android)平台,下面具体进行介绍。 开发工具的准备:1、基于Unity 3D,所以先安装Unity3D,案例所用的版本是Unity3D5.6.1f(64位)的,安装SDK和JDK,保证后续可以发布到Android平台进行测试与应用。2、登录高通Vuforia网站注册账号。 三、识别图模块 制作识别图,首先登录高通Vuforia网站,点击Develop按钮,单击License Manager下的Add License Key,在Project Type选择Development。在Project Details下添加App name:AR Demo,点击Next,出现刚刚填写的信息,确认无误后,勾选下面的许可确定。点击Confirm,License Manager下面会有AR Demo,点击它出现License Key,后期在Unity里面会用到,所以将它复制下来。 再点击Target Manager,点击Add Database,在弹出的Create Database中填写Name:AR _Demo,Type选择默认的Device即可,点击Create。在Database出现刚刚创建的AR_Demo,后面有它的信息(Name,Type,Targets,Date Modified),Targets为0,要添加图片,点击它,点击Add Target,在弹出的Add Target下,我们选择Type为Single Image,点击File后面的Browse,选择准备好的图片,设置宽度:400,最后点击Add,这是出现Uploading Target,只需要等待几秒钟,就会看到Target制作完成,这时可以看到选择的图片复杂的Rating (等级),它的值越高代表可识别的点越多,识别也更加容易和准确。制作好后,勾选我们制作的Target,点击Download Database,在弹出的Download Database窗口中,选择开发平台(Select a development platform)为Unity Editor,然后点击Download进行下载。下载好后,识别图就制作完成,这时还需要下载Vuforia SDK。点击上面的Downloads按钮,点击Download for Unity,在弹出的Software License下点击I Agree。 四、Unity 3D实现AR模块 打开Unity,新建工程,导入两个*.unitypackage:AR _Demo和vuforia-unity-6-2-10,我们可以直接点击两个带有Unity图标的文件进行导入,也可在Unity菜单栏中选择Asset下的Import Package进行导入。删除unity自带的主摄像机Main Camera,在资源Assets目录下找到Vuforia—Prefabs—ARCamera,拖到项目场景中,再将Image Target也拖放到场景中,将右侧检视面板中Image target Behaviour下的Type选择AR_Demo),将模型放置在识别图上,调整模型大小和位置,让它处于摄像机中央。设置ARCamera:点击ARCamera右侧的Inspector下的Open Vuforia configuration,将刚刚复制的的License Key粘贴到App License Key中,并且勾选上Datasets下的Load AR_Demo Database 和Activate。 五、发布到Android平台模块 点击菜单栏File—Build and settings,选择发布平台Android,点击player settings,修改Package Name后参数Company,点击Add Open Scenes,然后Build,Unity生成apk可执行文件。最后,通过将生成的apk文件传到Android手机上并进行安装运行,实现预期效果。 六、结论与展望 本文的AR制作基于在Unity3D中完成相关测试,最后打包发布成APP安装到Android手机上,运行APP通过手机摄像机即可实现增强现实的效果,完美展示模型与现实的叠加。本文为从事AR相关开发的工作人员提供指导,也为在教育领域苦苦寻找更加高效的教学模式的教

Android驱动开发实例(控制LED灯)(精)

Android驱动例子(LED灯控制) 本例子,讲述在Android2.1上完全自已开发一个驱动去控制硬件口并写应用测试该驱动,通过这样一个例子,解析android下的驱动开发流程的应用调用流程,可以说是很好的入门引导 要达到的效果:通过Android的应用,调用驱动程序,在开发板上控制4个LED的亮灭。 一、硬件原理 如上图,通过4个IO口控制这LED,低电平LED亮, 这4个IO口分别是GPM1, GPM2, GPM3, GPM4, 二、驱动程序 1、在kernel文件夹下的driver目录,新键驱动文件夹 # cd kernel_Android_2.6.28.6/drivers 进到开发板的kernel目录,建驱动文件夹 #mkdir ledtest

2、在/driver/ledtest目录下,新建leddriver.c ,leddriver.h , Kconfig, Makefile 等4个文件leddriver.c leddriver.c 1. #include 2. #include 3. #include 4. #include/* For __init/__exit/... */ 5. #include 6. #include 7. #include 8. #include 9. #include 10. #include 11. #include 12. #include 13. #include 14. #include 15. #include 16. #include 17. #include//for register_chrdev( 18. #include 19. #include 20. #include"leddriver.h" 21. #include/* For MODULE_ALIAS_MISCDEV 22. (WATCHDOG_MINOR */ 23. #include/* For the watchdog specific items */ 24. #include/* For file operations */ 25. #define Viberator_MAJOR 97 //?÷éè±?o? 26. #define SCULL_NR_DEVS 4 27. #define SCULL_QUANTUM 4000 28. #define SCULL_QSET 1000 29. //---do as the GIO driver

模型驱动的开发方法——基于面向对象的开发

模型驱动的开发方法——基于面向对象的开发 2012210874 魏翔案例 案例名称:《基于UML的GRAPPLE在数字化医院信息系统设计中的应用》 案例简述: GRAPPLE (Guidelines for Rapid application Engineering: 快速应用工程指导原则)主要适用于面向对象系统。因此,每个段中的动作主要是生成面向对象的工作产品。GRAPPLE 所包括的5个段分别为: 1需求收集 1.1发现业务过程 首先要分析员要用客户业务常用的词汇与客户进一步面谈,从而建立一个或者一组能够捕获业务过程中的步骤和判定点的活动图,即从客户的业务流程出发理解系统。 1.2领域分析 领域分析可以与前一个动作同时进行,它们的共同目标是达到对某特定领域的理解。在此过程中,分析员需要分析与客户的会谈从而开发初步类图、建立和标记类之间的关联并且找出关联的多重性。 1.3发现系统需求 在此阶段,GRAPPLE 要求开发组举行一次联合应用开发会议,参加者包括客户的决策者、用户以及开发组成员。会议的参加者一同收集系统需求,需求收集的结果是一个包图,这个包图中的每个包代表系统的一个主要功能模块,每个包中包括一组用例,它们详细说明这个包代表的功能。本系统最重要的是事务对象包,它包括了系统涉及的大部分功能模块,例如挂号收费模块、看病诊断模块、取药模块、住院出院模块等;用户接口包定义了数据导入导出接口、打印接口;数据库包则定义了系统使用的数据库表、视图、存储过程。 2分析 2.1开发用例 “发现系统需求”阶段得到的每个功能包中的用例说明系统必须要做的事。在“开发用例”阶段开发组还必须分析和理解每个用例,描述用例执行步骤以便绘制详细用例图。HIS 系统案例的用例图如图 1所示。

高通平台常用调试Tool介绍1

高通平台的常用的调试tool: QPST, QRCT, QXDM, Trace32(use JTAG) 2013年09月07日?综合?共 4410字?字号小中大?评论关闭 OverView: QPST 综合工具, 传输文件, 查看device的EFS文件系统, 代码烧录 QRCT 测试RF QXDM 看log JTAG trace32调试 QPST,QXDM的使用说明,具体的可以看我上传到csdn的资源文件,我都是看它,看了那个user guide就完全会了,很简单的 QPST是一个针对高通芯片开发的传输软件。简单的说就是用高通处理芯片的手机理论上都可以用 QPST传输文件,可以修改C网机器内部参数的软件。 一次可以track多台电脑 QPST还可进行代码烧入 包括: 5个 client applications ? QPST Configuration monitor the status of: Active phones Available serial ports Active clients To start QPST Configuration, from the Start menu, select Programs → QPS T → QPST Configuration. ? Service Programming provide service programming for CDMA phones that contain Qual comm ASICs. With it, you can save SP data to a file, then download the data in that file to multiple pho nes. The SP application accesses settings regardless of the phone’ s internal memory implementation. It is feature- aware and displays settings pages appropriate to the phone being programmed. To start SP, from the Start menu, select Programs → QPST → Service Programming.

高通android平台开发

问题描述: 对于有过开发高通android系统的人来说,获取代码构建开发环境并不是难事,但对于刚刚接触这一块内容的人,如果没有详细的说明很容易走弯路,本文档就是根据本人的实践总结的一些经验教训。 1.代码获取 高通的android代码分为两部分,一部分是开源的,可以从网站https://https://www.sodocs.net/doc/6712402108.html,/xwiki/bin/QAEP/下载,需要知道要下载的代码的分支及build id。另一部分是非开源的,需要从高通的另一个网站https://https://www.sodocs.net/doc/6712402108.html,/login/上下载,这个下载是有权限限制的,晓光的帐号可以下载代码。后面这部分代码需要放到第一部分代码的vendor指定目录下,可能是vendor/qcom-proprietary或vendor/qcom/proprietary,根据版本的不同有所区别。 高通平台相关的东西基本都在vendor/qcom/proprietary下或device/qcom下 2.编译环境构建(ubuntu 10.04 64位) Android2.3.x后的版本需要在64位下进行编译 更新ubuntu源,要加上deb https://www.sodocs.net/doc/6712402108.html,/ lucid partner 这个 源用来安装java。 apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev x11proto-core-dev libx11-dev libxml-simple-perl sun-java6-jdk gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs lib32z-dev lib32readline5-dev 研发主机不能更新java,需要让IT安装sun-java6-jdk。 在命令行执行sudo dpkg-reconfigure dash 选择no,否则编译时会报一下脚本语法错误 编译的过程中https://https://www.sodocs.net/doc/6712402108.html,/xwiki/bin/QAEP/和版本的 release notes中都有介绍,首先source build/envsetup.sh,然后choosecombo选择需要的选项,最后make或make –j4。-j4用来指定参与编译的cpu个数,指定了编译会快些。编译单个模块的时候只需要在make后面跟 上模块的名字 为了简化可以使用以下脚本 export TARGET_SIMULATOR=fasle export TARGET_BUILD_TYPE=release export TARGET_PRODUCT=msm7627a export TARGET_BUILD_VARIANT=eng set_stuff_for_environment make $1 编译的中间结果在out/target/product/平台/obj目录下,有时候为了完全

android系统开发--HAL层开发基础

android系统开发--HAL层开发基础 Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念 1,源代码和目标位置 源代码:/hardware/libhardware目录,该目录的目录结构如下: /hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录 /hardware/libhardware/include/hardware目录下包含如下头文件: hardware.h 通用硬件模块头文件 copybit.h copybit模块头文件 gralloc.h gralloc模块头文件 lights.h 背光模块头文件 overlay.h overlay模块头文件 qemud.h qemud模块头文件 sensors.h 传感器模块头文件 /hardware/libhardware/modules目录下定义了很多硬件模块 这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录 2,HAL层的实现方式 JNI->通用硬件模块->硬件模块->内核驱动接口 具体一点:JNI->libhardware.so->xxx.xxx.so->kernel 具体来说:android frameworks中JNI调用/hardware/libhardware/hardware.c中定义的hw_get_module函数来获取硬件模块, 然后调用硬件模块中的方法,硬件模块中的方法直接调用内核接口完成相关功能 3,通用硬件模块(libhardware.so) (1)头文件为:/hardware/libhardware/include/hardware/hardware.h 头文件中主要定义了通用硬件模块结构体hw_module_t,声明了JNI调用的接口函数 hw_get_module hw_module_t定义如下: typedef struct hw_module_t { /** tag must be initialized to HARDWARE_MODULE_TAG */ uint32_t tag; /** major version number for the module */ uint16_t version_major; /** minor version number of the module */ uint16_t version_minor; /** Identifier of module */ const char *id; /** Name of this module */ const char *name;

Windows 内核技术与驱动开发笔记(完整版)

Windows 内核技术与驱动开发笔记 1.简述Driver Entry例程 动程序的某些全局初始化操作只能在第一次被装入时执行一次,而Driver Entry例程就是这个目的。 * Driver Entry是内核模式驱动程序主入口点常用的名字。 * Driver Entry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。WDM驱动程序的Driver Entry例程应完成对这个对象的初始化并返回。非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。 * Driver Entry的第二个参数是设备服务键的键名。这个串不是长期存在的(函数返回后可能消失)。如果以后想使用该串就必须先把它复制到安全的地方。 * 对于WDM驱动程序的Driver Entry例程,其主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种例程的位置。 2.简述使用VC进行内核程序编译的步骤 编译方式是使用VC++进行编译 1.用VC新建工程。 2.将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。 3.增加新的编译版本。 4.修改工程属性,选择“project | setting”将IterMediate file和Output file 都改为MyDriver_Check。 5.选择C/C++选项卡,将原有的Project Options内容全部删除替换成相关参数。 6.选择Link选项卡,将原有的Project Options内容删除替换成相关Link。 7.修改VC的lib目录和include的目录。 8.在VC中选择tools | options,在弹出的对话框中选择“Directories”选项卡,在“Show directories for”下拉菜单中选择“Include file”菜单。添加DDK的相关路径。 3.简述单机内核调试技术 答:1.下载和安装WinDbg能够调试windows内核模块的调试工具不多,其中一个选择是微软提供的WinDbg 下载WinDbg后直接双击安装包执行安装。 2.安装好虚拟机以后必须把这个虚拟机上的windows设置为调试执行。在被调试系统2000、2003或是xp的情况下打开虚拟机中的windows系统盘。 3.将boot.ini文件最后一行复制一下,并加上新的参数使之以调试的方法启动。重启系统,在启动时就可以看到菜单,可以进入正常windows xp,也可以进入Debug模式的windows xp。 4.设置VMware管道虚拟串口。调试机与被调试机用串口相连,但是有被调试机是虚拟机的情况下,就不可能用真正的串口连接了,但是可以在虚拟机上生成一个用管道虚拟机的串口,从而可以继续内核调试。 4.请画出Windows架构简图

Android平台介绍及使用指导

Android平台介绍及使用指导 二○一○年二月 版本 1.0

目录 Android平台介绍 ................................................................................... - 4 -基本名词...................................................................................................................... - 5 - 操作方法介绍 .......................................................................................... - 6 - 手机按键介绍.............................................................................................................. - 6 - 快捷键介绍.................................................................................................................. - 6 - 信息功能介绍.............................................................................................................. - 7 - 联系人功能介绍........................................................................................................ - 11 - 通话记录功能介绍.................................................................................................... - 14 - 文本粘贴/复制功能介绍.......................................................................................... - 14 - Push Email(Moxier)功能介绍............................................................................ - 15 - 电子邮件功能介绍.................................................................................................... - 16 - 桌面功能介绍............................................................................................................ - 19 - 蓝牙功能介绍............................................................................................................ - 23 - Wifi功能介绍........................................................................................................... - 23 - 飞行模式功能介绍.................................................................................................... - 23 - CDMA数据链接介绍................................................................................................... - 24 - 黑屏解锁功能............................................................................................................ - 25 - 回复出厂设置............................................................................................................ - 26 - 应用程序设置............................................................................................................ - 26 - GPS设置..................................................................................................................... - 27 - 手机中英文语言切换................................................................................................ - 28 - 更换手机输入法........................................................................................................ - 29 - 数据线链接Android手机........................................................................................ - 29 - 手机测试模式进入方法............................................................................................ - 30 - 横屏显示介绍............................................................................................................ - 30 - 浏览器功能介绍........................................................................................................ - 31 - RSS功能介绍............................................................................................................ - 32 - Q/A- 34 -

子程序

第七章子程序和程序包 目标 本节课的主要目标就是了解子程序和程序包。 为什么会用到子程序? 引入 什么是子程序? 子程序就是能够接受参数并被其他程序所调用的命名PL/SQL块。PL/SQL子程序有两种类型,过程和函数。一般地,过程用于执行一个操作,而函数用于计算一个结果值。 与未命名或匿名PL/SQL块一样,子程序也有声明部分,执行部分和一个可选的异常处理部分。声明部分包含类型、游标、常量、变量、异常和嵌套子程序的声明。 子程序 子程序分为过程(store procedure)和函数(function),是一种特殊的pl/sql语句块。它以编译好的的形式存储在数据库中,可以被后来的语句块调用。 运行时是编译而不是运行,要调用才会有结果。 DML增、删、改用过程,计算用函数。 过程:没有返回值。函数:有且只有一个返回值。

子程序作用: 1、允许模块化编程 2、能够实现较快的执行过程 3、能够减少网络流量 4、可作为一种安全机制 存储过程 创建过程的语法 CREATE[OR REPLACE]PROCEDURE [()] IS|AS BEGIN [EXCEPTION ] END; 存储过程中定义的形式参数,不能指定长度,否则报错。 1.不带参数的存储过程 create or replace procedure test1 is begin

dbms_output.put_line('大家好'); end; 执行: SQL>set serveroutput on SQL>exec test1; 任何的输出都要先执行 SQL>set serveroutput on 否则就无法看到输出结果,为什么呢?任何的输出在客户端看不见,他直接往oracle服务器上去输出。执行这句让它在控制台上也输出一份。 2.带输入参数 create or replace procedure test2 ( a in number, b in varchar2 ) is begin dbms_output.put_line(a); dbms_output.put_line(b); end; 调用 SQL>exec test2(1,'a'); 1 a

驱动程序开发技术-过滤键盘驱动

《驱动程序开发技术》大作业 ——过滤键盘驱动 姓名:梁海杰 学号:2009441624 班级:计科普0902

摘要 Kbdclass.sys是键盘的类驱动,无论是USB键盘,还是PS/2键盘都要经过它的处理;在键盘类驱动之下,和实际硬件打交道的驱动叫做“端口驱动”,比如:i8042prt.sys是ps/2键盘的端口驱动,Kbdhid.sys是USB键盘的端口驱动。键盘中断导致键盘中断服务例程被执行,导致最终i8042prt的I8042KeyboardInterruptService被执行。在I8042KeyboardInterruptService中,从端口读取扫描码,放到一个KEYBOARD_INPUT_DATA 结构中。并把这个结构放到i8042prt的输入队列中。最后会调用内核api函数KeInsertQueueDpc。在这个调用中会调用上层KbdClass.sys中处理输入的回调函数KeyboardClassServiceCallback,取走i8042prt的输入数据队列里的数据。利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。 关键词:过滤键盘;驱动分层;映射;扫描码

过滤键盘驱动 一、主要设计思路 利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。 键盘过滤驱动是工作在异步模式下的。系统为了得到一个按键操作,首先要发送一个IRP_MJ_READ消息到驱动的设备栈,驱动收到这个IRP后,会一直保持这个IRP为未确定(pending)态,因为当时并没有按键操作。直到一个键被真正的按下,驱动此时就会立刻完成这个IRP,并将刚按下的键的相关数据做为该IRP的返回值。在该IRP带着对应的数据返回后,操作系统将这些值传递给对应的事件系统来处理,然后系统紧接着又会立刻发送一个IRP_MJ_READ请求,等待下次的按键操作,重复以上的步骤。 为了实现截获键盘消息,需要在过滤驱动程序中创建一个挂接到物理键盘设备上层的过滤驱动设备。系统发送的IRP_MJ_READ消息会首先到达过滤驱动设备,这样就可以有机会给IRP_MJ_READ设置指定的完成例程,然后将消息下传给物理键盘设备。当有按键动作发生时,IRP_MJ_READ消息在完成后就会调用指定的完成例程,这时就可以在完成例程中读出键盘动作的内容,或者修改这些信息,以实现按键的映射。

相关主题