Boot ROM
Quando o sistema arranca, depois de ser alimentado, todos os n´ucleos s˜ao colocados no estado inicial, incluindo o processador. Ao iniciar, o processador executa a partir do enderec¸o previamente configu-rado para o efeito. Existem duas hip´oteses. A primeira ´e a de o programa principal estar carregado na mem´oria de instruc¸˜oes. Neste caso, o enderec¸o configurado ´e aquele onde comec¸a o programa principal. Esta hip´otese tem a vantagem de ser mais r´apida e simples, comec¸ando o programa a correr assim que o sistema recebe energia, mas tem a desvantagem de o programa n˜ao poder ser alterado. A segunda hip´otese ´e a de o enderec¸o definido inicialmente ser de uma mem´oria n˜ao vol´atil (boot ROM), que tem dispon´ıvel uma sub-rotina que copia o programa de uma mem´oria externa para a mem´oria de instruc¸˜oes, colocando depois o ponteiro de instruc¸˜oes no enderec¸o onde comec¸a o programa principal de forma a execut´a-lo. Esta hip´otese leva a demorar mais tempo a iniciar mas permite que o programa a ser executado seja alterado de uma forma simples e quantas vezes se quiser. Bastar´a, por exemplo, substituir um cart˜ao de mem´oria, ligar e desligar a energia el´ectrica do sistema e teremos um programa novo a correr no SoC. Aboot ROM ´e como o nome indica uma mem´oriaRead-Only Memory (ROM), que apenas permite leitura, e na maioria dos casos cont´em um programa muitas vezes escrito em as-sembly para ser mais eficiente e pequeno. O programa apenas copia os dados de uma determinada mem´oria para a mem´oria de instruc¸˜oes, mandando execut´a-las, e podendo tamb´em fazer pequenas verificac¸˜oes.
No desenvolvimento do projecto optou-se por utilizar umaboot ROMpor permitir trocar o programa principal a executar no sistema SoC. A comunidade OpenRisc tinha dispon´ıvel uma boot ROM bas-tante simples que copiava 65535 (0XFFFF) posic¸˜oes de mem´oria, comec¸ando de um enderec¸o de um perif´erico para outro enderec¸o onde estava localizada a mem´oria de instruc¸˜oes. Mas era pretendido mais do que isso: para al´em de copiar essas posic¸˜oes de mem´oria, pretendia-se que a boot ROM efectuasse a verificac¸˜ao dos dados no processo de leitura do perif´erico e na escrita para a mem´oria de instruc¸˜oes. Para isso, foi desenvolvida a boot ROM que est´a descrita de uma forma sucinta no fluxograma da figura 6.1.
Como se pode ver pelo fluxograma, aboot ROM comec¸a por inicializar algumas vari´aveis nos regis-tos do processador, depois configura o n´ucleo mestre de SPI, inicializando-o. Envia o enderec¸o donde
Figura 6.1:Fluxograma da boot ROM.
deve comec¸ar a ler a mem´oria n˜ao vol´atil e selecciona o tipo de leitura que pretende realizar, neste caso, a leitura r´apida que foi descrita na secc¸˜ao 3.1. Comec¸a a fazer leituras consecutivas de 65535 (0XFFFF na base hexadecimal) posic¸˜oes de mem´oria, com palavras de tamanho 1 byte. Quando acaba o envio do conte´udo de todas as posic¸˜oes de mem´oria, o ponteiro de instruc¸˜oes efectua um salto para o enderec¸o 256 (0X100) da mem´oria de instruc¸˜oes, para onde foi copiado o programa, comec¸ando a execut´a-lo da mem´oria externa. No ciclo de programa em que se efectua a c´opia de uma mem´oria
para outra, s˜ao realizados dois testes para verificar os processos de leitura e escrita das mem´orias.
Quando ´e detectado um erro, a sub-rotina envia uma mensagem de erro tanto pela UART, sob a forma de uma mensagem de texto, como pela interface de GPIO, enviando o c´odigo 0X03 se for um problema de leitura da mem´oria externa e 0X05 caso seja um problema de escrita na mem´oria interna. A boot ROM est´a escrita em assembly e ´e compilada conforme a configurac¸˜ao que se pretende. ´E poss´ıvel desactivar tanto os testes como as v´arias mensagens de erro, a partir de definic¸˜oes de constantes que se encontram na parte inicial do ficheiro onde est´a descrita aboot ROM, e que podem ser alteradas antes de compilar.
6.1 Testes de verificac¸ ˜ao
Foi desenvolvido um teste para cada caso, um teste de leitura de dados da mem´oria externa com o protocolo SPI, e outro teste que verifica se os dados est˜ao escritos correctamente na mem´oria de instruc¸˜oes. Com isto pretende-se a verificac¸˜ao do correcto carregamento do programa na mem´oria de instruc¸˜oes.
6.1.1 Teste de leitura SPI
O primeiro teste a ser efectuado ´e o teste de leitura das instruc¸˜oes do programa da mem´oria externa por SPI. Em todos os programas compilados, a instruc¸˜ao inicial ´e sempre 0X1800, correspondendo `a instruc¸˜ao assembly l-movhi R0 0X00, utilizado para inicializar o registo 0 a zero do SoC. Neste teste verifica-se se na primeira posic¸˜ao da mem´oria externa est´a o byte 0X18, j´a que a mem´oria externa tem apenas dois bytes por cada posic¸˜ao e o OpenRisc ´e uma m´aquinabig-endian. Se os bytes forem os esperados, a sub-rotina continua a copiar as instruc¸˜oes para a mem´oria de instruc¸˜oes; p´ara de efectuar a c´opia das instruc¸˜oes e envia as mensagens de erro por GPIO e UART. Pela interface GPIO
´e enviado o c´odigo de erro 0X03 e em seguida a mensagem ”COMMUNICATION PROBLEM READING FLASH”pela UART.
6.1.2 Teste de escrita na mem ´ oria principal
O processo de teste da escrita para a mem´oria principal comec¸a por escrever a primeira instruc¸˜ao no enderec¸o 0X0104 da mem´oria principal. Depois ´e efectuada uma leitura de quatro bytes no mesmo enderec¸o onde se acabou de escrever. Para verificar se a instruc¸˜ao foi escrita correctamente a palavra lida da mem´oria tem que ser 0X1800. Caso o teste seja positivo, o processo de c´opia das instruc¸˜oes do programa para a mem´oria principal continua normalmente; caso contr´ario s˜ao enviadas mensagens de erro. Para a interface GPIO ´e enviado o c´odigo 0X05 e para a UART ´e enviada a mensagem
”COMMUNICATION PROBLEM WRITING MEMORY”.