1. 读的问题。
ITE8502有提供一组寄存器给HOST端使用,名称为SMIMAR0~3和SMIMDR,HOST可以通过4E/4F去配置这组寄
存器的基地址,然后把24位的flash地址用IO端口的访问方式丢给SMIMAR0,再去读SMIMDR,就可以读到数据了。
2. 写的问题
ITE8502默认是不允许HOST端去擦除或者编写内容到flash上的,有一个开关必须打开,那就是EC那边的BIOSWE
(BIOS write enable bit),这个bit置为1后,EC对flash的读停止,HOST端进入flash模式,这时可以下任何命令,
比如读ID,擦除,写一个字节等等给flash,下命令的端口为0xFFFF_FE00和0xFFFF_FD00,前者为命令端口,后者为
数据端口,这一组地址值原先是映射到flash上去的,必须去LPC那边把BIOS write enable起来,才能当作有效的MMIO
端口来使用。
在BIOS执行完对flash的操作之后,必须发一个命令通知EC退出flash模式,否则EC仍然处于停止工作的状态。
以下为写一个byte的代码样例:
mov edx, edi call csSpiSetMMIO push ax mov al, 000h call spiControllerSetDeviceStatus pop ax mov byte ptr es:[esi], 0FFh mov byte ptr es:[edi], EC_CMD_WRITE_ENABLE ;Write Enable mov byte ptr es:[esi], 0FFh add ebx, EC_CMD_WRITE_BYTE_addr mov ah, byte ptr es:[ebx] mov byte ptr es:[edi], ah mov ebx, edx shr edx, 16 mov byte ptr es:[edi], dl; dl = bits[23:16] mov byte ptr es:[edi], bh; bh = bits[15:9] mov byte ptr es:[edi], bl; bl = bits[7:0] mov byte ptr es:[edi], al; al = the data mov cx, 0FFFFh wait_prog: call spiControllerGetDeviceStatus bt ax, 0 jnc prog_done ;jmp if not busy loop wait_prog prog_done: