O Linux congela ao acessar a memória do io em um SoC do Xilinx ARM

0

Estou tentando ler a memória do FPGA em uma placa Xilinx Zynq (zc702) como parte da portagem de um driver RTEMS para o Linux. Estou usando o devmem2 e mmap_test programas que eu recompenso para a placa usando o compilador Yocto. A placa tem 1 GB de memória normal. Isso significa que qualquer leitura entre 0 x 0 e 0x40000000 retorna uma memória válida. O problema é, no entanto, ao ler de 0x7AA00000, o kernel falha imediatamente sem mesmo imprimir uma mensagem de kernel panic no terminal (porta serial com minicom e ssh). Eu até escrevi pequenos módulos de kernel de amostra para ler a partir daquele endereço e usar o kprint, mas isso resultou no mesmo travamento. Como o driver funciona com o RTEMS, o endereço de memória física está correto.

Quais passos devem ser dados para poder ler a memória / registros do FPGA sem travar o Linux?

    
por Moritz 10.01.2018 / 09:25

1 resposta

0

Eu finalmente descobri por que estava sempre quebrando. Foi uma combinação de dois fatores (como é o caso dos problemas complicados).

  1. Ao acessar a memória através de /dev/mem , ela deve estar alinhada à página
  2. Ao acessar a memória do FPGA, o fluxo de bits deve ser carregado primeiro

Inicialmente, eu estava carregando o fluxo de bits do FPGA (com cat stream.bit > /dev/xdevcfg ) e, em seguida, tentando acessar os registradores diretamente com a referência do endereço físico (sem mapeamento). Mais tarde, examinei a leitura de /dev/mem com devmem2, mas não carreguei o fluxo de bits. Ambos causaram erros semelhantes, travamentos de programa e congelamentos de kernel, e demorou um pouco para ver que havia dois erros.

    
por 12.01.2018 / 08:30