手上的mini2440还是大二的时候买的一个学长的,太古老了,性能又不够,于是上星期买了个友善的Tiny210v2玩玩,现在这些开发板真是越来越便宜。
昨天考虑ARM和手上的DSP进行数据传输,共有的接口有USART、IIC、SPI,现在想串口用于指令交互,SPI用于数据传输。
参考http://blog.csdn.net/lxmky/article/details/6858322的做法测试了Tiny210v2的SPI接口。
1.先查看了一下开发板光盘里面的Android使用的Linux内核代码,SPI驱动是编译进去的,ls查看了的Android系统下的/dev目录,有spidev0.0和spidev1.0两个设备文件。
板子上的SPI接口MOSI MISO位于20针的SDIO,位置如下:
使用跳帽短接7/8针脚。
2.编译内核自带的SPI测试程序 Documentation/spi/spidev_test.c,使用光盘里的交叉编译套件arm-linux-gcc编译,生成二进制文件,放到开发板,运行,居然报 ./xxx not found错误,想来应该是动态链接库的问题,于是改成静态编译,增加--static。
重新运行,发现上面的XspiMOSI0和XspiMISO0对应于/dev/spidev0.0,自收自发数据成功。
3.修改spidev_test.c的代码,增加jni接口,使用Android NDK编译成.so动态库,上层使用Java调用。在板子上运行的时候发现卡在了open设备文件的那一步。
经检查发现/dev/spidev0.0属于root,权限是600,而上层apk应用默认不具备root的权限,无法读写设备,如果每次运行apk之前都adb连接进去chmod设备权限的话很麻烦,通过修改Android源代码的android/system/core/init/devices.c文件再重新编译烧到板子里去也不方便,于是为了调试方便,我采用让上层应用获取root权限的方案。
4.由于板子的Android默认是root过的,所以可以这么干:
Process process;
try {
process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("chmod 666 /dev/spidev0.0\n");
os.writeBytes("exit\n");
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这样就可以在apk里面读写spi设备了。