动态获取权限,文件管理器选择文件,I/O流

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

   <!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />-->


    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />



    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.TNetRecv"
        tools:targetApi="31">

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



</manifest>

Activity

package com.example.tnetrecv;

import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.util.Log;
import android.widget.VideoView;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_PERMISSION = 100;
    private static final String[] PERMISSIONS = {Manifest.permission.READ_EXTERNAL_STORAGE};
    private static final int REQUEST_CODE_FILE_SELECT = 101;

    private Button selectFileButton;
    private ImageView imageView;
    private  VideoView videoView;
    private ActivityResultLauncher<String> requestPermissionLauncher;
    private ActivityResultLauncher<Intent> selectFileLauncher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        videoView = findViewById(R.id.videoView);
        imageView=findViewById(R.id.imageView);
        selectFileButton = findViewById(R.id.selectFileButton);
        selectFileButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkPermissionAndSelectFile();
            }
        });

        // 处理权限结果
        requestPermissionLauncher = registerForActivityResult(
                new ActivityResultContracts.RequestPermission(),
                isGranted -> {
                    if (isGranted) {
                        Toast.makeText(this, "已经授予读取存储权限", Toast.LENGTH_SHORT).show();
                        // 用户授予了读取存储权限
                        selectFile();
                    } else {
                        // 用户拒绝了读取存储权限
                        Toast.makeText(this, "未授予读取存储权限,无法选择文件", Toast.LENGTH_SHORT).show();
                    }
                });

        // 处理文件选择器选择后的结果
        selectFileLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    try{
                        if (result.getResultCode() == RESULT_OK) {
                            if (result.getData() != null) {
                                Uri uri = result.getData().getData();
                                String filePath = getFilePathFromUri(uri);
                               // String filePath2 = uri.toString();
                                if (filePath != null) {
                                    // 处理选中的文件路径
                                   // Log.d("AA", "选中文件:" + filePath);
                                    Toast.makeText(this, "选中文件:" + filePath, Toast.LENGTH_SHORT).show();
                                    showFileContent(filePath);
                                } else {
                                    Log.d("AA", "获取文件路径失败:" );
                                    // 获取文件路径失败
                                    Toast.makeText(this, "获取文件路径失败", Toast.LENGTH_SHORT).show();
                                }
                            }
                        }
                    }catch (Exception e){
                        Log.d("AA", e.toString());
                    }

                });
    }

    //检查权限,没有的话弹出权限框
    private void checkPermissionAndSelectFile() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            // 已经获取了读取存储权限
            selectFile();
        } else {
            // 未获取读取存储权限,需要请求权限
            requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE);
        }
    }


    private void selectFile() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        selectFileLauncher.launch(intent);
    }

    private void showFileContent(String filePath) {
        try {
            InputStream inputStream = getContentResolver().openInputStream(Uri.parse(filePath));
            if (inputStream != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                //读取文本
               /* StringBuilder stringBuilder = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    stringBuilder.append(line).append("\n");
                }
                inputStream.close();

                String fileContent = stringBuilder.toString();
                Log.d("File Content", fileContent);*/

                //分段分段读取文本
                int chunkSize=10;
                char[] buffer = new char[chunkSize];
                int bytesRead; //用于判断是否到文件末尾的变量
                while ((bytesRead = reader.read(buffer, 0, chunkSize)) != -1) {
                    String chunk = new String(buffer, 0, bytesRead);//将字符数组的字符转换成字符串
                }





                //读取二进制图片
                   /* byte byteRead;
                    byte[] imageData=new byte[1000];// 二进制图片数据
                    int i;
                    for ( i=0;(byteRead= (byte)reader.read()) != -1&&i<imageData.length;i++) { //read()方法读取一个字符并返回器int型unicode编码
                        imageData[i]=byteRead;
                        //Log.d("File Content1", Byte.toString(byteRead));
                        Log.d("File Content2", String.valueOf(imageData));
                    }*/


                    //一次性读取图片文件
                  /*  Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(filePath)));
                    imageView.setImageBitmap(bitmap);
                    */

                    //读取视频
                   /* Uri videoUri = Uri.parse(filePath);
                    videoView.setVideoURI(videoUri);
                    videoView.start();*/

            }
        else {
                Log.e("Error", "Failed to open input stream");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }




    private String getFilePathFromUri(Uri uri) {
        String filePath = null;
        if ("content".equals(uri.getScheme())) {
            filePath = uri.toString();
        } else if ("file".equals(uri.getScheme())) {
            filePath = uri.getPath();
        }
        return filePath;
    }






}










layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"

    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/selectFileButton"
        android:text="start"
        />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="400dp"
        android:layout_height="400dp" />
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

项目地址:

https://gitee.com/angel_apple/android-work.git

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
winsxs目录下的文件都是系统要用的各种库文件,system32下存放了这些dll的最新的版本,所有老版本的dll都放在winsxs下。所以只要你安装程序或者更新补丁,system32下的文件就会被更新,而同时winsxs就会增加一些旧文件,所以我们的C盘空间就在持续不断地减少,直到磁盘容量不够,被迫重装系统为止,如果你足够幸运,可以直接安装最新的SP的话,或许可以为winsxs节约一点微薄的空间。 winsxs目录下的不同版本文件都存放在特定命名规则的目录下,比如 C:\Windows\winsxs>dir msil_microsoft.transactions.bridge.resources* 驱动器 C 中的卷是 vista 卷的序列号是 989F-EFF3 C:\Windows\winsxs 的目录 msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.16386_zh-cn_1cde5a17d78fb5ec msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.16716_zh-cn_1cd75781d79605cf msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6000.20876_zh-cn_060fb27df137fddf msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.18000_zh-cn_1cb2dbd3d7e75eb8 msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.18106_zh-cn_1cb252ffd7e7f8cf msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6001.22221_zh-cn_05e71ebbf18d0b5e msil_microsoft.transactions.bridge.resources_b03f5f7f11d50a3a_6.0.6002.18005_zh-cn_1c8e610fd838f2cc 0 个文件 0 字节 7 个目录 5,382,139,904 可用字节 这里的各个部分用下划线分割,其中我们关注的是“6.0.6000.16386”部分,它表示旧文件的版本号,之前则是唯一文件标识,之后是语言,最后部分是散列值(防止名字冲突)。 本工具的设计思想就是删除所有的旧文件。所有满足如下全部条件的目录都会被移动到C:\Windows\winsxs_del目录中。 1.存在比自身更新的版本 2.本身不是最新版本 运行工具前的C盘剩余空间: 所列文件总数: 4473 个文件 3,336,376,627 字节 7655 个目录 326,840,320 可用字节 C:\Windows\winsxs_del> 运行工具并且执行命令 for /d %v in (%SystemRoot%\winsxs_del\*.*) do rd /s /q %v 删除所有可以删除的无用文件之后的剩余空间: 所列文件总数: 52 个文件 7,555,048 字节 131 个目录 5,383,979,008 可用字节 C:\Windows\winsxs_del> 工具源代码如下:请保存为winsxs_clear.bat即可。所有不再需要的文件会移动到c:\windows\winsxs_del目录中,可以直接进行删除。 执行时候,务必请使用“管理员”权限。 1@echo off 2rem 获取windows版本 3set move_dir=%SystemRoot%\winsxs_del 4if not exist %move_dir%\nul md %move_dir% 5set winver=none 6FOR /F "eol=; tokens=4* delims=] " %%i in ('ver') do set winver=%%i 7if "%winver%" == "none" got
目 录 译者序 前言 第1章 Linux操作系统 1 1.1 Linux的简要历史介绍 1 1.2 Linux核心 2 1.2.1 Linux的开发特点 2 1.2.2 Linux分发包 3 1.2.3 为什么要为商业Linux 版本付费 3 1.3 Linux与其他操作系统之间的差异 3 1.3.1 功能丰富 3 1.3.2 多任务 4 1.4 为什么选择 Linux 6 1.4.1 何时使用 Linux 6 1.4.2 服务器与工作站 6 1.4.3 推荐的硬件 7 1.4.4 移植到 Linux工作站 7 1.5 Linux分发包 8 1.6 升级或移植前的考虑 10 1.6.1 硬件兼容性 11 1.6.2 升级 11 1.6.3 从其他操作系统进行移植 12 1.6.4 选择分发包 12 1.7 怎样着手工作 12 1.8 小结 13 1.9 常见问答 13 第2章 Red Hat Linux基本安装 16 2.1 引言 16 2.1.1 物理上独立的机器 16 2.1.2 选择 Linux分发包 16 2.2 初步的安装决定 17 2.2.1 硬件 17 2.2.2 多CPU 17 2.2.3 RAM 17 2.2.4 磁盘 17 2.2.5 RAID 18 2.2.6 网络接口 18 2.2.7 备份问题 19 2.2.8 支持问题 19 2.2.9 安装初步知识 19 2.3 安装 Red Hat 19 2.3.1 快速安装介绍 19 2.3.2 选择安装类型 22 2.4 定制(手工)安装 23 2.4.1 按要求创建分区 23 2.4.2 网络设置 26 2.4.3 时区选择 28 2.4.4 root账号配置 28 2.4.5 验证 29 2.4.6 使用 NIS 或 NIS+ 30 2.4.7 程序包选择 30 2.4.8 X Window 安装 32 2.4.9 程序包安装 34 2.4.10 Linux装载程序与引导盘 35 2.4.11 完成安装 36 2.4.12 配置服务器运行数据库 36 2.4.13 需要注意的事项 36 2.5 Linux的其他风格 36 2.6 小结 37 2.7 常见问答 38 第3章 在 Linux上安装并运行 Oracle 40 3.1 引言 40 3.2 概念 41 3.2.1 系统全局区域 41 3.2.2 程序全局区域 42 3.2.3 表空间 42 3.2.4 数据文件 42 3.2.5 区 42 3.2.6 段 42 3.2.7 控制文件 42 3.2.8 重做日志 42 3.2.9 回退段 42 3.2.10 参数文件 43 3.2.11 版本标识符 43 3.2.12 PL/SQL 43 3.2.13 模式 43 3.4 安装 43 3.4.1 安装前 44 3.4.2 安装Oracle 8 50 3.4.3 安装Oracle 8i 54 3.4.4 安装后 62 3.5 使用 Oracle 8/8i 65 3.5.1 启动和关闭 66 3.5.2 后台进程 67 3.5.3 创建帐号 68 3.5.4 SQL*Plus 70 3.5.5 数据字典 72 3.5.6 导入/导出 73 3.6 第三方软件 73 3.6.1 Orasoft 73 3.6.2 Orac 75 3.6.3 Perl/DBI 76 3.7 小结 76 3.8 常见问答 76 第4章 在Linux上安装 Informix 78 4.1 引言 78 4.2 安装 81 4.2.1 第一部分:软件的获取 和软件的服务器放置 81 4.2.2 第二部分:安装和标记 83 4.2.3 第三部分:磁盘设置和服务器 运行 85 4.2.4 建立 Informix 的数据文件 86 4.2.5 关于磁盘 87 4.2.6 磁盘和目录 87 4.3 关于空间的考虑 88 4.4 配置 88 4.4.1 $INFORMIXDIR/etc/ $ONCONFIG 89 4.4.2 $INFORMIXDIR/etc/sqlhosts 100 4.4.3 /etc/services 100 4.4.4 /opt/data/rootdbs 101 4.4.5 利用 oninit 启动引擎 102 4.4.6 终止引擎 106 4.5 最后的配置 107 4.5.1 回顾 107 4.5.2 Physdbs 107 4.5.3 创建 physdbs 文件 108 4.5.4 logsdbs 111 4.5.5 创建 logsdbs 113 4.5.6 创建新的逻辑日志 114 4.5.7 Tempdbs 123 4.5.8 最终的 $ONCONFIG 配置值 125 4.5.9 重新启动引擎 126 4.6 其他工具 129 4.6.1 Dbaccess 132 4.6.2 Onmonitor 132 4.7 资源 133 4.7.1 Informix 技术支持组织 134 4.7.2 Informix Web 站点 134 4.7.3 Usenet 新闻组 comp.database. informix 134 4.7.4 国际 Informix 用户组(IIUG) 134 4.7.5 Informix出版社 134 4.7.6 Informix 培训 134 4.8 小结 134 4.9 常见问答 135 第5章 在Linux上安装和使用 Sybase 136 5.1 引言 136 5.2 安装 136 5.2.1 安装 SQL Server 11.0.3 137 5.2.2 安装可选的客户机软件 141 5.3 配置 142 5.3.1 配置Sybase Database Server 143 5.3.2 配置Sybase Backup Server 149 5.3.3 配置Sybase Client/Server 库 150 5.3.4 在引导时启动数据库服 务器和备份服务器 151 5.3.5 设置系统管理员口令 151 5.3.6 配置数据库设备和数据库 152 5.3.7 建立用户登录和权限 153 5.4 测试数据库 156 5.5 数据库设计 159 5.6 问题 161 5.6.1 标识列(自动增加) 161 5.6.2 SQL一致性 163 5.6.3 执行环境 164 5.7 小结 168 5.8 常见问答 169 第6章 在 Red Hat Linux上安装DB2 Universal Database 6.1 170 6.1 引言 170 6.2 为安装DB2准备 Red Hat工作站 171 6.2.1 为DB2安装准备 Red Hat 5.2 和 6.0 172 6.2.2 为DB2安装准备 Red Hat 6.1 172 6.3 安装 DB2 173 6.3.1 进行安装 174 6.3.2 检验安装 180 6.4 配置Control Center 182 6.5 安装DB2客户机 184 6.6 配置DB2客户机与DB2服务器通信 188 6.7 小结 194 6.8 常见问答 195 第7章 在Linux上安装MySQL 198 7.1 引言 198 7.2 安装 199 7.2.1 命名约定 199 7.2.2 二进制分发包的安装 201 7.2.3 RPM 分发包的安装 202 7.2.4 源代码分发包的安装 202 7.3 配置 204 7.3.1 安全性 204 7.3.2 权限 205 7.3.3 访问控制 208 7.3.4 系统设置 209 7.3.5 性能 210 7.4 问题 212 7.4.1 线程 213 7.4.2 运行环境 213 7.5 故障处理 214 7.6 小结 215 7.7 常见问答 216 第8章 在Linux上安装和管理Progress 218 8.1 引言 218 8.2 安装 218 8.2.1 从介质中安装 219 8.2.2 核心参数 223 8.2.3 环境设置 225 8.3 配置 226 8.3.1 目录结构 227 8.3.2 磁盘空间与 I/O 吞吐量 227 8.3.3 创建新数据库 229 8.3.4 设置缓冲池尺寸 230 8.4 运行Progress 231 8.5 故障排除 241 8.6 优缺点 242 8.6.1 4GL 243 8.6.2 面向 OLTP 243 8.6.3 可靠的崩溃恢复 243 8.6.4 成本 243 8.6.5 词索引 244 8.6.6 国际化 244 8.6.7 24×7运转 244 8.6.8 无二进制大对象 244 8.6.9 无并行查询 245 8.6.10 无分布式锁管理程序 245 8.7 小结 249 8.8 常见问答 249 第9章 Linux上的Postgre SQL 252 9.1 引言 252 9.2 Internet 驱动Postgre SQL 252 9.3 获得Postgre SQL 253 9.4 PostgreSQL 快速安装说明 254 9.5 详细安装 255 9.6 资源分发包的安装 259 9.6.1 准备工作 259 9.6.2 循序渐进的过程 260 9.7 PostgreSQL样例 RPM 264 9.8 测试Tcl/Tk接口 264 9.9 测试Python接口—PyGreSQL 264 9.10 测试Perl接口 265 9.11 测试libpq和libpq++ 接口 265 9.12 测试Java接口 266 9.13 测试ecpg接口 266 9.14 测试ODBC接口 267 9.15 测试MPSQL Motif-Worksheet 接口 267 9.16 测试SQL样例—用户定义 类型和函数 267 9.17 验证PostgreSQL安装 267 9.18 紧急问题处理 268 9.19 怎样才能信赖 PostgreSQL 268 9.20 系统布局 268 9.21 Kerberos 验证 269 9.21.1 可用性 269 9.21.2 安装 269 9.21.3 运行 269 9.22 运行时的环境—从 UNIX/Linux 中使用 Postgres 270 9.22.1 启动 postmaster 270 9.22.2 使用 pg_options 270 9.22.3 认可的选项 271 9.23 安全 273 9.23.1 用户验证 273 9.23.2 基于主机的访问控制 273 9.23.3 验证方法 274 9.23.4 建立用户 275 9.23.5 建立组 275 9.23.6 访问控制 275 9.23.7 函数和规则 275 9.23.8 函数 275 9.23.9 规则 276 9.23.10 说明 276 9.23.11 安全的TCP/IP连接 276 9.23.12 通过ssh运行安全隧道 276 9.24 增加与删除用户 276 9.25 磁盘管理—支持大型数据库 277 9.26 管理数据库 278 9.26.1 创建数据库 278 9.26.2 访问数据库 278 9.26.3 删除数据库 279 9.26.4 备份和恢复 279 9.26.5 大型数据库 280 9.27 使用 PostgreSQL 的 KVM 开关 280 9.28 故障排除—postmaster 启动故障 281 9.28.1 客户机连接问题 282 9.28.2 调试消息 282 9.28.3 pg_options 283 9.29 技术支持 284 9.30 邮件清单 284 9.30.1 PostgreSQL 的电子邮件账号 284 9.30.2 英文邮件清单 285 9.30.3 邮件清单的归档 285 9.30.4 西班牙邮件清单 285 9.31 PostgreSQL的GUI前台工具 285 9.32 ODBC、JDBC和UDBC驱动程序 286 9.33 Perl 和 DBI 接口 287 9.34 PostgreSQL的教材 289 9.35 PostgreSQL URL 参考 290 9.36 小结 290 9.37 常见问答 291 第10章 开发基于Web的应用程序 295 10.1 引言 295 10.2 Web 应用程序平台 296 10.2.1 Active Server Pages 296 10.2.2 Cold Fusion 296 10.2.3 Java Server Pages 296 10.2.4 Zope 296 10.2.5 Scripting Languages 296 10.2.6 PHP 297 10.2.7 Apache 297 10.3 入门 297 10.4 设计相应的模式 298 10.5 数据 299 10.5.1 PHP、MySQL 和 Apache: 安装样例应用程序 300 10.5.2 PHP 数据库连通性:进行连接 300 10.6 小结 302 10.7 常见问答 302 附录A 汽车销售应用程序脚本 304 附录B 汽车销售应用程序转储文件 327
pcf8563_i2c1_r8_ruoge_ov2640通过给RTC驱动增加设备节点读取秒钟成功+直接读取I2C1获取秒钟值20160626_2201.7z http://blog.csdn.net/21cnbao/article/details/7919055 在Android源码树中添加userspace I2C读写工具(i2c-util) 本文使用的开发板是:杭州若格科技有限公司的全志R8。CPU:CPUARM Cortex-A8 更多芯片资料请参见全志官网: http://www.allwinnertech.com/clq/r/R8.html 通过/dev/i2c-n节点,用户可以在userspace直接访问板上的i2c外设寄存器,主要是透过I2C_RDWR这个IO控制命令将i2c_msg数组传递给kernel去执行。 开发板的/dev/i2c-1总线下挂有一片I2C的RTC:pcf8563。 root@android:/dev # cd /sys/class/i2c-adapter/ root@android:/sys/class/i2c-adapter # ll lrwxrwxrwx root root 1970-01-02 08:31 i2c-0 -> ../../devices/platform/sun5i-i2c.0/i2c-0 lrwxrwxrwx root root 1970-01-02 08:31 i2c-1 -> ../../devices/platform/sun5i-i2c.1/i2c-1 lrwxrwxrwx root root 1970-01-02 08:31 i2c-2 -> ../../devices/platform/sun5i-i2c.2/i2c-2 root@android:/sys/class/i2c-adapter # cd i2c-1 root@android:/sys/class/i2c-adapter/i2c-1 # ll drwxr-xr-x root root 1970-01-02 08:31 1-0051 --w------- root root 4096 1970-01-02 08:31 delete_device lrwxrwxrwx root root 1970-01-02 08:31 device -> ../../sun5i-i2c.1 drwxr-xr-x root root 1970-01-01 08:00 i2c-dev -r--r--r-- root root 4096 1970-01-02 08:31 name --w------- root root 4096 1970-01-02 08:31 new_device drwxr-xr-x root root 1970-01-01 08:00 power lrwxrwxrwx root root 1970-01-02 08:31 subsystem -> ../../../../bus/i2c -rw-r--r-- root root 4096 1970-01-01 08:00 uevent root@android:/sys/class/i2c-adapter/i2c-1 # root@android:/sys/class/i2c-adapter/i2c-1 # cd 1-0051/ root@android:/sys/class/i2c-adapter/i2c-1/1-0051 # ll lrwxrwxrwx root root 1970-01-02 10:18 driver -> ../../../../../bus/i2c/drivers/pcf8563 -r--r--r-- root root 4096 1970-01-02 10:18 modalias -r--r--r-- root root 4096 1970-01-02 10:18 name drwxr-xr-x root root 1970-01-02 10:18 power drwxr-xr-x root root 1970-01-02 10:18 rtc lrwxrwxrwx root root 1970-01-02 10:18 subsystem -> ../../../../../bus/i2c -rw-r--r-- root root 4096 1970-01-02 10:18 uevent root@android:/sys/class/i2c-adapter/i2c-1/1-0051 # cat name pcf8563 root@android:/sys/class/i2c-adapter/i2c-1/1-0051 # 注释:1-0051 1 表示 i2c-1这条I2C1总线上挂载的设备,如果是I2C2总线上挂载的设备,路径就是2-00XX了。 0051 一般的I2C设备的从机地址都是一个字节的,因为前两位为0x00(16进制的),后两位为pcf8563移位自后的I2C从机地址0x51(也是16进制的) 压缩包中的PCF8563-CN.pdf,datasheet告诉我们:I2C总线从地址:读,0A3H;写,0A2H。右移一位之后正好是0x51。 下面的代码可以完成这个功能: #include #include #include #include #include #include #include #include #include #include #include /* This is the structure as used in the I2C_RDWR ioctl call */ struct i2c_rdwr_ioctl_data { struct i2c_msg __user *msgs; /* pointers to i2c_msgs */ __u32 nmsgs; /* number of i2c_msgs */ }; int i2c_read_reg(char *dev, unsigned char *buf, unsigned slave_address, unsigned reg_address, int len) { struct i2c_rdwr_ioctl_data work_queue; unsigned char w_val = reg_address; int ret; int fd = open(dev, O_RDWR); if (!fd) { printf("Error on opening the device file\n"); return 0; } work_queue.nmsgs = 2; work_queue.msgs = (struct i2c_msg*)malloc(work_queue.nmsgs *sizeof(struct i2c_msg)); if (!work_queue.msgs) { printf("Memory alloc error\n"); close(fd); return 0; } ioctl(fd, I2C_TIMEOUT, 2); ioctl(fd, I2C_RETRIES, 1); (work_queue.msgs[0]).len = 1; (work_queue.msgs[0]).addr = slave_address; (work_queue.msgs[0]).buf = &w_val; (work_queue.msgs[1]).len = len; (work_queue.msgs[1]).flags = I2C_M_RD; (work_queue.msgs[1]).addr = slave_address; (work_queue.msgs[1]).buf = buf; ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue); if (ret < 0) { printf("Error during I2C_RDWR ioctl with error code: %d\n", ret); close(fd); free(work_queue.msgs); return 0; } else { printf("read salve:x reg:x\n", slave_address, reg_address); close(fd); free(work_queue.msgs); return len; } } int i2c_write_reg(char *dev, unsigned char *buf, unsigned slave_address, unsigned reg_address, int len) { struct i2c_rdwr_ioctl_data work_queue; unsigned char w_val = reg_address; unsigned char w_buf[len+1]; int ret; w_buf[0] = reg_address; int fd = open(dev, O_RDWR); if (!fd) { printf("Error on opening the device file\n"); return 0; } work_queue.nmsgs = 1; work_queue.msgs = (struct i2c_msg*)malloc(work_queue.nmsgs *sizeof(struct i2c_msg)); if (!work_queue.msgs) { printf("Memory alloc error\n"); close(fd); return 0; } ioctl(fd, I2C_TIMEOUT, 2); ioctl(fd, I2C_RETRIES, 1); (work_queue.msgs[0]).len = 1 + len; (work_queue.msgs[0]).addr = slave_address; (work_queue.msgs[0]).buf = w_buf; memcpy(w_buf + 1, buf, len); ret = ioctl(fd, I2C_RDWR, (unsigned long) &work_queue); if (ret < 0) { printf("Error during I2C_RDWR ioctl with error code: %d\n", ret); close(fd); free(work_queue.msgs); return 0; } else { printf("write salve:x reg:x\n", slave_address, reg_address); close(fd); free(work_queue.msgs); return len; } } int main(int argc, char **argv) { unsigned int fd; unsigned int slave_address, reg_address; unsigned r_w; unsigned w_val; unsigned char rw_val; if (argc < 5) { printf("Usage:\n%s /dev/i2c-x start_addr reg_addr rw[0|1] [write_val]\n", argv[0]); return 0; } fd = open(argv[1], O_RDWR); if (!fd) { printf("Error on opening the device file %s\n", argv[1]); return 0; } sscanf(argv[2], "%x", &slave_address); sscanf(argv[3], "%x", &reg_address); sscanf(argv[4], "%d", &r_w); if (r_w == 0) { i2c_read_reg(argv[1], &rw_val, slave_address, reg_address, 1); printf("Read %s-%x reg %x, read value:%x\n", argv[1], slave_address, reg_address, rw_val); } else { if (argc < 6) { printf("Usage:\n%s /dev/i2c-x start_addr reg_addr r|w[0|1] [write_val]\n", argv[0]); return 0; } sscanf(argv[5], "%d", &w_val); if ((w_val & ~0xff) != 0) printf("Error on written value %s\n", argv[5]); rw_val = (unsigned char)w_val; i2c_write_reg(argv[1], &rw_val, slave_address, reg_address, 1); } return 0; } 在android/external/新建i2c-util目录,上述源代码存入android/external/i2c-util/i2c-util.c, R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\i2c-util\i2c-util.c 编写对应的Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE = i2c-util # LOCAL_SRC_FILES := $(call all-subdir-c-files) LOCAL_SRC_FILES := i2c-util.c include $(BUILD_EXECUTABLE) 编译Android后,上述工具会位于/system/bin目录。在电路板上使用它: R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin\i2c-util 如果android已经编译了,只需要执行: rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ source build/envsetup.sh rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ lunch 选择:18. nuclear_evb-eng (注意:不同的ubuntu电脑,序号可能不同,但是只需要选择nuclear_evb-eng编译选项前面的序号既可!!!!) rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ cd i2c-util/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ mm 详细的编译步骤: Connecting to 192.168.1.103:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Sun Jun 26 19:23:30 2016 from 192.168.1.101 rootroot@rootroot-E400:~$ cd wyb/pcf8563_i2c1_r8_ruoge_ov2640/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640$ ll total 8606460 drwxr-xr-x 4 rootroot rootroot 4096 Jun 26 20:46 ./ drwxr-xr-x 19 rootroot rootroot 4096 Jun 25 06:50 ../ drwxrwxr-x 29 rootroot rootroot 4096 Jun 26 19:51 android/ drwxrwxr-x 8 rootroot rootroot 4096 Jun 26 16:35 lichee/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640$ cd android/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ source build/envsetup.sh including device/asus/grouper/vendorsetup.sh including device/asus/tilapia/vendorsetup.sh including device/generic/armv7-a-neon/vendorsetup.sh including device/generic/armv7-a/vendorsetup.sh including device/generic/mips/vendorsetup.sh including device/generic/x86/vendorsetup.sh including device/samsung/maguro/vendorsetup.sh including device/samsung/manta/vendorsetup.sh including device/samsung/toroplus/vendorsetup.sh including device/samsung/toro/vendorsetup.sh including device/softwinner/common/vendorsetup.sh including device/softwinner/crane-evb/vendorsetup.sh including device/softwinner/nuclear-256m/vendorsetup.sh including device/softwinner/nuclear-evb/vendorsetup.sh including device/softwinner/nuclear-r8m-evb/vendorsetup.sh including device/ti/panda/vendorsetup.sh including sdk/bash_completion/adb.bash rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ lunch You're building on Linux Lunch menu... pick a combo: 1. full-eng 2. full_x86-eng 3. vbox_x86-eng 4. full_mips-eng 5. full_grouper-userdebug 6. full_tilapia-userdebug 7. mini_armv7a_neon-userdebug 8. mini_armv7a-userdebug 9. mini_mips-userdebug 10. mini_x86-userdebug 11. full_maguro-userdebug 12. full_manta-userdebug 13. full_toroplus-userdebug 14. full_toro-userdebug 15. crane_evb-eng 16. nuclear_256m-user 17. nuclear_256m-eng 18. nuclear_evb-eng 19. nuclear_r8m_evb-eng 20. full_panda-userdebug Which would you like? [full-eng] 18 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.2.2 TARGET_PRODUCT=nuclear_evb TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty HOST_BUILD_TYPE=release BUILD_ID=JDQ39 OUT_DIR=out ============================================ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ ll total 156 drwxrwxr-x 29 rootroot rootroot 4096 Jun 26 19:51 ./ drwxr-xr-x 4 rootroot rootroot 4096 Jun 26 20:46 ../ drwxrwxr-x 3 rootroot rootroot 4096 Jun 13 11:38 abi/ drwxrwxr-x 10 rootroot rootroot 4096 Jun 13 11:38 bionic/ drwxrwxr-x 5 rootroot rootroot 4096 Jun 13 11:38 bootable/ drwxrwxr-x 7 rootroot rootroot 4096 Jun 13 11:38 build/ drwxrwxr-x 11 rootroot rootroot 4096 Jun 13 11:38 cts/ drwxrwxr-x 18 rootroot rootroot 4096 Jun 13 11:38 dalvik/ drwxrwxr-x 18 rootroot rootroot 4096 Jun 13 11:38 development/ drwxrwxr-x 10 rootroot rootroot 4096 Jun 13 11:38 device/ drwxrwxr-x 3 rootroot rootroot 4096 Jun 13 11:38 docs/ drwxrwxr-x 159 rootroot rootroot 4096 Jun 13 11:39 external/ drwxrwxr-x 14 rootroot rootroot 4096 Jun 13 11:40 frameworks/ drwxrwxr-x 10 rootroot rootroot 4096 Jun 13 11:40 gdk/ drwxrwxr-x 10 rootroot rootroot 4096 Jun 13 11:40 hardware/ drwxr-xr-x 2 rootroot rootroot 4096 Jun 26 19:37 i2cscan/ drwxr-xr-x 2 rootroot rootroot 4096 Jun 26 19:52 i2c-util/ drwxrwxr-x 11 rootroot rootroot 4096 Jun 13 11:40 libcore/ drwxrwxr-x 4 rootroot rootroot 4096 Jun 13 11:40 libnativehelper/ -r--r--r-- 1 rootroot rootroot 87 Jun 13 11:38 Makefile drwxrwxr-x 8 rootroot rootroot 4096 Jun 13 11:40 ndk/ drwxrwxr-x 4 rootroot rootroot 4096 Jun 26 16:43 out/ drwxrwxr-x 8 rootroot rootroot 4096 Jun 13 11:40 packages/ drwxrwxr-x 5 rootroot rootroot 4096 Jun 13 11:40 pdk/ drwxrwxr-x 10 rootroot rootroot 4096 Jun 13 11:41 prebuilts/ drwxr-xr-x 2 rootroot rootroot 4096 Jun 25 13:01 read_pcf8563/ drwxrwxr-x 6 rootroot rootroot 4096 Jun 13 11:38 .repo/ drwxrwxr-x 51 rootroot rootroot 4096 Jun 13 11:41 sdk/ drwxrwxr-x 9 rootroot rootroot 4096 Jun 13 11:41 system/ drwxrwxr-x 4 rootroot rootroot 4096 Jun 13 11:41 tools/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android$ cd i2c-util/ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ rootroot@rootroot-E400:~/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android/i2c-util$ mm ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=4.2.2 TARGET_PRODUCT=nuclear_evb TARGET_BUILD_VARIANT=eng TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon HOST_ARCH=x86 HOST_OS=linux HOST_OS_EXTRA=Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty HOST_BUILD_TYPE=release BUILD_ID=JDQ39 OUT_DIR=out ============================================ PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/Effect_Tick.ogg:system/media/audio/ui/Effect_Tick.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/LowBattery.ogg:system/media/audio/ui/LowBattery.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/Dock.ogg:system/media/audio/ui/Dock.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/Undock.ogg:system/media/audio/ui/Undock.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/Lock.ogg:system/media/audio/ui/Lock.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/Unlock.ogg:system/media/audio/ui/Unlock.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/notifications/ogg/Capella.ogg:system/media/audio/notifications/Capella.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/notifications/ogg/CetiAlpha.ogg:system/media/audio/notifications/CetiAlpha.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/notifications/ogg/Polaris.ogg:system/media/audio/notifications/Polaris.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/notifications/ogg/Pollux.ogg:system/media/audio/notifications/Pollux.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/notifications/ogg/Procyon.ogg:system/media/audio/notifications/Procyon.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Aquila.ogg:system/media/audio/ringtones/Aquila.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/ArgoNavis.ogg:system/media/audio/ringtones/ArgoNavis.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Carina.ogg:system/media/audio/ringtones/Carina.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Centaurus.ogg:system/media/audio/ringtones/Centaurus.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Cygnus.ogg:system/media/audio/ringtones/Cygnus.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Draco.ogg:system/media/audio/ringtones/Draco.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Machina.ogg:system/media/audio/ringtones/Machina.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Orion.ogg:system/media/audio/ringtones/Orion.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Pegasus.ogg:system/media/audio/ringtones/Pegasus.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Pyxis.ogg:system/media/audio/ringtones/Pyxis.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Rigel.ogg:system/media/audio/ringtones/Rigel.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Scarabaeus.ogg:system/media/audio/ringtones/Scarabaeus.ogg ignored. PRODUCT_COPY_FILES frameworks/base/data/sounds/ringtones/ogg/Solarium.ogg:system/media/audio/ringtones/Solarium.ogg ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/es-ES_zl0_sg.bin:system/tts/lang_pico/es-ES_zl0_sg.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/es-ES_ta.bin:system/tts/lang_pico/es-ES_ta.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/fr-FR_nk0_sg.bin:system/tts/lang_pico/fr-FR_nk0_sg.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/fr-FR_ta.bin:system/tts/lang_pico/fr-FR_ta.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/de-DE_gl0_sg.bin:system/tts/lang_pico/de-DE_gl0_sg.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/it-IT_cm0_sg.bin:system/tts/lang_pico/it-IT_cm0_sg.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/it-IT_ta.bin:system/tts/lang_pico/it-IT_ta.bin ignored. PRODUCT_COPY_FILES device/softwinner/nuclear-common/googleservice/gapps-jb-20121130-signed/system/tts/lang_pico/de-DE_ta.bin:system/tts/lang_pico/de-DE_ta.bin ignored. No private recovery resources for TARGET_DEVICE nuclear-evb make: Entering directory `/home/rootroot/wyb/pcf8563_i2c1_r8_ruoge_ov2640/android' target thumb C: i2c-util cd R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin C:\Users\Administrator.USER-20150913SZ>r: R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin>adb remount remount succeeded R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin> R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin>dir i2c* 驱动器 R 中的卷是 rootroot 卷的序列号是 1A1C-E71D R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin 的目录 2016/06/26 21:10 5,388 i2c-util 1 个文件 5,388 字节 0 个目录 268,337,782,784 可用字节 R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin> R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin>adb push i2c-util /data/ 29 KB/s (5388 bytes in 0.180s) R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\android\out\target\product\nuclear-evb\system\bin> 将R8的串口连接到windows电脑上。通过串口工具:比如Xshell5(有些人可能喜欢使用SecureCRT)读取R8的串口打印 (ubuntu下请使用minicom,使用方法请自行搜索了) 波特率选择:115200 N 8 1 等R8的android启动完成之后(LCD进android主界面),输入:su [ 37.990060] init: process 'ril-daemon', pid 950 exited [ 38.010049] init: process 'ril-daemon' killing any children in process group su root@android:/ # root@android:/ # root@android:/ # cd /data root@android:/data # root@android:/data # ll drwxrwxr-x system system 1970-01-11 08:58 anr drwxrwx--x system system 1970-01-02 08:01 app drwx------ root root 1980-10-01 11:03 app-asec drwxrwx--x system system 1970-01-02 08:01 app-lib drwxrwx--x system system 1980-10-01 11:03 app-private drwx------ system system 1980-10-01 11:04 backup drwxrwx--x system system 1970-01-02 08:00 dalvik-cache drwxrwx--x system system 2016-06-21 10:11 data drwxr-x--- root log 1980-10-01 11:03 dontpanic drwxrwx--- drm drm 1980-10-01 11:04 drm -rw-rw-rw- root root 5388 2016-06-26 21:10 i2c-util drwxr-x--x root root 1980-10-01 11:03 local drwxrwx--- root root 1970-01-01 08:00 lost+found drwxrwx--- media_rw media_rw 1980-10-01 11:03 media drwxrwx--t system misc 1980-10-01 11:03 misc -rw------- system system 154 1970-01-02 08:02 pointercal drwx------ root root 1970-01-02 08:00 property -rwxrwxrwx root root 5392 2016-06-25 13:01 read_pcf8563 drwxrwx--x system system 1980-10-01 11:03 resource-cache drwxr-x--- root shell 1980-10-01 11:03 ssh drwxrwxr-x system system 1970-01-02 08:00 system drwx------ system system 1970-01-02 08:03 tombstones drwx--x--x system system 1980-10-01 11:03 user root@android:/data # (让i2c-util具有可执行权限:) root@android:/data # chmod 777 i2c-util root@android:/data # root@android:/data # ll i2c* -rwxrwxrwx root root 5388 2016-06-26 21:10 i2c-util root@android:/data # root@android:/data # root@android:/data # (可选执行) root@android:/data # sync root@android:/data # 注意:串口打印会打印很多log信息。上面的步骤中的状态信息已经被过滤了。 如果你的串口打印过量的log信息,属于正常现象! 如果不想要这么多的状态信息,可以考虑使用adb shell。 不过windows命令行中的adb shell不能够按TAB键自动补充,ubuntu的可以。 也许我们可以把windows的命令行特别设计一下(给它修正一下),让它也可以通过按TAB键来自动补全!^_ 读取pcf8563的第2个寄存器(秒钟值): 表 5:BCD 格式寄存器概况 标明“-”的位无效 地址 寄存器名称 Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 02h 秒 VL 00~59BCD 码格式数 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:11 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:12 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:12 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:13 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:14 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:14 root@android:/data # ./i2c-util /dev/i2c-1 0x51 0x02 0 read salve:51 reg:02 Read /dev/i2c-1-51 reg 2, read value:15 可以知道秒钟的值是变化的,基本上是一秒钟递增一次,I2C读取成功。 如果感兴趣的话,在执行读取命令的时候通过协议分析仪或者示波器来抓取I2C1的SCL/SDA的波形,来进行更加详尽的分析!^_ 方法二: 给出了一种复杂的解决办法(步骤从简,更多请参考开头的方法): R:\wyb\pcf8563_i2c1_r8_ruoge_ov2640\lichee\linux-3.4\drivers\rtc\rtc-sun5i.c 给这个驱动文件增加设备节点:/dev/a20_r8_pcf8563 增加设备节点的方法请参考: http://blog.csdn.net/mirkerson/article/details/8844997 android驱动学习---led实验 然后在这个驱动文件的pcf8563_probe函数处截获它的client指针(struct i2c_client *client) client2 = client; 用户可以通过在userspace直接访问设备节点:/dev/a20_r8_pcf8563(open) 然后调用ioctl:ioctl(fd, 0x00000001, 0x02); 来获取第2个寄存器:秒钟的值了。 #include #include #include #include #include #include #include #include #include #include #include int fd; int main(int argc, char **argv) { fd = open("/dev/a20_r8_pcf8563", O_RDWR); ioctl(fd, 0x00000001, 0x02); close(fd); return 0; } 执行过程(直接从内核打印秒钟值了,也可以看到秒钟值大概也是一秒钟递增一次!): root@android:/data # root@android:/data # ./read_pcf8563 [ 1397.060015] ****wyb drivers/rtc/rtc-sun5i.c:1169/r8_pcf8563_open()! open init.... [ 1397.071009] ****wyb drivers/rtc/rtc-sun5i.c:1130/r8_pcf8563_ioctl()! cmd=0x00000001 [ 1397.079076] ****wyb drivers/rtc/rtc-sun5i.c:1160/r8_pcf8563_ioctl()! cmd=0x00000001, value=0x00000046 [ 1397.088342] ****wyb drivers/rtc/rtc-sun5i.c:1177/r8_pcf8563_close()! close init root@android:/data # root@android:/data # ./read_pcf8563 [ 1398.409888] ****wyb drivers/rtc/rtc-sun5i.c:1169/r8_pcf8563_open()! open init.... [ 1398.411203] ****wyb drivers/rtc/rtc-sun5i.c:1130/r8_pcf8563_ioctl()! cmd=0x00000001 [ 1398.419273] ****wyb drivers/rtc/rtc-sun5i.c:1160/r8_pcf8563_ioctl()! cmd=0x00000001, value=0x00000047 [ 1398.428546] ****wyb drivers/rtc/rtc-sun5i.c:1177/r8_pcf8563_close()! close init root@android:/data # root@android:/data # root@android:/data # ./read_pcf8563 [ 1399.668173] ****wyb drivers/rtc/rtc-sun5i.c:1169/r8_pcf8563_open()! open init.... [ 1399.670939] ****wyb drivers/rtc/rtc-sun5i.c:1130/r8_pcf8563_ioctl()! cmd=0x00000001 [ 1399.679022] ****wyb drivers/rtc/rtc-sun5i.c:1160/r8_pcf8563_ioctl()! cmd=0x00000001, value=0x00000048 [ 1399.688299] ****wyb drivers/rtc/rtc-sun5i.c:1177/r8_pcf8563_close()! close init root@android:/data #
Sybase ASE 15.7 开发文档:系统管理指南(卷二)共两卷 第 1 章 限制对服务器资源的访问 第 2 章 镜像数据库设备 第 3 章 配置内存 第 4 章 配置数据高速缓存 第 5 章 管理多处理器服务器 第 6 章 创建和管理用户数据库 第 7 章 装入和卸下数据库 第 8 章 分布式事务管理 第 9 章 创建和使用段 第 10 章 使用 reorg 命令 第 11 章 检查数据库一致性 第 12 章 制定备份和恢复计划 第 13 章 备份和恢复用户数据库 第 14 章 恢复系统数据库 第 15 章 存档数据库访问 第 16 章 自动扩展数据库 第 17 章 使用阈值管理可用空间 第 1 章限制对服务器资源的访问 .......... 1 资源限制 .......... 1 计划资源限制 .......... 2 启用资源限制 .......... 2 定义时间范围 .......... 3 确定所需的时间范围 .......... 3 创建指定的时间范围 .......... 4 修改指定的时间范围 .......... 5 删除指定的时间范围 .......... 5 时间范围更改何时生效? .......... 6 确定用户和限制 .......... 6 标识使用大量资源的用户 .......... 7 标识使用大量资源的应用程序 .......... 7 选择限制类型 .......... 8 确定强制时间 .......... 9 确定资源限制的范围 .......... 9 了解限制类型 .......... 10 限制 I/O 开销 .......... 11 限制经历时间 .......... 12 限制结果集的大小 .......... 13 设置 tempdb 空间使用限制 .......... 14 限制空闲时间 .......... 14 创建资源限制 .......... 14 资源限制示例 .......... 15 获得关于现有限制的信息 .......... 16 列出所有现有资源限制 .......... 16 修改资源限制 .......... 17 删除资源限制 .......... 17 资源限制的优先级 .......... 18 时间范围 .......... 18 资源限制 .......... 18 第 2 章镜像数据库设备 .......... 19 磁盘镜像 .......... 19 确定镜像对象 .......... 19 使用最小物理磁盘空间进行镜像 .......... 20 不间断恢复的镜像 .......... 21 不禁用镜像的条件 .......... 22 磁盘镜像命令 .......... 23 初始化镜像 .......... 23 取消镜像设备 .......... 24 重新启动镜像 .......... 24 waitfor mirrorexit .......... 25 镜像主设备 .......... 25 获取有关设备和镜像的信息 .......... 25 磁盘镜像教程 .......... 26 调整磁盘大小和磁盘镜像 .......... 28 第 3 章配置内存 .......... 29 确定可供 Adaptive Server 使用的内存 .......... 29 Adaptive Server 如何分配内存 .......... 30 磁盘空间分配 .......... 31 较大逻辑页大小和缓冲区 .......... 32 堆内存 .......... 32 Adaptive Server 如何使用内存 .......... 34 确定 Adaptive 所需的内存量 .......... 36 确定 Adaptive Server 内存配置 .......... 37 如果正在升级 .......... 38 确定 Adaptive Server 可以使用的内存量 .......... 38 影响内存分配的配置参数 .......... 39 动态分配内存 .......... 41 如果 Adaptive Server 不能启动 .......... 41 动态降低内存配置参数 .......... 41 配置线程池 .......... 45 确定线程总数 .......... 47 Tuning the syb_blocking_pool .......... 48 配置内存的系统过程 .......... 48 使用 sp_configure 设置配置参数 .......... 48 使用 sp_helpconfig .......... 50 使用 sp_monitorconfig .......... 51 控制 Adaptive Server 内存的配置参数 .......... 53 Adaptive Server 可执行代码大小 .......... 53 数据和过程高速缓存 .......... 54 Kernel resource memory .......... 56 用户连接数 .......... 56 打开的数据库、打开的索引和打开的对象 .......... 57 锁数目 .......... 57 数据库设备和磁盘 I/O 结构 .......... 58 使用内存的其它参数 .......... 58 并行处理 .......... 59 远程服务器 .......... 59 参照完整性 .......... 60 影响内存的其它参数 .......... 60 语句高速缓存 .......... 61 设置语句高速缓存 .......... 61 第 4 章配置数据高速缓存 .......... 69 Adaptive Server 数据高速缓存 .......... 69 高速缓存配置命令和系统过程 .......... 71 有关数据高速缓存的信息 .......... 72 配置数据高速缓存 .......... 73 创建新高速缓存 .......... 75 向现有命名高速缓存添加内存 .......... 76 减小高速缓存的大小 .......... 77 删除高速缓存 .......... 78 显式配置缺省高速缓存 .......... 79 更改高速缓存类型 .......... 81 配置高速缓存替换策略 .......... 81 将数据高速缓存划分为若干内存池 .......... 83 匹配日志高速缓存的日志 I/O 大小 .......... 85 将对象绑定到高速缓存 .......... 86 高速缓存绑定限制 .......... 87 获得有关高速缓存绑定的信息 .......... 87 检查高速缓存开销 .......... 88 开销如何影响总的高速缓存空间 .......... 88 删除高速缓存绑定 .......... 89 更改内存池的清洗区 .......... 90 如果清洗区过小 .......... 92 如果清洗区过大 .......... 93 设置管家以避免高速缓存的清洗 .......... 93 更改缓冲池的异步预取限制 .......... 94 更改内存池的大小 .......... 94 从内存池移走空间 .......... 94 从其它内存池移走空间 .......... 95 增加高速缓存分区数 .......... 97 设置高速缓存分区数 .......... 97 设置本地高速缓存分区数 .......... 97 优先级 .......... 98 删除内存池 .......... 98 由于页的使用而不能删除缓冲池时 .......... 99 高速缓存绑定对内存和查询计划的影响 .......... 99 从高速缓存中刷新页 .......... 99 锁定以执行绑定 .......... 99 高速缓存绑定对存储过程和触发器的影响 .......... 100 使用配置文件配置数据高速缓存 .......... 100 配置文件中的高速缓存和缓冲池条目 .......... 100 高速缓存配置指南 .......... 104 第 5 章管理多处理器服务器 .......... 107 Adaptive Server 内核 .......... 107 目标体系结构 .......... 108 内核模式 .......... 112 切换内核模式 .......... 113 任务 .......... 114 使用线程运行任务 .......... 114 配置 SMP 环境 .......... 115 线程池 .......... 115 管理引擎 .......... 117 启动和停止引擎 .......... 118 管理用户连接(仅进程模式) .......... 121 影响 SMP 系统的配置参数 .......... 122 第 6 章创建和管理用户数据库 .......... 125 创建和管理用户数据库的命令 .......... 125 管理用户数据库的权限 .......... 126 使用 create database 命令 .......... 127 为数据库指派空间和设备 .......... 128 缺省数据库大小和设备 .......... 129 估计所需空间 .......... 129 把事务日志存放在单独的设备上 .......... 130 估计事务日志大小 .......... 130 缺省日志大小和设备 .......... 131 将事务日志移动到其它设备 .......... 131 缩减日志空间 .......... 133 缩减日志空间时使用 dump 和 load database .......... 133 缩减日志空间时使用 dump 和 load transaction .......... 137 使用 for load 选项进行数据库恢复 .......... 143 使用 create database 的 with override 选项 .......... 144 更改数据库所有权 .......... 145 变更数据库 .......... 145 alter database 语法 .......... 146 使用 drop database 命令 .......... 147 管理空间分配的系统表 .......... 147 sysusages 表 .......... 148 获取有关数据库存储的信息 .......... 152 数据库设备名和选项 .......... 152 检查使用的空间量 .......... 153 查询系统表中的空间使用信息 .......... 155 第 7 章装入和卸下数据库 .......... 157 概述 .......... 157 清单文件 .......... 158 复制和移动数据库 .......... 159 性能考虑事项 .......... 160 设备检验 .......... 160 装入和卸载数据库 .......... 160 卸下数据库 .......... 161 装入数据库 .......... 162 创建数据库的可装入副本 .......... 164 将数据库从一个 Adaptive Server 移到 另一个 Adaptive Server .......... 164 系统限制 .......... 165 quiesce database 扩展 .......... 165 第 8 章分布式事务管理 .......... 167 受影响的事务类型 .......... 168 由外部事务管理器协调的分布式事务 .......... 168 RPC 和 CIS 事务 .......... 169 SYB2PC 事务 .......... 170 启用 DTM 功能 .......... 171 安装许可密钥 .......... 171 启用 DTM 功能 .......... 171 配置事务资源 .......... 172 使用 Adaptive Server 协调服务 .......... 174 事务协调服务概述 .......... 174 需求和行为 .......... 176 配置参与者服务器资源 .......... 177 在异构环境中使用事务协调服务 .......... 178 监控协调事务和参与者 .......... 179 DTM 管理和故障排除 .......... 179 事务和控制线程 .......... 179 获取有关分布式事务的信息 .......... 181 执行外部事务的步骤 .......... 185 分布式事务的崩溃恢复过程 .......... 186 尝试完成事务 .......... 187 编程与配置注意事项 .......... 191 第 9 章创建和使用段 .......... 193 Adaptive Server 段 .......... 193 系统定义的段 .......... 194 Adaptive Server 如何使用段 .......... 195 控制空间使用 .......... 195 改善性能 .......... 195 将表移到另一设备 .......... 197 创建段 .......... 198 更改段的范围 .......... 198 扩展段的范围 .......... 198 减小段的范围 .......... 199 向段指派数据库对象 .......... 200 在段上创建新对象 .......... 200 在段上放置已存在的对象 .......... 201 把文本页放在单独的设备上 .......... 204 对段创建聚簇索引 .......... 204 删除段 .......... 205 获取有关段的信息 .......... 205 sp_helpsegment .......... 206 sp_helpdb .......... 207 sp_help 和 sp_helpindex .......... 208 段和系统表 .......... 208 段的教程 .......... 209 第 10 章使用 reorg 命令 .......... 215 reorg 命令及其参数 .......... 215 使用 optdiag 实用程序评估对 reorg 的需求 .......... 216 将转移的行移动到主页 .......... 217 使用 reorg compact 撤消行转移 .......... 217 回收删除和更新后留下的未使用空间 .......... 217 不使用 reorg 命令的空间回收 .......... 218 回收未使用的空间并撤消行转移 .......... 219 重新创建表 .......... 219 运行 reorg rebuild 的前提条件 .......... 220 对索引使用 reorg rebuild 命令 .......... 221 使用 reorg rebuild index_name partition_name 重建索引 ...... 221 重建索引的空间要求 .......... 222 状态消息 .......... 222 用于大表重组的 resume 和 time 选项 .......... 222 在 time 选项中指定 no_of_minutes .......... 223 第 11 章检查数据库一致性 .......... 225 什么是数据库一致性检查程序? .......... 225 页和对象分配 .......... 226 了解对象分配映射 (OAM) .......... 228 了解页链接 .......... 230 使用 dbcc 可执行哪些检查? .......... 230 了解各个 dbcc 命令的输出 .......... 231 检查数据库和表的一致性 .......... 233 dbcc checkstorage .......... 233 dbcc checktable .......... 236 dbcc checkdb .......... 238 检查页分配 .......... 239 dbcc checkalloc .......... 239 dbcc indexalloc .......... 240 dbcc tablealloc .......... 241 dbcc textalloc .......... 241 使用 fix | nofix 选项更正分配错误 .......... 242 使用 dbcc tablealloc 和 dbcc indexalloc 生成报告 .......... 243 检查系统表的一致性 .......... 243 使用一致性检查命令的策略 .......... 244 使用大 I/O 和异步预取 .......... 245 在您的节点安排数据库维护 .......... 245 数据库一致性问题导致的错误 .......... 247 报告被中止的 checkstorage 和 checkverify 操作 .......... 247 软故障和硬故障的比较 .......... 248 使用 dbcc checkverify 检验故障 .......... 249 dbcc checkverify 的工作方式 .......... 249 何时使用 dbcc checkverify .......... 251 如何使用 dbcc checkverify .......... 252 使用 dbcc checkstorage 之前的准备工作 .......... 252 计划资源 .......... 253 配置工作进程 .......... 257 为 dbcc 设置命名高速缓存 .......... 258 配置一个 8 页的 I/O 缓冲池 .......... 259 为 dbccdb 分配磁盘空间 .......... 260 用于工作空间的段 .......... 260 创建 dbccdb 数据库 .......... 260 更新 dbcc_config 表 .......... 262 使用 sp_dbcc_updateconfig 添加缺省配置值 .......... 262 使用 sp_dbcc_updateconfig 删除配置值 .......... 263 查看当前配置值 .......... 263 维护 dbccdb .......... 263 重新评估并更新 dbccdb 配置 .......... 264 清除 dbccdb .......... 264 删除工作空间 .......... 265 对 dbccdb 执行一致性检查 .......... 265 从 dbccdb 生成报告 .......... 266 报告 dbcc checkstorage 操作的摘要 .......... 266 报告配置、统计和故障信息 .......... 266 使用 dbcc upgrade_object 升级编译对象 .......... 267 在生产之前查找编译对象错误 .......... 268 在升级中使用数据库转储 .......... 271 确定编译对象是否已升级 .......... 271 第 12 章制定备份和恢复计划 .......... 273 跟踪数据库的变化 .......... 274 获取有关事务日志的信息 .......... 274 使用 delayed_commit 确定提交日志记录的时间 .......... 274 指定备份的职责 .......... 277 同步数据库及其日志:检查点 .......... 277 设置恢复间隔 .......... 277 自动检查点过程 .......... 278 进行自动检查点操作后截断日志 .......... 278 可用检查点 .......... 279 手动请求检查点 .......... 279 在系统出现故障或关机后自动恢复 .......... 280 快速恢复 .......... 280 Adaptive Server 启动序列 .......... 281 尽早使引擎进入联机状态 .......... 281 并行恢复 .......... 281 数据库恢复 .......... 282 恢复顺序 .......... 282 并行检查点 .......... 284 恢复状态 .......... 285 为进行快速恢复调优 .......... 285 恢复期间的故障隔离 .......... 286 脱机页的持续性 .......... 287 配置恢复故障隔离 .......... 287 获取有关脱机数据库和页的信息 .......... 288 使脱机页联机 .......... 289 DOL 锁定表的索引级故障隔离 .......... 290 脱机页的副作用 .......... 290 使用恢复故障隔离的恢复策略 .......... 291 评估损坏的程度 .......... 293 使用 dump 和 load 命令 .......... 294 进行例行数据库转储:dump database .......... 294 进行例行事务日志转储:dump transaction .......... 294 设备出现故障后复制日志:dump tran with no_truncate ....... 295 恢复整个数据库:load database .......... 295 将更改应用到数据库:load transaction .......... 296 使用户可以使用数据库:online database .......... 296 跨平台转储和装载数据库 .......... 296 关于转储和装载数据库和事务的限制 .......... 298 性能注释 .......... 299 将数据库移到另一 Adaptive Server .......... 299 升级用户数据库 .......... 300 使用特殊 dump transaction 选项 .......... 301 使用特殊装载选项标识转储文件 .......... 301 从备份恢复数据库 .......... 302 挂起和恢复对数据库的更新 .......... 304 使用 quiesce database 的准则 .......... 305 维护在主服务器和辅助服务器关系中的服务器角色 .......... 307 使用 -q 选项启动辅助服务器 .......... 307 更新的“in quiesce”数据库日志记录值 .......... 307 更新转储序列号 .......... 308 使用 quiesce database 备份主设备 .......... 310 在抑制状态下制作存档副本 .......... 313 使用 mount 和 unmount 命令 .......... 315 使用 Backup Server 执行备份和恢复 .......... 315 与 Backup Server 通信 .......... 318 装入新卷 .......... 318 启动和停止 Backup Server .......... 319 配置服务器用于远程访问 .......... 320 选择备份介质 .......... 320 创建本地转储设备的逻辑设备名 .......... 321 列出当前设备名 .......... 322 添加备份设备 .......... 322 安排用户数据库的备份 .......... 323 安排例行备份 .......... 323 在其它时间备份数据库 .......... 323 安排 master 的备份 .......... 324 在每次更改后转储 master 数据库 .......... 325 保存脚本和系统表 .......... 325 截断 master 数据库事务日志 .......... 326 避免卷更换和恢复 .......... 326 安排 model 数据库的备份 .......... 326 截断 model 数据库的事务日志 .......... 326 安排 sybsystemprocs 数据库的备份 .......... 327 配置 Adaptive Server 以用于同时装载 .......... 327 收集备份统计信息 .......... 328 第 13 章备份和恢复用户数据库 .......... 329 指定数据库和转储设备 .......... 332 指定数据库名的规则 .......... 332 指定转储设备的规则 .......... 333 Backup Server 确定磁带设备 .......... 334 压缩转储 .......... 335 Backup Server 转储文件和压缩转储 .......... 337 装载压缩转储 .......... 338 指定远程 Backup Server .......... 339 指定磁带密度、块大小和容量 .......... 339 替换缺省密度 .......... 340 替换缺省块大小 .......... 340 指定转储命令的磁带容量 .......... 341 Backup Server 的非回绕磁带功能 .......... 341 指定卷名 .......... 342 从多个卷装载 .......... 342 标识转储 .......... 343 提高转储或装载性能 .......... 344 与之前版本的兼容性 .......... 344 以整数格式存储的标签 .......... 345 配置系统资源 .......... 345 指定其它转储设备:stripe on 子句 .......... 348 转储到多个设备 .......... 348 从多个设备装载 .......... 348 与转储相比装载所使用的设备较少 .......... 348 指定单个设备的特性 .......... 349 磁带处理选项 .......... 349 指定是否卸下磁带 .......... 350 回绕磁带 .......... 350 防止转储文件被覆盖 .......... 350 转储前重新初始化卷 .......... 351 转储和装载数据库时使用口令保护 .......... 351 替换缺省的消息显示目标 .......... 352 通过 with standby_access 使数据库处于联机状态 .......... 353 确定何时使用 with standby_access .......... 353 通过 with standby_access 使数据库处于联机状态 .......... 354 获取有关转储文件的信息 .......... 354 请求转储标头信息 .......... 354 确定数据库、设备、文件名和日期 .......... 355 设备出现故障后复制日志 .......... 356 截断日志 .......... 357 截断不在单独的段上的日志 .......... 357 在开发环境的早期截断日志 .......... 358 截断没有可用空间的日志 .......... 358 响应卷更改请求 .......... 361 用于转储的卷更改提示 .......... 361 用于装载的卷更改提示 .......... 363 恢复数据库:分步指导 .......... 364 获取事务日志的当前转储 .......... 365 检查空间使用情况 .......... 365 删除数据库 .......... 367 重新创建数据库 .......... 368 装载数据库 .......... 369 装载事务日志 .......... 369 使数据库处于联机状态 .......... 370 从较旧的版本装载数据库转储 .......... 371 将转储升级到当前版本的 Adaptive Server .......... 371 数据库脱机状态位 .......... 372 版本标识符 .......... 373 高速缓存绑定和装载数据库 .......... 373 数据库和高速缓存绑定 .......... 374 数据库对象和高速缓存绑定 .......... 375 跨数据库约束和装载数据库 .......... 376 第 14 章恢复系统数据库 .......... 377 恢复系统数据库 .......... 377 恢复 master 数据库 .......... 378 关于恢复进程 .......... 378 恢复过程总结 .......... 379 查找系统表的副本 .......... 379 建立新的主设备 .......... 380 在主恢复方式下启动 Adaptive Server .......... 382 重新创建 master 的设备分配 .......... 383 检查 Backup Server sysservers 信息 .......... 383 检验 Backup Server 是否在运行 .......... 384 装载 master 的备份 .......... 384 更新 number of devices 配置参数 .......... 385 在主恢复方式下重新启动 Adaptive Server .......... 385 检查系统表以检验 master 的当前备份 .......... 385 重新启动 Adaptive Server .......... 386 恢复服务器用户 ID .......... 386 恢复 model 数据库 .......... 387 检查 Adaptive Server .......... 387 备份 master .......... 387 恢复 model 数据库 .......... 388 恢复 sybsystemprocs 数据库 .......... 388 使用 installmaster 恢复 sybsystemprocs .......... 389 使用 load database 恢复 sybsystemprocs .......... 391 如何减小 tempdb 的大小 .......... 391 将 tempdb 重新设置为缺省大小 .......... 391 使用 disk reinit 和 disk refit 恢复系统表 .......... 394 使用 disk reinit 恢复 sysdevices .......... 394 使用 disk refit 恢复 sysusages 和 sysdatabase .......... 395 第 15 章存档数据库访问 .......... 397 概述 .......... 398 存档数据库的组件 .......... 399 使用存档数据库 .......... 401 配置存档数据库 .......... 402 调整修改页面区域的大小 .......... 402 增加分配给修改页面区域的空间量 .......... 403 实现存档数据库 .......... 403 使存档数据库联机 .......... 405 将事务日志装载到存档数据库中 .......... 405 删除存档数据库 .......... 405 使用存档数据库 .......... 406 将 SQL 命令用于存档数据库 .......... 406 将 dbcc 命令用于存档数据库 .......... 407 典型的存档数据库命令序列 .......... 407 存档数据库的压缩转储 .......... 409 创建压缩内存池 .......... 409 升级和降级存档数据库 .......... 410 升级带有存档数据库的 Adaptive Server .......... 410 降级带有存档数据库的 Adaptive Server .......... 410 压缩转储的兼容性问题 .......... 411 存档数据库的限制 .......... 411 第 16 章自动扩展数据库 .......... 413 了解磁盘、设备、数据库和段 .......... 413 阈值操作过程 .......... 416 安装自动数据库扩展过程 .......... 416 运行 sp_dbextend .......... 417 sp_dbextend 接口中的命令选项 .......... 417 验证当前阈值 .......... 417 对数据库进行自动扩展设置 .......... 420 约束和限制 .......... 422 第 17 章使用阈值管理可用空间 .......... 425 使用最后机会阈值监控可用空间 .......... 425 达到阈值 .......... 426 控制执行 sp_thresholdaction 的频率 .......... 426 回退记录和最后机会阈值 .......... 427 计算回退记录的空间 .......... 428 确定回退记录的当前空间 .......... 428 回退记录对最后机会阈值的影响 .......... 429 用户定义的阈值 .......... 429 共享的日志段和数据段的最后机会阈值和用户日志高速缓存 ........ 430 使用 lct_admin abort 中止挂起的事务 .......... 430 为 master 数据库的事务日志增加空间 .......... 432 自动中止或挂起进程 .......... 432 使用 abort tran on log full 中止事务 .......... 432 唤醒挂起的进程 .......... 433 添加、更改和删除阈值 .......... 433 显示现有阈值的有关信息 .......... 434 阈值和系统表 .......... 434 添加可用空间阈值 .......... 434 更改或指定新的可用空间阈值 .......... 435 删除阈值 .......... 435 为日志段创建可用空间阈值 .......... 436 测试和调整新阈值 .......... 436 在其它段上创建其它阈值 .......... 439 确定阈值放置位置 .......... 439 创建阈值过程 .......... 440 声明过程参数 .......... 440 生成错误日志消息 .......... 440 转储事务日志 .......... 441 一个简单的阈值过程 .......... 442 一个更复杂的过程 .......... 442 决定在何处放置阈值过程 .......... 444 禁用数据段的可用空间计数 .......... 444 索引 ..........447

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值