主题 : app上调用HardwareControl.open()方法无法打开NanoPi M3的I2C接口 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 130229
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2016-12-29
最后登录: 2017-01-19
楼主  发表于: 2017-01-09 09:49

 app上调用HardwareControl.open()方法无法打开NanoPi M3的I2C接口

下面是贵公司提供的I2CDemo中的主类。
我将这个demo烧进NanoPi M3小板子中,程序运行崩溃,显示I2C接口打开失败,请帮我看看是什么原因哟,谢谢
public class EEPROMTesting extends Activity implements OnClickListener {
    private static final String TAG = "EEPROMTesting";
    EditText writeEditor;
    EditText readEditor;
    TextView statusView;
    private Handler messageHandler;
    Thread writeThread = null;
    Thread readThread = null;
    int devFD = -1;

    private class MessageHandler extends Handler {
        public MessageHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            String result = (String) msg.obj;
            if (result.equals("ERROR")) {
                statusView.setText("Status: Error");
                Log.d(TAG, "Status: Error");
            } else if (result.equals("DONE")) {
                statusView.setText("Status: Done");
                Log.d(TAG, "Status: Done");
            } else if (result.startsWith("B")) {
                readEditor.append(result.substring(1));
                                Log.d(TAG, "写入的内容是:" + readEditor.getText().toString());
            } else {
                statusView.setText("Status: Processing");
                Log.d(TAG, "Status: Processing");
            }
        }
    }

    @Override
    public void onDestroy() {
        if (devFD >= 0) {
            HardwareControler.close(devFD);
            devFD = -1;
        }
        super.onDestroy();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            setContentView(R.layout.eepromtestingactivity_landscape);
        } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
            setContentView(R.layout.eepromtestingactivity);
        }

        writeEditor = (EditText) findViewById(R.id.writeEditor);
        writeEditor
                .setText("1");

        statusView = (TextView) findViewById(R.id.statusView);
        readEditor = (EditText) findViewById(R.id.readEditor);

        ((Button) findViewById(R.id.writeEEPROMButton))
                .setOnClickListener(this);
        ((Button) findViewById(R.id.readEEPROMButton)).setOnClickListener(this);

        Looper looper = Looper.myLooper();
        messageHandler = new MessageHandler(looper);

        devFD = HardwareControler.open("/dev/i2c-1", FileCtlEnum.O_RDWR);

                //在下面的判断的时候devFD < 0,表示I2C接口打开失败,这是什么原因呢???

        if (devFD < 0) {
            Log.d("TAG", "faile to open I2C.");
            CommonFuncs.showAlertDialog(this, "Fail to open I2C device.");        
            //finish();
        } else {
            if (HardwareControler.setI2CSlave(devFD, 0x40) < 0) {
                CommonFuncs.showAlertDialog(this, "Fail to set I2C slave.");
            //    finish();
            } else {
                statusView.setText("Status: Ready");
                i2cDer.setPWMFreq(devFD, 60);
            }
        }
    }

    private void startWriteEEPROMThread(final String num) {
        statusView.setText("Status: Processing");
        
        new Thread() {
            @Override
            public void run() {
                String result;
                byte[] writeBytes = writeEditor.getText().toString().getBytes();
                byte b;
                for (int i = 0; i < 256; i++) {

                    if (i < writeBytes.length) {
                        b = writeBytes;
                    } else {
                        b = 0;
                    }

                    if (b != 0 && b != '\n') {
                        if (b < ' ' || b > 126) {
                            b = 0;
                        }
                    }
                    if (HardwareControler.writeByteToI2C(devFD, i, b, 10) != 0) {
                        result = "ERROR";
                        Message message = Message.obtain();
                        message.obj = result;
                        messageHandler.sendMessage(message);

                        break;
                    } else {
                        HardwareControler.writeByteToI2C(devFD, 1, (byte)1, 10);
                        result = "" + i;
                        Message message = Message.obtain();
                        message.obj = result;
                        messageHandler.sendMessage(message);
                    }
                }

                result = "DONE";
                Message message = Message.obtain();
                message.obj = result;
                messageHandler.sendMessage(message);
            }

        }.start();
    }

    private void startReadEEPROMThread() {
        statusView.setText("Status: Processing");
        new Thread() {
            @Override
            public void run() {
                String result;
                int ret;
                byte b;
                boolean bError = false;
                for (int i = 0; i < 4; i++) {
                    ret = HardwareControler.readByteFromI2C(devFD, i, 10);
                    if (ret < 0) {
                        result = "ERROR";
                        Message message = Message.obtain();
                        message.obj = result;
                        messageHandler.sendMessage(message);
                        bError = true;
                        break;
                    } else {
                        result = "" + i;
                        {
                            Message message = Message.obtain();
                            message.obj = result;
                            messageHandler.sendMessage(message);
                        }

                        b = (byte) ret;
                        if (b == 0) {
                            break;
                        }

                        if (b < ' ' || b > 126) {
                            if (b != '\n') {
                                b = '.';
                            }
                        }

                        {
                            byte[] bs = { b };
                            String str = new String(bs);
                            str = "B" + str;

                            Message message = Message.obtain();
                            message.obj = str;
                            messageHandler.sendMessage(message);
                        }
                    }
                }

                if (!bError) {
                    result = "DONE";
                    Message message = Message.obtain();
                    message.obj = result;
                    messageHandler.sendMessage(message);
                }
            }

        }.start();
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.writeEEPROMButton:
            startWriteEEPROMThread("1");
            break;
        case R.id.readEEPROMButton:
            readEditor.setText("");
            Log.d(TAG, readEditor.getText().toString());
            startReadEEPROMThread();
            Log.d(TAG, readEditor.getText().toString());
            break;
        default:
            break;
        }
    }

}



错误日志信息:
01-05 07:15:37.774: D/TAG(4192): faile to open I2C.
01-05 07:15:50.016: D/FriendlyARM-HW-Lib(4192): ######## ret=-1, errno=9
01-05 07:15:50.033: D/EEPROMTesting(4192): Status: Error
01-05 07:15:50.034: D/EEPROMTesting(4192): Status: Done
01-05 07:15:55.055: D/FriendlyARM-HW-Lib(4192): ######## ret=-1, errno=9
01-05 07:15:55.077: D/EEPROMTesting(4192): Status: Error
01-05 07:15:56.100: D/FriendlyARM-HW-Lib(4192): ######## ret=-1, errno=9
01-05 07:15:56.130: D/EEPROMTesting(4192): Status: Error

01-05 07:02:27.850: D/TAG(3166): faile to open I2C.
01-05 07:02:27.869: D/OpenGLRenderer(3166): Use EGL_SWAP_BEHAVIOR_PRESERVED: true
01-05 07:02:27.873: D/Atlas(3166): Validating map...
01-05 07:02:27.919: D/libEGL(3166): loaded /system/lib/egl/libEGL_vr.so
01-05 07:02:27.921: D/libEGL(3166): loaded /system/lib/egl/libGLESv1_CM_vr.so
01-05 07:02:27.950: D/libEGL(3166): loaded /system/lib/egl/libGLESv2_vr.so
01-05 07:02:27.994: I/OpenGLRenderer(3166): Initialized EGL, version 1.4
01-05 07:02:27.995: D/OpenGLRenderer(3166): Enabling debug mode 0
01-05 07:02:27.997: E/[EGL-ERROR](3166): EGLBoolean __egl_platform_create_surface_window(egl_surface*, mali_base_ctx_handle):933: =========> usage 0x900
01-05 07:02:28.024: E/[EGL-ERROR](3166): EGLBoolean __egl_platform_create_surface_window(egl_surface*, mali_base_ctx_handle):933: =========> usage 0x900
01-05 07:02:28.046: E/[EGL-ERROR](3166): EGLBoolean __egl_platform_create_surface_window(egl_surface*, mali_base_ctx_handle):933: =========> usage 0x900