Error Writing on I2C Bus with Device I/O Library

Sergey Nazarkin snazarkin at azul.com
Fri Feb 3 15:09:42 UTC 2017


Hi Sergio,

do you use latest dio-dev repo? I’ve fixed similar bug yesterday 


Sergey Nazarkin




> On 03 Feb 2017, at 17:54, Sergio Lopes Junior - Embrapa Arroz e Feijao - CNPAF <sergio.lopes at embrapa.br> wrote:
> 
> 
> Hi guys, 
> 
> 
> We have encountered an error using the Device I/O library to access an Analog Digital Converter - ADC (MCP3424 chip) 
> by I2C bus with recent versions of java (above version 1.8.0_71). 
> 
> 
> We are using the Toradex iMX6 DualLite 512MB IT card (https://www.toradex.com/en/computer-on-modules/colibri-arm-family/nxp-freescale-imx6). 
> This board uses a linux based on OpenEmbedded (http://www.openembedded.org/wiki/Main_Page) and 
> has an ARMv7 architecture: 
> 
> 
> uname -a 
> Linux colibri-imx6 3.10.17-dirty #16 SMP Thu Jan 7 09:48:46 BRST 2016 armv7l GNU/Linux 
> 
> 
> 
> 
> Whenever an attempt is made to write to the I2C bus, the jdk.dio.UnavailableDeviceException exception is thrown 
> with the message "Locked by other application". To analyze the error we wrote an example application with the 
> class DeviceIOSamples and copied all its files to the / opt / deviceIOSamples directory on the Toradex card: 
> 
> ls -l /opt/deviceIOSamples 
> -rw-r--r-- 1 root root 3569 Feb 2 16:43 DeviceIOSamples-0.0.1.jar 
> -rwxr-xr-x 1 root root 427 Feb 2 16:19 deviceIOSamples.sh 
> -rw-r--r-- 1 root root 197907 Feb 1 13:54 dio.jar 
> -rw-r--r-- 1 root root 1326 Feb 2 13:29 dio.properties 
> -rw-r--r-- 1 root root 2406 Dec 16 11:51 java.policy 
> -rw-r--r-- 1 root root 138324 Feb 1 13:54 libdio.so 
> 
> 
> When running the application with jdk version 1.8.0_71 (jdk1.8.0_71-b15), everything works correctly: 
> 
> java -version 
> java version "1.8.0_71" 
> Java(TM) SE Runtime Environment (build 1.8.0_71-b15) 
> Java HotSpot(TM) Client VM (build 25.71-b15, mixed mode) 
> 
> 
> cd /opt/deviceIOSamples 
> 
> 
> ./deviceIOSamples.sh 
> ---------------------------------------------------- 
> I2C Device Test (MCP3424 ADC Chip) 
> Channel = 3, resolution = 18 bits and pga = x1 
> ---------------------------------------------------- 
> 1 - opening adc device 
> 2 - send configuration to adc device 
> 3 - reading bytes referring to the conversion performed by the adc device 
> 4 - successful conversion of analogue value 
> ---------------------------------------------------- 
> Analog Value = 0.6563593750000001 mV 
> ---------------------------------------------------- 
> 
> 
> When changing the java to any version after 1.8.0_71 the error appears: 
> 
> java -version 
> java version "1.8.0_121" 
> Java(TM) SE Runtime Environment (build 1.8.0_121-b13) 
> Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode) 
> 
> 
> cd /opt/deviceIOSamples 
> 
> 
> ./deviceIOSamples.sh 
> ---------------------------------------------------- 
> I2C Device Test (MCP3424 ADC Chip) 
> Channel = 3, resolution = 18 bits and pga = x1 
> ---------------------------------------------------- 
> 1 - opening adc device 
> 2 - send configuration to adc device 
> ---------------------------------------------------- 
> jdk.dio.UnavailableDeviceException: Locked by other application 
> at com.oracle.dio.impl.AbstractPeripheral.conditionalLock(AbstractPeripheral.java:99) 
> at com.oracle.dio.i2cbus.impl.I2CSlaveImpl.transfer(I2CSlaveImpl.java:224) 
> at com.oracle.dio.i2cbus.impl.I2CSlaveImpl.write(I2CSlaveImpl.java:168) 
> at com.oracle.dio.i2cbus.impl.I2CSlaveImpl.write(I2CSlaveImpl.java:178) 
> at DeviceIOSamples.main(DeviceIOSamples.java:28) 
> ---------------------------------------------------- 
> 
> 
> 
> We already tested several versions of java after version 1.8.0_71 and in all them, the same error appears when writing on the I2C bus. 
> We have reached a deadlock in the project regarding the use of the Device I/O library, because we need to use I2C devices. 
> If we can not solve this problem, we will have to abandon it and move on to another hardware access strategy. 
> 
> 
> Has anyone had this or could you help us? Any help will be very welcome. 
> 
> 
> 
> 
> Thank you, 
> 
> 
> Sergio Lopes Jr. 
> 
> Software developer at Embrapa Rice and Bean, 
> Goiânia / GO - Brazil. 
> 
> 
> 
> 
>>>>>>>>>>>>>>>> Compilation of the Device I / O library: <<<<<<<<<<<<<<< 
> 
> The compilation of the Device I / O library was performed with linaro on linux Ubuntu 32 bit: 
> 
> sudo apt-get update 
> sudo apt-get upgrade 
> wget -c https://releases.linaro.org/components/toolchain/binaries/latest-6/arm-linux-gnueabihf/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf.tar.xz 
> sudo tar -xvf gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf.tar.xz -C /opt 
> sudo mv /opt/gcc-linaro-6.2.1-2016.11-i686_arm-linux-gnueabihf /opt/gcc-linaro 
> export PATH=/opt/gcc-linaro/bin:$PATH 
> export PI_TOOLS=/opt/gcc-linaro 
> export CROSS_COMPILE=arm-linux-gnueabihf- 
> 
> 
> Download file jdk-8u121-linux-x64.tar.gz no endereço http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html?ssSourceSiteId=otnpt 
> sudo tar -zxvf jdk-8u121-linux-x64.tar.gz -C /opt 
> sudo mv /opt/jdk1.8.0_121 /opt/java 
> export JAVA_HOME=/opt/java 
> export PATH=$JAVA_HOME/bin:$PATH 
> 
> 
> hg clone http://hg.openjdk.java.net/dio/dev dio 
> cd dio 
> Replace the lines in the Makefile: 
> TARGET_CC := $(TARGET_TOOLCHAIN)/bin/gcc 
> TARGET_CXX := $(TARGET_TOOLCHAIN)/bin/g++ 
> TARGET_LD := $(TARGET_TOOLCHAIN)/bin/gcc 
> For: 
> TARGET_CC := $(TARGET_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc 
> TARGET_CXX := $(TARGET_TOOLCHAIN)/bin/arm-linux-gnueabihf-g++ 
> TARGET_LD := $(TARGET_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc 
> make ARCH=arm 
> Copy the dio/build/jar/dio.jar and dio/build/so/libdio.so files to the application directory 
> 
> 
> 
> 
> 
>>>>>>>>>>>>>>>> Sample application class (DeviceIOSamples.java): <<<<<<<<<<<<<<< 
> 
> 
> import java.nio.ByteBuffer; 
> import java.time.ZonedDateTime; 
> 
> 
> import jdk.dio.DeviceManager; 
> import jdk.dio.i2cbus.I2CDevice; 
> 
> 
> public class DeviceIOSamples { 
> 
> public static void main(String[] args) { 
> 
> System.out.println("----------------------------------------------------"); 
> System.out.println("I2C Device Test (MCP3424 ADC Chip)"); 
> System.out.println("Channel = 3, resolution = 18 bits and pga = x1"); 
> System.out.println("----------------------------------------------------"); 
> try { 
> // MCP3424 chip configuration 
> // bit 7 : Operation set bit. 0 = set configuration and 1 = start a new conversion. 
> // bit 6-5: Channel Selection Bits. 00 = channel 1, 01 = channel 2, 10 = channel 3 and 11 = channel 4. 
> // bit 4 : Conversion Mode Bit. 1 = Continuous Conversion Mode (Default) and 0 = One-Shot Conversion Mode. 
> // bit 3-2: Sample Rate Selection Bit. 00 = 240 SPS (12 bits), 01 = 60 SPS (14 bits), 10 = 15 SPS (16 bits) and 11 = 3.75 SPS (18 bits). 
> // bit 1-0: PGA Gain Selection Bits. 00 = x1, 01 = x2, 10 = x4 and 11 = x8. 
> 
> 
> // opening adc device (MCP3424 chip) 
> // 100 = deviceType:i2cbus.I2CDevice, name:ADC_1, controllerNumber:1, address:0x68 (dio.properties) 
> System.out.println("1 - opening adc device"); 
> I2CDevice i2cDevice = (I2CDevice) DeviceManager.open(100); 
> 
> // send configuration to adc device (operation = start-new-conversion, channel = 3, conversion-mode = one-shot , resolution = 18 bits and pga = x1) 
> System.out.println("2 - send configuration to adc device"); 
> i2cDevice.write(0b11001100); 
> 
> 
> // reading bytes referring to the conversion performed by the adc device 
> System.out.println("3 - reading bytes referring to the conversion performed by the adc device"); 
> int timeout = 1000; // timeout for analog value conversion in ms 
> ByteBuffer buffer = ByteBuffer.allocate(4); 
> int adcValue = 0; 
> double voltage = 0; 
> long startTime = ZonedDateTime.now().toInstant().toEpochMilli(); 
> long currentTime = startTime; 
> while (true) { 
> 
> // checking that exceeded the timeout for the operation 
> currentTime = ZonedDateTime.now().toInstant().toEpochMilli(); 
> if ((currentTime - startTime) > timeout) { 
> throw new Exception("Exceeded the timeout for analog value conversion"); 
> } 
> 
> // clear buffer 
> buffer.clear(); 
> 
> 
> // reading bytes from ADC 
> i2cDevice.read(buffer); 
> 
> 
> // checking that successfully performed reading 
> if ((buffer.get(3) >>> 7) == 1){ 
> continue; 
> }; 
> 
> // calculating voltage value 
> adcValue = ((buffer.get(0) & 0b00000011) << 16) | ((buffer.get(1) & 0xFF) << 8) | (buffer.get(2) & 0xFF); 
> voltage = (((adcValue * (0.0000078125 / 0.5))) * 2.471) * 1000; 
> 
> // checking that it is valid voltage 
> if (voltage >= 0) { 
> break; 
> } 
> } 
> 
> // successful conversion of analogue value 
> System.out.println("4 - successful conversion of analogue value"); 
> System.out.println("----------------------------------------------------"); 
> System.out.println("Analog Value = " + voltage + " mV"); 
> System.out.println("----------------------------------------------------"); 
> 
> } catch (Exception e) { 
> 
> // error in conversion of analogue value 
> System.out.println("----------------------------------------------------"); 
> e.printStackTrace(); 
> System.out.println("----------------------------------------------------"); 
> } 
> } 
> } 
> 
> 
> 
> 
>>>>>>>>>>>>>>>>>>> Device I/O Properties File (dio.properties): <<<<<<<<<<<<<<<<<<<< 
> 
> 
> # DEFAULT CONFIG 
> gpio.GPIOPin = direction:0, mode:1, trigger:0, initValue:0, predefined:true 
> uart.UART = baudRate:9600, parity:0, dataBits:8, stopBits:1, flowControl:0, predefined:true 
> i2cbus.I2CDevice = addressSize:7, clockFrequency:-1, predefined:true 
> 
> 
> # ADC device (chip MCP3424): 
> # - i2c address : 0x68 
> # - resolution : 18 bits 
> # - conversion mode : one-shot 
> # - programmable gain amplifier (PGA) : 1 
> # - channels address : 1 = 0x50, 2 = 0x70, 3 = 0x10 and 4 = 0x30. 
> 100 = deviceType:i2cbus.I2CDevice, name:ADC_1, controllerNumber:1, address:0x68 
> 
> 
> 
> 
>>>>>>>>>>>>>>>>>>>>>>> Java Police File (java.policy): <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
> 
> 
> grant { 
> permission "java.util.PropertyPermission" "jdk.dio.registry", "read"; 
> permission "java.io.FilePermission" "./dio.properties-raspberrypi", "read,write"; 
> permission "java.lang.RuntimePermission" "loadLibrary.dio"; 
> permission "java.util.PropertyPermission" "user.dir", "read"; 
> permission jdk.dio.DeviceMgmtPermission "*:*", "open"; 
> permission jdk.dio.adc.ADCPermission "*:*"; 
> permission jdk.dio.atcmd.ATPermission "*:*"; 
> permission jdk.dio.counter.CounterPermission "*:*"; 
> permission jdk.dio.dac.DACPermission "*:*"; 
> permission jdk.dio.generic.GenericPermission "*:*"; 
> permission jdk.dio.gpio.GPIOPinPermission "*:*", "open,setdirection"; 
> permission jdk.dio.gpio.GPIOPortPermission "*:*"; 
> permission jdk.dio.i2cbus.I2CPermission "*:*", "open,powermanage"; 
> permission jdk.dio.pwm.PWMPermission "*:*"; 
> permission jdk.dio.spibus.SPIPermission "*:*"; 
> permission jdk.dio.uart.UARTPermission "*:*"; 
> permission jdk.dio.watchdog.WatchdogTimerPermission "*:*"; 
> }; 
> 
> 
> 
> 
>>>>>>>>>>>> Script to run the sample application (deviceIOSamples.sh): <<<<<<<<<<< 
> 
> 
> java -Xmx64m \ 
> -classpath /opt/deviceIOSamples:/opt/deviceIOSamples/dio.jar:/opt/deviceIOSamples/DeviceIOSamples-0.0.1.jar:$CLASSPATH \ 
> -Djava.library.path=/opt/deviceIOSamples \ 
> -Djdk.dio.registry=/opt/deviceIOSamples/dio.properties \ 
> -Djava.security.policy=/opt/deviceIOSamples/java.policy \ 
> -Duser.country=BR \ 
> -Duser.language=pt \ 
> -Duser.timezone=America/Sao_Paulo \ 
> DeviceIOSamples 
> 
> 
> ____________________________________________________________________________ 
> Aviso de confidencialidade 
> 
> Esta mensagem da Empresa Brasileira de Pesquisa Agropecuaria (Embrapa), 
> empresa publica federal regida pelo disposto na Lei Federal no. 5.851, de 
> 7 de dezembro de 1972, e enviada exclusivamente a seu destinatario e pode 
> conter informacoes confidenciais, protegidas por sigilo profissional. Sua 
> utilizacao desautorizada e ilegal e sujeita o infrator as penas da lei. Se 
> voce a recebeu indevidamente, queira, por gentileza, reenvia-la ao emitente, 
> esclarecendo o equivoco. 
> 
> Confidentiality note 
> 
> This message from Empresa Brasileira de Pesquisa Agropecuaria (Embrapa), a 
> government company established under Brazilian law (5.851/72), is directed 
> exclusively to its addressee and may contain confidential data, protected 
> under professional secrecy rules. Its unauthorized use is illegal and may 
> subject the transgressor to the law's penalties. If you are not the addressee, 
> please send it back, elucidating the failure. 
> 
> 
> ____________________________________________________________________________
> Aviso de confidencialidade 
> 
> Esta mensagem da Empresa  Brasileira de Pesquisa  Agropecuaria  (Embrapa),
> empresa publica federal  regida pelo disposto  na Lei Federal no. 5.851,  de
> 7 de dezembro de 1972,  e  enviada exclusivamente  a seu destinatario e pode
> conter informacoes  confidenciais, protegidas  por sigilo profissional.  Sua
> utilizacao desautorizada  e ilegal e  sujeita o infrator as penas da lei. Se
> voce  a recebeu indevidamente, queira, por gentileza, reenvia-la ao emitente,
> esclarecendo o equivoco.
> 
> Confidentiality note
> 
> This message from Empresa  Brasileira de Pesquisa  Agropecuaria  (Embrapa), a
> government company  established under  Brazilian law  (5.851/72), is directed
> exclusively to  its addressee  and may contain  confidential data,  protected
> under  professional secrecy  rules. Its unauthorized  use is illegal and  may
> subject the transgressor to the law's penalties. If you are not the addressee,
> please send it back, elucidating the failure.



More information about the dio-dev mailing list