Поэтому мне нужно написать приложение в Android, который должен быть в состоянии прочитать данные, что исходит от FPGA SPARTAN 6.USB передачи хост Android с Spartan 6 FPGA
Мое приложение может определить, когда подключен USB , и может получить информацию о интерфейсах и конечных точках по этим интерфейсам. Но тогда ему нужно прочитать данные, которые кто-то посылает при нажатии кнопки, и это происходит, когда приложение выходит из строя.
Мой код выглядит следующим образом:
package com.example.usb;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.*;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity
{
private UsbManager usbManager;
private UsbDevice device;
private TextView tv;
Handler handler = new Handler()
{
public void handleMessage(Message m)
{
Integer datos = (Integer)m.obj;
tv.setText(datos + "\n");
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.tv);
usbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
}
@Override
protected void onResume()
{
super.onResume();
Intent intent = getIntent();
String action = intent.getAction();
if (action.equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
{
//conectar dispositivo
device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
//muestraDatos(device);
UsbInterface intf = device.getInterface(1);
UsbEndpoint epIN = getIN(device);
//tv.setText(epIN.getDirection() + " " + epIN.getType());
UsbDeviceConnection connection = usbManager.openDevice(device);
new Thread(new Read(connection,intf,epIN,handler)).start();
}
}
private UsbEndpoint getIN(UsbDevice device)
{
UsbInterface intf = device.getInterface(1);
UsbEndpoint ep = null;
int numep = intf.getEndpointCount();
for (int i = 0 ; i < numep ; i++)
{
UsbEndpoint aux = intf.getEndpoint(i);
if (aux.getDirection() == UsbConstants.USB_DIR_IN && aux.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK)
{
ep = aux;
}
}
return ep;
}
и нить чтения (которая должна читать из FPGA) является:
package com.example.usb;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.os.Handler;
import android.os.Message;
public class Read implements Runnable
{
private UsbDeviceConnection connection;
private UsbEndpoint epIN;
private Handler handler;
private UsbInterface intf;
public Read(UsbDeviceConnection connection,UsbInterface intf,UsbEndpoint epIN,Handler handler)
{
this.connection = connection;
this.epIN = epIN;
this.handler = handler;
this.intf = intf;
}
public void run()
{
byte datos[] = new byte[50];
int read_data = 0;
if (connection.claimInterface(intf,true))
{
/*Message sms = new Message();
sms.obj = "Success caliming interface: " + intf.getEndpointCount();
handler.sendMessage(sms);*/
//connection.controlTransfer(0x00000080, 0x03, 0x4138, 0, null, 0, 0);
while (true)
{
try
{
Thread.sleep(500);
}
catch(InterruptedException e){}
read_data = connection.bulkTransfer(epIN, datos, datos.length, 100);
datos = new byte[50];
//if (read_data > -1)
//{
Message sms = new Message();
sms.obj = read_data;
handler.sendMessage(sms);
//}
}
}
else
{
Message sms = new Message();
sms.obj = "Fail claiming interface ";
handler.sendMessage(sms);
}
}
}
Моя цель здесь это просто покажите количество байтов, которые считаются с функцией bulktransfer, но ничего не показывают. Кроме того, я верю, что мне нужно использовать функцию controlTransfer, но официальная документация не объясняет ничего о функции, это просто темная ссылка. Я видел сообщения вроде этого Android 4.0.3. USB Host - sending data via controlTransfer и этого Serial to USB Android application with health device, но не совсем понятно, что означает каждый параметр в функции. Кто-нибудь знает, что я делаю неправильно и/или имеет хорошее объяснение функции controTransfer?
Вы хотели бы начать, имея гораздо лучше идеи о том, что операции ** ** именно аппаратное устройство требует - это не будет то, что кто-то без документации для конкретного устройства, которое вы используете, будет знать, если вы не сможете сказать, что он реализует какую-то известную схему. Вы действительно реализуете USB-движок непосредственно в FPGA (возможно, но необычно), или используете ли вы интерфейс USB-интерфейса? –
Ну, я, правда, ничего не реализовал в FPGA. Предполагается, что FPGA отправит строку бит, и мне нужно будет записать эти биты. Человек, у которого есть ПЛИС, реализовал программу чтения в лабораторном режиме, и из этого он может читать то, что посылает FPGA. Я не знаю ничего о лаборатории или электронике, я просто работаю с API-интерфейсом хоста, который поставляется с Android, но опять же, он не работает. И я не знаю, какие операции требует аппаратное устройство, Im completley здесь потерян, вот почему я просил руку. Thanx. – Zaratustra
Никто не сможет вам помочь, пока вы не предоставите исчерпывающую документацию на свое собственное оборудование - части, которые вы полностью игнорировали в своем ответе выше. Вам нужно будет попросить разработчика board/fpga получить информацию о его интерфейсе USB, без которого вы не сможете использовать плату с Android * или любым другим USB-хостом *. –