Algum método Linux embutido para dispositivos do tipo AXI-burst? [fechadas]

2

Eu preciso me comunicar com um dispositivo FPGA baseado em uma interface AXI-burst. Quais são as formas de acessar tal dispositivo através do Linux sem envolver um DMA? O burst é uma propriedade intrínseca do padrão AXI, que normalmente deve ser acionado automaticamente quando grandes quantidades de dados estão sendo transferidas. E o maior problema é que o FPGA é projetado para responder apenas a solicitações de tipo burst sobre o barramento AXI. Isso causa sérios problemas no Linux quando o aplicativo tenta uma cópia sequencial. P.S. Eu já tentei memcpy e não funciona.

    
por Stark07 22.01.2014 / 08:01

1 resposta

2

Eu assumo que o seu “dispositivo FPGA” é um bloco personalizado, mapeado para memória através da interface AXI para o Cortex-A9. Eu acho que existem 2 ou 3 maneiras de fazer isso funcionar.

1) Mapeamento em cache. A interface de hardware de cache faz a transferência instantânea de toda uma linha de cache por vez. Você precisaria limpar manualmente (após as gravações) e invalidar (antes das leituras).

2) O mapeamento não-armazenável em cache e possui uma rotina de linguagem assembly ARM manipula a transferência de baixo nível. Acho que as instruções "Carregar e armazenar vários registros" podem fornecer o que você está procurando.

Eu tive um problema semelhante em que um periférico AXI (controlador de memória personalizado) precisava ser acessado com transferências de 8 bytes do processador Cortex-A9. As instruções usuais do ARM, é claro, transferem 1, 2 ou 4 bytes (byte, halfword, word). Aqueles trabalhavam através de mapeamento em cache, mas não através de mapeamento não-cacheable. LDM / STM , 2 palavras de cada vez , trabalhou com os dois mapeamentos.

Os modos de transferência AHB / AXI dependem da implementação, é claro. Por sua descrição, você precisa dos modos INCR ou WRAP ao invés de SINGLE. Mas não deveria ser assim. Isso traz à tona a terceira maneira de fazer isso funcionar:

3) Converse com o seu designer de hardware digital, conscientize-o sobre o impacto do software em sua implementação.

Na minha opinião, você não precisa fazer operações incomuns / personalizadas de MMU de baixo nível. Linux tem métodos de alto nível, você colocaria ganchos padrão no seu driver de dispositivo e / ou board.c, a principal opção é ir uncached (isto é, COHERENT). Consulte LDD3 .

    
por 17.03.2014 / 03:35