diff --git a/app/src/main/java/fr/mobdev/lpcprog/activity/DeviceActivity.java b/app/src/main/java/fr/mobdev/lpcprog/activity/DeviceActivity.java
index e67e399..ef4671f 100644
--- a/app/src/main/java/fr/mobdev/lpcprog/activity/DeviceActivity.java
+++ b/app/src/main/java/fr/mobdev/lpcprog/activity/DeviceActivity.java
@@ -18,6 +18,7 @@
package fr.mobdev.lpcprog.activity;
+import android.annotation.SuppressLint;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
@@ -49,6 +50,7 @@ public class DeviceActivity extends AppCompatActivity {
private long part_id;
@Override
+ @SuppressLint("SetTextI18n")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.device);
@@ -69,7 +71,7 @@ public class DeviceActivity extends AppCompatActivity {
}
if(dev != null) {
TextView name = (TextView) findViewById(R.id.name);
- name.setText("Name: " + dev.description);
+ name.setText(getApplicationContext().getString(R.string.dev_name)+ dev.description);
TextView vendor = (TextView) findViewById(R.id.vendor_id);
vendor.setText(String.format("Vendor Id: %04x", dev.VID));
TextView product = (TextView) findViewById(R.id.id);
diff --git a/app/src/main/java/fr/mobdev/lpcprog/adapters/BinariesAdapter.java b/app/src/main/java/fr/mobdev/lpcprog/adapters/BinariesAdapter.java
index 4df7fe4..afd15a3 100644
--- a/app/src/main/java/fr/mobdev/lpcprog/adapters/BinariesAdapter.java
+++ b/app/src/main/java/fr/mobdev/lpcprog/adapters/BinariesAdapter.java
@@ -299,7 +299,12 @@ class BinaryHolder extends RecyclerView.ViewHolder{
flashView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- IspManager.getInstance(itemView.getContext()).flash(server,binary,flashListener);
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ IspManager.getInstance(itemView.getContext()).flashBinary(server,binary,flashListener);
+ }
+ }).start();
}
});
}
diff --git a/app/src/main/java/fr/mobdev/lpcprog/managers/IspManager.java b/app/src/main/java/fr/mobdev/lpcprog/managers/IspManager.java
index ab93102..9dea052 100644
--- a/app/src/main/java/fr/mobdev/lpcprog/managers/IspManager.java
+++ b/app/src/main/java/fr/mobdev/lpcprog/managers/IspManager.java
@@ -46,11 +46,12 @@ public class IspManager {
private static final int MAX_DATA_BLOCK_SIZE = LINES_PER_BLOCK * LINE_DATA_LENGTH;
private static final int UUENCODE_ADDED_VAL = 32;
private static final int LINE_DATA_LENGTH_MAX = 45;
+
+ //defines commands and some answers
private static final byte[] SYNC_START = "?".getBytes();
private static final byte[] SYNC = "Synchronized\r\n".getBytes();
private static final byte[] SYNC_OK = "OK\r\n".getBytes();
private static final byte[] DATA_BLOCK_OK = "OK\r\n".getBytes();
- //private static final byte[] DATA_BLOCK_RESEND = "RESEND\r\n".getBytes();
private static final byte[] SYNC_ECHO_OFF = "A 0\r\n".getBytes();
private static final byte[] READ_UID = "N\r\n".getBytes();
private static final byte[] READ_PART_ID = "J\r\n".getBytes();
@@ -63,7 +64,6 @@ public class IspManager {
private Context context;
private long part_id = 0;
-
private IspManager(Context context) {
this.context = context;
}
@@ -98,68 +98,18 @@ public class IspManager {
return false;
}
- public boolean synchronize(int crystal_freq) {
- if (serialPort == null)
- return false;
- serialPort.purge(D2xxManager.FT_PURGE_RX);
- serialPort.purge(D2xxManager.FT_PURGE_TX);
- byte[] buf;
- if (serialPort.write(SYNC_START) != SYNC_START.length) {
- System.out.println("Start");
- return false;
+ public boolean synchronizeIfPossible(int crystal_freq) {
+ if (!synchronize(crystal_freq)) {
+ serialPort.purge(D2xxManager.FT_PURGE_TX);
+ serialPort.purge(D2xxManager.FT_PURGE_RX);
+ String[] uids = readUid();
+ if (uids == null) {
+ System.out.println("uids null fuck");
+ return false;
+ }
}
- buf = new byte[SYNC.length];
- serialPort.read(buf, buf.length, 500);
- String result = new String(buf);
- String expected = new String(SYNC);
- if (result.compareTo(expected) != 0) {
- serialPort.write("\r\n".getBytes());
- System.out.println("Start answer " + result);
- return false;
- }
- if (serialPort.write(SYNC) != SYNC.length) {
- System.out.println("SYNC write");
- return false;
- }
- clearBuffer(SYNC.length);
- buf = new byte[SYNC_OK.length];
- serialPort.read(buf, buf.length, 500);
- result = new String(buf);
- expected = new String(SYNC_OK);
- if (result.compareTo(expected) != 0) {
- System.out.println("SYNC OK " + result);
- return false;
- }
-
- String freq = String.valueOf(crystal_freq) + "\r\n";
- if (serialPort.write(freq.getBytes()) != freq.length()) {
- System.out.println("freq write");
- return false;
- }
-
- clearBuffer(freq.length());
- buf = new byte[SYNC_OK.length];
- serialPort.read(buf, buf.length, 500);
- result = new String(buf);
- expected = new String(SYNC_OK);
- if (result.compareTo(expected) != 0) {
- System.out.println("freq answer " + result);
- return false;
- }
-
- if (serialPort.write(SYNC_ECHO_OFF) != SYNC_ECHO_OFF.length) {
- System.out.println("Sync Echo Off write");
- return false;
- }
-
- clearBuffer(SYNC_ECHO_OFF.length);
- buf = new byte[RETURN_CODE_SIZE];
- serialPort.read(buf, buf.length, 500);
- clearBuffer(REP_BUF);
return true;
-
-
}
private void clearBuffer(int size) {
@@ -262,169 +212,7 @@ public class IspManager {
return version;
}
- private int sendCommand(byte[] cmd) {
- byte[] buf = new byte[RETURN_CODE_SIZE];
- if (serialPort.write(cmd) != cmd.length)
- return -5;
- int len = read(buf, buf.length, 500);
- if (len <= 0)
- return -4;
- int ret = parseRetCode(buf);
- if(ret > 9)
- read(buf,1,50);
- return ret;
- }
-
- private int sendCommand(char c, int addr, int count) {
- int ret;
- int len;
-
- byte[] buf = String.format(Locale.getDefault(),"%c %d %d\r\n",c,addr,count).getBytes();
- len = buf.length;
- if(len > REP_BUF) {
- len = REP_BUF;
- }
- int sent = serialPort.write(buf,len);
- if(len != sent) {
- return -5;
- }
- buf = new byte[RETURN_CODE_SIZE];
- len = read(buf,buf.length,500);
- if(len <= 0) {
- return -4;
- }
- ret = parseRetCode(buf);
-
- return ret;
- }
-
- private int read(byte[] buffer, int size, int timeout) {
- long startTime = System.nanoTime();
- long timeoutNano = timeout * 1000000;
- int sizeRead = 0;
-
- ByteBuffer output = ByteBuffer.wrap(buffer, 0, size);
-
- while (sizeRead < size) {
- int sizeToRead = serialPort.getQueueStatus();
- if (sizeRead + sizeToRead > size)
- sizeToRead = size - sizeRead;
- byte[] buf = new byte[sizeToRead];
- if (sizeToRead > 0) {
- int sizeReceived = serialPort.read(buf, sizeToRead, 50);
- if (sizeReceived < 0)
- return sizeReceived;
- sizeRead += sizeReceived;
- if (sizeReceived != 0)
- output.put(buf, 0, sizeReceived);
- }
- long time = System.nanoTime();
- if (time - startTime >= timeoutNano)
- break;
- }
- return sizeRead;
- }
-
- private int parseRetCode(byte[] data) {
- String str = new String(data,0,2);
- str = str.replace("\r", "");
- str = str.replace("\n", "");
- if (!str.matches("[0-9 -+]*"))
- return -1;
- return Integer.parseInt(str);
- }
-
- public boolean synchronizeIfPossible(int crystal_freq) {
- if (!synchronize(crystal_freq)) {
- serialPort.purge(D2xxManager.FT_PURGE_TX);
- serialPort.purge(D2xxManager.FT_PURGE_RX);
- String[] uids = readUid();
- if (uids == null) {
- System.out.println("uids null fuck");
- return false;
- }
- }
-
- return true;
- }
-
- private int eraseFlash(Parts parts) {
- int ret = unlock();
- if (ret != 0) {
- System.out.println("unlock fail");
- return -1;
- }
- for (int i = 0; i < parts.flash_nb_sectors; i++) {
- //blank-check
- ret = send_cmd_sectors('I', i, i);
- if (ret == 0) {
- continue;
- }
-
- if (ret < 0) {
- System.out.println("blank "+i+" fail");
- return ret;
- } else {
- byte buf[] = new byte[REP_BUF];
- read(buf, 40, 500);
- }
- //prepare-for-write
- ret = send_cmd_sectors('P', i, i);
- if (ret != 0) {
- System.out.println("prepare-for-write "+i+" fail");
- return ret;
- }
- //erase
- ret = send_cmd_sectors('E', i, i);
- if (ret != 0) {
- System.out.println("erase "+i+" fail");
- return ret;
- }
- }
- return 0;
- }
-
- private int send_cmd_sectors(char cmd, int first_sector, int last_sector) {
- byte[] buf = new byte[RETURN_CODE_SIZE];
- int ret;
- int len;
-
- if(last_sector < first_sector){
- return -6;
- }
-
- String request = String.format(Locale.getDefault(),"%c %d %d\r\n",cmd, first_sector, last_sector);
- len = serialPort.write(request.getBytes());
- if(len != request.getBytes().length){
- return -5;
- }
- len = read(buf,buf.length,500);
- if(len <= 0){
- return -4;
- }
-
- ret = parseRetCode(buf);
-
- return ret;
- }
-
- private int unlock() {
- int ret = sendCommand(UNLOCK);
- if(ret != 0)
- return -1;
- return 0;
- }
-
- public void flash(final Server server, final Binary binary, final FlashListener listener) {
- new Thread(new Runnable() {
- @Override
- public void run() {
- flashBinary(server,binary,listener);
- }
- }).start();
- }
-
- private int flashBinary(Server server, Binary binary, FlashListener listener) {
+ public int flashBinary(Server server, Binary binary, FlashListener listener) {
Parts parts = DatabaseManager.getInstance(context).getParts(part_id);
if(parts == null) {
listener.onError(context.getString(R.string.parts_missing));
@@ -504,6 +292,132 @@ public class IspManager {
return ret;
}
+ /**** ISP Commands *****/
+
+ private boolean synchronize(int crystal_freq) {
+ if (serialPort == null)
+ return false;
+ serialPort.purge(D2xxManager.FT_PURGE_RX);
+ serialPort.purge(D2xxManager.FT_PURGE_TX);
+ byte[] buf;
+ if (serialPort.write(SYNC_START) != SYNC_START.length) {
+ System.out.println("Start");
+ return false;
+ }
+
+ buf = new byte[SYNC.length];
+ serialPort.read(buf, buf.length, 500);
+ String result = new String(buf);
+ String expected = new String(SYNC);
+ if (result.compareTo(expected) != 0) {
+ serialPort.write("\r\n".getBytes());
+ System.out.println("Start answer " + result);
+ return false;
+ }
+ if (serialPort.write(SYNC) != SYNC.length) {
+ System.out.println("SYNC write");
+ return false;
+ }
+ clearBuffer(SYNC.length);
+ buf = new byte[SYNC_OK.length];
+ serialPort.read(buf, buf.length, 500);
+ result = new String(buf);
+ expected = new String(SYNC_OK);
+ if (result.compareTo(expected) != 0) {
+ System.out.println("SYNC OK " + result);
+ return false;
+ }
+
+ String freq = String.valueOf(crystal_freq) + "\r\n";
+ if (serialPort.write(freq.getBytes()) != freq.length()) {
+ System.out.println("freq write");
+ return false;
+ }
+
+ clearBuffer(freq.length());
+ buf = new byte[SYNC_OK.length];
+ serialPort.read(buf, buf.length, 500);
+ result = new String(buf);
+ expected = new String(SYNC_OK);
+ if (result.compareTo(expected) != 0) {
+ System.out.println("freq answer " + result);
+ return false;
+ }
+
+ if (serialPort.write(SYNC_ECHO_OFF) != SYNC_ECHO_OFF.length) {
+ System.out.println("Sync Echo Off write");
+ return false;
+ }
+
+ clearBuffer(SYNC_ECHO_OFF.length);
+ buf = new byte[RETURN_CODE_SIZE];
+ serialPort.read(buf, buf.length, 500);
+ clearBuffer(REP_BUF);
+ return true;
+
+
+ }
+
+ private int sendCommand(byte[] cmd) {
+ byte[] buf = new byte[RETURN_CODE_SIZE];
+ if (serialPort.write(cmd) != cmd.length)
+ return -5;
+ int len = read(buf, buf.length, 500);
+ if (len <= 0)
+ return -4;
+ int ret = parseRetCode(buf);
+ if(ret > 9)
+ read(buf,1,50);
+ return ret;
+ }
+
+ private int sendCommand(char c, int addr, int count) {
+ int ret;
+ int len;
+
+ byte[] buf = String.format(Locale.getDefault(),"%c %d %d\r\n",c,addr,count).getBytes();
+ len = buf.length;
+ if(len > REP_BUF) {
+ len = REP_BUF;
+ }
+ int sent = serialPort.write(buf,len);
+ if(len != sent) {
+ return -5;
+ }
+ buf = new byte[RETURN_CODE_SIZE];
+ len = read(buf,buf.length,500);
+ if(len <= 0) {
+ return -4;
+ }
+ ret = parseRetCode(buf);
+
+ return ret;
+ }
+
+ private int send_cmd_sectors(char cmd, int first_sector, int last_sector) {
+ byte[] buf = new byte[RETURN_CODE_SIZE];
+ int ret;
+ int len;
+
+ if(last_sector < first_sector){
+ return -6;
+ }
+
+ String request = String.format(Locale.getDefault(),"%c %d %d\r\n",cmd, first_sector, last_sector);
+ len = serialPort.write(request.getBytes());
+ if(len != request.getBytes().length){
+ return -5;
+ }
+ len = read(buf,buf.length,500);
+ if(len <= 0){
+ return -4;
+ }
+
+ ret = parseRetCode(buf);
+
+ return ret;
+ }
+
private int send_cmd_address(char c, int flash_addr, int ram_addr, int write_size) {
int ret;
int len;
@@ -607,10 +521,61 @@ public class IspManager {
return ret;
}
+ private int parseRetCode(byte[] data) {
+ String str = new String(data,0,2);
+ str = str.replace("\r", "");
+ str = str.replace("\n", "");
+ if (!str.matches("[0-9 -+]*"))
+ return -1;
+ return Integer.parseInt(str);
+ }
+
+ private int eraseFlash(Parts parts) {
+ int ret = unlock();
+ if (ret != 0) {
+ System.out.println("unlock fail");
+ return -1;
+ }
+ for (int i = 0; i < parts.flash_nb_sectors; i++) {
+ //blank-check
+ ret = send_cmd_sectors('I', i, i);
+ if (ret == 0) {
+ continue;
+ }
+
+ if (ret < 0) {
+ System.out.println("blank "+i+" fail");
+ return ret;
+ } else {
+ byte buf[] = new byte[REP_BUF];
+ read(buf, 40, 500);
+ }
+ //prepare-for-write
+ ret = send_cmd_sectors('P', i, i);
+ if (ret != 0) {
+ System.out.println("prepare-for-write "+i+" fail");
+ return ret;
+ }
+ //erase
+ ret = send_cmd_sectors('E', i, i);
+ if (ret != 0) {
+ System.out.println("erase "+i+" fail");
+ return ret;
+ }
+ }
+ return 0;
+ }
+
+ private int unlock() {
+ int ret = sendCommand(UNLOCK);
+ if(ret != 0)
+ return -1;
+ return 0;
+ }
+
+ /**** Miscellaneous Functions ****/
private int uu_encode(byte[] data_out, byte[] data, int offset, int orig_size) {
- //TODO
- System.out.println("uu "+offset+" "+orig_size);
int new_size = 0;
int pos = offset;
while(pos < offset+orig_size) {
@@ -686,8 +651,7 @@ public class IspManager {
val[5] = byteArrayToInt(data, 20);
val[6] = byteArrayToInt(data, 24);
- int sum = 0 - val[0] - val[1] - val[2] - val[3] - val[4] - val[5] - val[6];
- return sum;
+ return 0 - val[0] - val[1] - val[2] - val[3] - val[4] - val[5] - val[6];
}
private void fill_data_with_0(byte[] data, int offset, int flash_size) {
@@ -737,6 +701,33 @@ public class IspManager {
return write_size;
}
+ private int read(byte[] buffer, int size, int timeout) {
+ long startTime = System.nanoTime();
+ long timeoutNano = timeout * 1000000;
+ int sizeRead = 0;
+
+ ByteBuffer output = ByteBuffer.wrap(buffer, 0, size);
+
+ while (sizeRead < size) {
+ int sizeToRead = serialPort.getQueueStatus();
+ if (sizeRead + sizeToRead > size)
+ sizeToRead = size - sizeRead;
+ byte[] buf = new byte[sizeToRead];
+ if (sizeToRead > 0) {
+ int sizeReceived = serialPort.read(buf, sizeToRead, 50);
+ if (sizeReceived < 0)
+ return sizeReceived;
+ sizeRead += sizeReceived;
+ if (sizeReceived != 0)
+ output.put(buf, 0, sizeReceived);
+ }
+ long time = System.nanoTime();
+ if (time - startTime >= timeoutNano)
+ break;
+ }
+ return sizeRead;
+ }
+
private int byteArrayToInt(byte[] array, int offset) {
int value = 0;
value |= (array[offset] & 0xff);
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5c8b53e..2a5aaf1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -30,6 +30,7 @@
Prepare for write fail
write data in ram fail
Copy to flash fail
+ Name:
- http://
- https://