Por que não posso ler Pendrive com o 2368?

Software e Hardware para linha ARM

Moderadores: 51, guest2003, Renie, gpenga

Mensagempor proex » 13 Out 2009 17:50

Ok, pelo que entendi então o hardware de USB de um Device é diferente do harware de USB de um Host, é isso?

Se for isso, concordo então. Senao, hardware por hawdware o segredo estaria então na implementação do firmaware de controle?

.
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor xultz » 13 Out 2009 17:58

Sim, o hardware é ligeiramente diferente.
O mais modernoso atualmente são USB on the go, que você escolhe o que ela será, podendo ser até automático (se plugar um pendrive ela vira host, se plugar num computador vira client).
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor Silvio51 » 14 Out 2009 07:07

fabim escreveu:
xultz escreveu:Ah loco, eu não deixava!
Porrada! Porrada! Porrada! Porrada! Porrada! Porrada! Porrada!

á sim silvio51, realmente o P/N LPC2368 é muito parecido com LPC1766... tendi...

Aff, to saindo precisando de mim, não conte comigo..


Não foi isso que escreví Fabim...

Blá blá blá blá blá.... calma menina.... desceu do salto ? Errei de micro.... me referia ao LPC2388... é que tá uma "LPCzada" só aqui.... confundí os troço... com ele sim: Dá pra fazer Host ( o LPC1766 também).



Acho que LPC2368 e LPC 2388 são P/N parecidos... no mais... é só...

E se precisar de mim..................................................................
Silvio51
Byte
 
Mensagens: 383
Registrado em: 02 Nov 2006 14:04
Localização: Brasil

Mensagempor fabim » 14 Out 2009 08:50

Proex.

Assim.
Em um device usb tem uma fifo de 4 bytes.
Essa fifo informa para o host.

Flag de sinalização
Endereço atual do buffer a ser lido, ou escrito.
Quantos bytes serão escrtos

Observe um usb device, como sendo simplesmente uma memoria, memoria mesmo como se fosse um SPI da vida, só que utilizando duas vias de duplex.

O pc, vai na fifo e le, por exemplo a cada 1MS.
Lembra da raiva que passou com o pc criando interrupt a cada 1mS ?

Quando ele lê esta fifo, ele bizóia o byte contendo os flags de sinalização.
Estes flag´s informam qual endpoint esta na agulha, pois no descriptor ja informou o que cada endpoint faz, certo, se é entrada de dados, saida de dados, entrada de informação, saida de informação!?

Depois que o HOST leu o byte com os flag´s, ele sabe se o pic quer receber ou enviar informação ou dados.
Feito isto, o HOST ja pegou no byte 2 e 3, a word informando qual endereço inicial do buffer a ser utilizado.
Depois vem o Byte 3, que informa a quantidade de bytes a ser escrito ou lido, para HID no máximo 64 bytes.

Veja bem, quando se diz uma pequena diferença, não não é uma grande diferença.
O DEVICE é simplesmente uma memoria, que pode ser escrita ou lida, isto em HID, e que o uC que é vizinho desta memoria, pode colocar alguns bytes numa fifo informando posição etc.

HOST, assim como uma 24LC256 precisa de um uC para poder ler, escrever etc.
HID, precisa de um HOST para poder ler e escrever na sua ram interna.

O uc, com usb device, não escreve nada para o pc. Tipo o uC não vai numa rotina que fica mandando dados para o pc. Ele escreve a informação que quer que o PC leia no buffer X, vai na fifo ou cabeçalho, Seta os flags, informa o endereço inicial, e quantos bytes ele quer que o pc leia.

BLZ ?

Abraços

Fabim


Código: Selecionar todos
// retorna !=0 se chegou alguma coisa.
unsigned short USB_HID_Read(unsigned char *DstPtr, unsigned short MaxLen){
unsigned short ByteCount, I, E;
unsigned char * SrcPtr ;

  E = (BDEP1OUTStat & 0b10000000);

  if (!E) {  // ja leu ? caso tenha dito para o host ler ?
    //sim, ja leu
    ByteCount = BDEP1OUTCnt;   // get bytecount of EP1 out buffer

    if (ByteCount > MaxLen){ ByteCount = MaxLen;}

    if (ByteCount){       // non empty

      SrcPtr = BDEP1OUTAdr;    // Source data pointer

      I = ByteCount;   //aloca bytes a serem escritos, e apaga o restante
      while(I){
      * DstPtr++ = * SrcPtr++;  //
        I--; }   //pega dados do meu array no main, e coloca dentro do
    }            // array BDEP1OUTAdr

    // prepare the buffer for next transfer
   BDEP1OUTCnt  = USB_BUFF_SIZE;//tamanho do array máximo
   BDEP1OUTAdr  = &BuffEP1OUT; //endereço do array que o host le     BDEP1OUTStat &=  USB_DTSMASK;   // save only the data 0/1 bit
    BDEP1OUTStat ^=  USB_DTSMASK;   // toggle data 0/1
    BDEP1OUTStat |=  USB_DTSEN; // set the DTS bit
    BDEP1OUTStat |=  USB_USIE;  // set the UOWN bit
    return(0xff);
  }else{
  return(0x00);}
}


A rotina de escrita de Device to Host, é isso aí ó.!!

No arm, ou qualquer outro é a mesma porcaria, tipo. Pode mudar o nome dos registradores, mais a sua função continua sendo a mesma em DEVICE.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor Djalma Toledo Rodrigues » 14 Out 2009 11:24

fabim escreveu:Proex.

Veja bem, quando se diz uma pequena diferença, não não é uma grande diferença.
BLZ ?
Abraços
Fabim

O Fabim faz toda a diferença. :D
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Jorge_Francisco » 14 Out 2009 14:00

Fabim,

Lembrando que :

-Tudo que falou é para o caso de um HID.

-O uC escreve no buffer interno, mas o PC lê o conteúdo do buffer interno do uC só quando requisitado.

-Para contornar o envio de 64bytes por frame pode-se usar o
modo ping-pong de até 19 pacotes de 64 bytes.

-Na USB 3.0, que já está presente em alguns notebooks novos, temos o micro-frame com interrupção a cada 500us.

-Para Audio pode-se usar Isócronus(Isochronous) lembrando que no Win
XP há uma correção para não se ouvir alguns estalos no audio.

Jorge
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor fabim » 14 Out 2009 14:19

jorgim, é +/- isso.
Isocronous, o host não faz conferencia de byte to byte para confirmar 100% de latencia, e caso haja erro, ele lê o buffer todim novamente.
O isocronous não respeita o debounce time, ele fica pegando os dados do DEVICE, e só Deus sabe se vai chegar certo no PC, e se o uC ja acabou de escrever.

Por exemplo.
Quando você tem uma liby aberta igual a que eu fiz.
E quer de alguma forma enviar os 64K bytes por segundo promeditos.
Tu pode muito bem mandar 128K.
Como ?

Cria dois buffer´s de 64bytes e na fifo fica fazendo uma gangorra apontando o edereço de buffer´s diferentes, mais como se fosse o header do mesmo buffer.
Tipo, preenche direto os 64Bytes na EDP, vai lá e seta pra mandar esse, ja vai pra preencher outro, daqui 1mS tu preenche a fifo com o endereço desse segundo.
E por aí vai.

Tem N maneiras de fazer,

Pode muito bem, tipo.
Ao invés de criar um array no main, e quando for mandar para o PC, tem que mover o array do main, para o EDP e depois setar isso aquilo outro.
Tu ja escreve direto no EDP, seta para envio, e vai escrever em outro EDP, no proximo envio tu vai setar para esse segundo EDP.
ETC ETC

Não é dificil não viu jorgim,
Quando pega firme e começa a xeretar, clareia bem as idéias.
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Anterior

Voltar para ARM

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x