From 1545b21df880536f2e827dd447a158aa602c28dd Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Mon, 8 Jul 2013 01:37:27 +0000 Subject: added generic 887 code git-svn-id: https://svn.spreadspace.org/pic/trunk@59 a09c6847-51d9-44de-8ef2-e725cf50f3c7 --- bootloader/Makefile | 2 +- bootloader/bootloader-887.asm | 386 ++++++++++++++++++++++++++++++++++++++++++ bootloader/bootloader.asm | 386 ------------------------------------------ 3 files changed, 387 insertions(+), 387 deletions(-) create mode 100644 bootloader/bootloader-887.asm delete mode 100644 bootloader/bootloader.asm diff --git a/bootloader/Makefile b/bootloader/Makefile index 5503b6d..7aa7390 100644 --- a/bootloader/Makefile +++ b/bootloader/Makefile @@ -20,7 +20,7 @@ ## along with spreadspace pic utils. If not, see . ## -PROJECT := bootloader +PROJECT := bootloader-887 PROC_TYPE := 16F887 include ../include.mk diff --git a/bootloader/bootloader-887.asm b/bootloader/bootloader-887.asm new file mode 100644 index 0000000..03307df --- /dev/null +++ b/bootloader/bootloader-887.asm @@ -0,0 +1,386 @@ + ;; + ;; spreadspace pic utils + ;; + ;; + ;; Copyright (C) 2011 Christian Pointner + ;; + ;; This file is part of spreadspace pic utils. + ;; + ;; spreadspace pic utils is free software: you can redistribute it and/or modify + ;; it under the terms of the GNU General Public License as published by + ;; the Free Software Foundation, either version 3 of the License, or + ;; any later version. + ;; + ;; spreadspace pic utils is distributed in the hope that it will be useful, + ;; but WITHOUT ANY WARRANTY; without even the implied warranty of + ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + ;; GNU General Public License for more details. + ;; + ;; You should have received a copy of the GNU General Public License + ;; along with spreadspace pic utils. If not, see . + ;; + ;; ------------------------------------- + ;; PREAMBLE + + LIST p=16F887 + include "p16f887.inc" + __config _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTOSC + __config _CONFIG2, _BOR21V & _WRT_256 + + ;; ------------------------------------- + ;; DEFINES (chip/com specific) +#define BOOTPIN PORTC,7 +USERVECT EQU H'100' +ISRVECT EQU USERVECT + H'4' +FLASH_BOUNDARY EQU b'00001111' ; flash write boundary is at 16 bytes boundaries + +VERSION_MAJ EQU .0 +VERSION_MIN EQU .1 +NAME_0 EQU '8' +NAME_1 EQU '8' +NAME_2 EQU '7' +DEVID_L EQU H'82' +DEVID_H EQU H'20' +FLASH_SIZE_L EQU H'00' +FLASH_SIZE_H EQU H'20' ; 0x2000 -> 8192 Words of Flash +FSS EQU .16 ; writing is done 8 words at a time but 16 words get erased +EEPROM_SIZE_L EQU H'00' +EEPROM_SIZE_H EQU H'01' ; 0x0100 -> 256 Bytes of EEPROM +MESS EQU .64 ; this limit is because of to combuff size and single byte len field for messages +SUPPORTED_H EQU .0 +SUPPORTED_L EQU b'00000110' ; only read/write flash is supported by now + +#define HOOK_CMD_RESET cmd_not_impl +#define HOOK_CMD_R_FLASH cmd_r_flash +#define HOOK_CMD_W_FLASH cmd_w_flash +#define HOOK_CMD_R_EEPROM cmd_not_impl +#define HOOK_CMD_W_EEPROM cmd_not_impl +#define HOOK_CMD_R_CONFIG cmd_not_impl +#define HOOK_CMD_W_CONFIG cmd_not_impl + + ;; Variables +combuff EQU H'0020' +combuff_end EQU H'006F' + +current_cmdlen EQU H'0070' +csum EQU H'0071' + +flags EQU H'007D' +#define F_CMD_STARTED flags,0 + +cnt2 EQU H'007E' +cnt EQU H'007F' + + + ;; ------------------------------------- + ;; DEFINES (defines) + ;; ERROR codes +E_OK EQU .0 +E_INV_CMD EQU .1 +E_BAD_CSUM EQU .2 +E_NOT_IMPL EQU .3 +E_FLASH_WERR EQU .4 +E_ADDR_INVALID EQU .5 +E_ADDR_PROHIB EQU .6 +E_VALUE_OOB EQU .7 + + ;; CMD codes +CMD_INVALID EQU .0 + +CMD_IDENTIFY EQU .1 +CMD_BOOT EQU .2 +CMD_RESET EQU .3 +CMD_R_FLASH EQU .4 +CMD_W_FLASH EQU .5 +CMD_R_EEPROM EQU .6 +CMD_W_EEPROM EQU .7 +CMD_R_CONFIG EQU .8 +CMD_W_CONFIG EQU .9 + +CMD_MAX EQU .9 +CMD_MIN_LEN EQU .3 + + ;; ------------------------------------- + ;; Boot test + org .0 + ;; btfsc BOOTPIN + ;; goto USERVECT + goto com_init + + ;; ------------------------------------- + ;; goto user ISR + org .4 +isr + goto ISRVECT + + ;; ------------------------------------- + ;; Bootloader (Generic Subroutines) +send_answer ; generic answer message, leave len of data in W + addlw .3 + movwf combuff + .1 + decf combuff + .1,w + movwf cnt + movlw combuff + movwf FSR + clrf csum +send_answer_next + movf INDF,w + call com_tx_byte + incf FSR,f + decfsz cnt,f + goto send_answer_next + + movf csum,w + call com_tx_byte + return + + ;; ------------------ +ack_cmd ; short answers which only contain return code + movwf combuff + .2 + movlw .1 + call send_answer + return + + + ;; ------------------------------------- + ;; Bootloader (com specific subroutines and init) + ;; ------------------ +com_tx_byte ;send one byte and add it to csum + btfss PIR1,TXIF + goto com_tx_byte + movwf TXREG + xorwf csum,f + return + + ;; ------------------ +com_rx_byte + btfsc RCSTA,OERR + goto uart_rx_oe + btfss PIR1,RCIF + goto com_rx_byte + btfsc RCSTA,FERR + goto uart_rx_fe + movf RCREG,w + return + +uart_rx_oe ; recover from overflow + bcf RCSTA,CREN + bsf RCSTA,CREN + goto com_rx_byte + +uart_rx_fe ; recover from framing error + movf RCREG,w + goto com_rx_byte + + ;; ------------------ +com_init + ;; bank 3 + bsf STATUS,RP0 + bsf STATUS,RP1 + movlw b'00001000' ; TX non-inverted, 16bit Baudrate, no auto baud detect + ;; movlw b'00011000' ; TX inverted, 16bit Baudrate, no auto baud detect + movwf BAUDCTL + + ;; bank 1 + bcf STATUS,RP1 + movlw b'01110000' ; set internal OSC to 8MHz + movwf OSCCON + movlw b'00100100' ; Baudrate = High Speed, async mode, transmit enabled, 8bit + movwf TXSTA + movlw .34 ; Baudrate = 57600 (@ 8MHz) -> -0,79 % Error + ;; movlw .51 ; Baudrate = 38400 (@ 8MHz) -> -0,002 % Error + ;; movlw .103 ; Baudrate = 19200 (@ 8MHz) -> 0,16 % Error + movwf SPBRG + clrf SPBRGH + + ;; bank 0 + bcf STATUS,RP0 + movlw b'10010000' ; enable Serial Port, 8bit, enable continues receive, disable address detection + movwf RCSTA + + ;; ------------------------------------- + ;; Bootloader (generic init) + +wait_new_cmd + movlw combuff + movwf FSR + clrf combuff + clrf current_cmdlen + clrf flags + +wait_cmd + call com_rx_byte + movwf INDF ; process received byte + incf FSR,f + btfss F_CMD_STARTED + goto wait_cmd_len + movf current_cmdlen,f + btfsc STATUS,Z + goto new_cmd + decfsz current_cmdlen,f + goto wait_cmd + goto exec_cmd + +wait_cmd_len ; command code received, now wait for length + bsf F_CMD_STARTED + goto wait_cmd + +new_cmd ; got new command code and length -> check it + movf combuff,w + sublw CMD_MAX + btfss STATUS,C + goto invalid_cmd + movlw CMD_MIN_LEN ; check for minimum command len + subwf combuff + .1,w + btfss STATUS,C + goto invalid_cmd + movlw .2 ; 2 bytes already received + subwf combuff + .1,w + movwf current_cmdlen + goto wait_cmd + +exec_cmd ; command is complete -> check csum + movlw combuff + movwf FSR + movf combuff + .1,w + movwf cnt + clrf csum +exec_cmd_check_csum + movf INDF,w + xorwf csum,f + incf FSR,f + decfsz cnt,f + goto exec_cmd_check_csum + movf csum,f + btfss STATUS,Z + goto csum_error + + movf combuff,w ; command is correct and complete -> dispatch + addwf PCL,f + goto wait_new_cmd + goto cmd_identify ; identify + goto cmd_boot ; boot + goto HOOK_CMD_RESET ; reset + goto HOOK_CMD_R_FLASH ; read flash segment + goto HOOK_CMD_W_FLASH ; write flash segment + goto HOOK_CMD_R_EEPROM ; read eeprom + goto HOOK_CMD_W_EEPROM ; write eeprom + goto HOOK_CMD_R_CONFIG ; read config + goto HOOK_CMD_R_CONFIG ; write config + + ;; ** generic error messages ******* +invalid_cmd ; received command code is not known or len is bogus + movlw E_INV_CMD + call ack_cmd + goto wait_new_cmd + +csum_error ; received command has an invalid check sum + movlw E_BAD_CSUM + call ack_cmd + goto wait_new_cmd + +address_invalid ; received command uses invalid address (i.e. not aligned to 16bytes) + movlw E_ADDR_INVALID + call ack_cmd + goto wait_new_cmd + +address_prohibited ; received command uses prohibited address (i.e. FLASH < 0x100) + movlw E_ADDR_PROHIB + call ack_cmd + goto wait_new_cmd + + ;; ** generic command handlers ************ + ;; ** identify ******* +cmd_identify + clrf csum + movf combuff,w + call com_tx_byte + + movlw .19 + call com_tx_byte + + movlw E_OK + call com_tx_byte + + movlw VERSION_MIN + call com_tx_byte + movlw VERSION_MAJ + call com_tx_byte + + movlw NAME_0 + call com_tx_byte + movlw NAME_1 + call com_tx_byte + movlw NAME_2 + call com_tx_byte + + movlw DEVID_L + call com_tx_byte + movlw DEVID_H + call com_tx_byte + + movlw FLASH_SIZE_L + call com_tx_byte + movlw FLASH_SIZE_H + call com_tx_byte + movlw FSS + call com_tx_byte + + movlw EEPROM_SIZE_L + call com_tx_byte + movlw EEPROM_SIZE_H + call com_tx_byte + movlw MESS + call com_tx_byte + + movlw SUPPORTED_L + call com_tx_byte + movlw SUPPORTED_H + call com_tx_byte + + movf csum,w + call com_tx_byte + goto wait_new_cmd + + ;; ** boot ******* +cmd_boot + movlw E_OK + call ack_cmd + goto USERVECT + + ;; ** not implemented commands ******* +cmd_not_impl + movlw E_NOT_IMPL + call ack_cmd + goto wait_new_cmd + + ;; ------------------------------------- + ;; chip specific commands +#include "cmds-16f887.inc" + + ;; ------------------------------------- + ;; ------------------------------------- + ;; dummy user code + org USERVECT + ;; goto USERVECT + bsf STATUS,RP0 + bcf TRISD,0 + bcf STATUS,RP0 +userloop + movlw b'00000001' + xorwf PORTD,f + movlw .255 + movwf cnt +usercnt + movlw .255 + movwf cnt2 +usercnt2 + decfsz cnt2,f + goto usercnt2 + decfsz cnt,f + goto usercnt + goto userloop + + ;; ------------------------------------- + ;; END + end diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm deleted file mode 100644 index d0ad073..0000000 --- a/bootloader/bootloader.asm +++ /dev/null @@ -1,386 +0,0 @@ - ;; - ;; spreadspace pic utils - ;; - ;; - ;; Copyright (C) 2011 Christian Pointner - ;; - ;; This file is part of spreadspace pic utils. - ;; - ;; spreadspace pic utils is free software: you can redistribute it and/or modify - ;; it under the terms of the GNU General Public License as published by - ;; the Free Software Foundation, either version 3 of the License, or - ;; any later version. - ;; - ;; spreadspace pic utils is distributed in the hope that it will be useful, - ;; but WITHOUT ANY WARRANTY; without even the implied warranty of - ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ;; GNU General Public License for more details. - ;; - ;; You should have received a copy of the GNU General Public License - ;; along with spreadspace pic utils. If not, see . - ;; - ;; ------------------------------------- - ;; PREAMBLE - - LIST p=16F887 - include "p16f887.inc" - __config _CONFIG1, _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTOSC - __config _CONFIG2, _BOR21V & _WRT_256 - - ;; ------------------------------------- - ;; DEFINES (chip/com specific) -#define BOOTPIN PORTC,7 -USERVECT EQU H'100' -ISRVECT EQU USERVECT + H'4' -FLASH_BOUNDARY EQU b'00001111' ; flash write boundary is at 16 bytes boundaries - -VERSION_MAJ EQU .0 -VERSION_MIN EQU .1 -NAME_0 EQU 'n' -NAME_1 EQU 'i' -NAME_2 EQU 'l' -DEVID_L EQU H'82' -DEVID_H EQU H'20' -FLASH_SIZE_L EQU H'00' -FLASH_SIZE_H EQU H'20' ; 0x2000 -> 8192 Words of Flash -FSS EQU .16 ; writing is done 8 words at a time but 16 words get erased -EEPROM_SIZE_L EQU H'00' -EEPROM_SIZE_H EQU H'01' ; 0x0100 -> 256 Bytes of EEPROM -MESS EQU .64 ; this limit is because of to combuff size and single byte len field for messages -SUPPORTED_H EQU .0 -SUPPORTED_L EQU b'00000110' ; only read/write flash is supported by now - -#define HOOK_CMD_RESET cmd_not_impl -#define HOOK_CMD_R_FLASH cmd_r_flash -#define HOOK_CMD_W_FLASH cmd_w_flash -#define HOOK_CMD_R_EEPROM cmd_not_impl -#define HOOK_CMD_W_EEPROM cmd_not_impl -#define HOOK_CMD_R_CONFIG cmd_not_impl -#define HOOK_CMD_W_CONFIG cmd_not_impl - - ;; Variables -combuff EQU H'0020' -combuff_end EQU H'006F' - -current_cmdlen EQU H'0070' -csum EQU H'0071' - -flags EQU H'007D' -#define F_CMD_STARTED flags,0 - -cnt2 EQU H'007E' -cnt EQU H'007F' - - - ;; ------------------------------------- - ;; DEFINES (defines) - ;; ERROR codes -E_OK EQU .0 -E_INV_CMD EQU .1 -E_BAD_CSUM EQU .2 -E_NOT_IMPL EQU .3 -E_FLASH_WERR EQU .4 -E_ADDR_INVALID EQU .5 -E_ADDR_PROHIB EQU .6 -E_VALUE_OOB EQU .7 - - ;; CMD codes -CMD_INVALID EQU .0 - -CMD_IDENTIFY EQU .1 -CMD_BOOT EQU .2 -CMD_RESET EQU .3 -CMD_R_FLASH EQU .4 -CMD_W_FLASH EQU .5 -CMD_R_EEPROM EQU .6 -CMD_W_EEPROM EQU .7 -CMD_R_CONFIG EQU .8 -CMD_W_CONFIG EQU .9 - -CMD_MAX EQU .9 -CMD_MIN_LEN EQU .3 - - ;; ------------------------------------- - ;; Boot test - org .0 - ;; btfsc BOOTPIN - ;; goto USERVECT - goto com_init - - ;; ------------------------------------- - ;; goto user ISR - org .4 -isr - goto ISRVECT - - ;; ------------------------------------- - ;; Bootloader (Generic Subroutines) -send_answer ; generic answer message, leave len of data in W - addlw .3 - movwf combuff + .1 - decf combuff + .1,w - movwf cnt - movlw combuff - movwf FSR - clrf csum -send_answer_next - movf INDF,w - call com_tx_byte - incf FSR,f - decfsz cnt,f - goto send_answer_next - - movf csum,w - call com_tx_byte - return - - ;; ------------------ -ack_cmd ; short answers which only contain return code - movwf combuff + .2 - movlw .1 - call send_answer - return - - - ;; ------------------------------------- - ;; Bootloader (com specific subroutines and init) - ;; ------------------ -com_tx_byte ;send one byte and add it to csum - btfss PIR1,TXIF - goto com_tx_byte - movwf TXREG - xorwf csum,f - return - - ;; ------------------ -com_rx_byte - btfsc RCSTA,OERR - goto uart_rx_oe - btfss PIR1,RCIF - goto com_rx_byte - btfsc RCSTA,FERR - goto uart_rx_fe - movf RCREG,w - return - -uart_rx_oe ; recover from overflow - bcf RCSTA,CREN - bsf RCSTA,CREN - goto com_rx_byte - -uart_rx_fe ; recover from framing error - movf RCREG,w - goto com_rx_byte - - ;; ------------------ -com_init - ;; bank 3 - bsf STATUS,RP0 - bsf STATUS,RP1 - movlw b'00001000' ; TX non-inverted, 16bit Baudrate, no auto baud detect - ;; movlw b'00011000' ; TX inverted, 16bit Baudrate, no auto baud detect - movwf BAUDCTL - - ;; bank 1 - bcf STATUS,RP1 - movlw b'01110000' ; set internal OSC to 8MHz - movwf OSCCON - movlw b'00100100' ; Baudrate = High Speed, async mode, transmit enabled, 8bit - movwf TXSTA - movlw .34 ; Baudrate = 57600 (@ 8MHz) -> -0,79 % Error - ;; movlw .51 ; Baudrate = 38400 (@ 8MHz) -> -0,002 % Error - ;; movlw .103 ; Baudrate = 19200 (@ 8MHz) -> 0,16 % Error - movwf SPBRG - clrf SPBRGH - - ;; bank 0 - bcf STATUS,RP0 - movlw b'10010000' ; enable Serial Port, 8bit, enable continues receive, disable address detection - movwf RCSTA - - ;; ------------------------------------- - ;; Bootloader (generic init) - -wait_new_cmd - movlw combuff - movwf FSR - clrf combuff - clrf current_cmdlen - clrf flags - -wait_cmd - call com_rx_byte - movwf INDF ; process received byte - incf FSR,f - btfss F_CMD_STARTED - goto wait_cmd_len - movf current_cmdlen,f - btfsc STATUS,Z - goto new_cmd - decfsz current_cmdlen,f - goto wait_cmd - goto exec_cmd - -wait_cmd_len ; command code received, now wait for length - bsf F_CMD_STARTED - goto wait_cmd - -new_cmd ; got new command code and length -> check it - movf combuff,w - sublw CMD_MAX - btfss STATUS,C - goto invalid_cmd - movlw CMD_MIN_LEN ; check for minimum command len - subwf combuff + .1,w - btfss STATUS,C - goto invalid_cmd - movlw .2 ; 2 bytes already received - subwf combuff + .1,w - movwf current_cmdlen - goto wait_cmd - -exec_cmd ; command is complete -> check csum - movlw combuff - movwf FSR - movf combuff + .1,w - movwf cnt - clrf csum -exec_cmd_check_csum - movf INDF,w - xorwf csum,f - incf FSR,f - decfsz cnt,f - goto exec_cmd_check_csum - movf csum,f - btfss STATUS,Z - goto csum_error - - movf combuff,w ; command is correct and complete -> dispatch - addwf PCL,f - goto wait_new_cmd - goto cmd_identify ; identify - goto cmd_boot ; boot - goto HOOK_CMD_RESET ; reset - goto HOOK_CMD_R_FLASH ; read flash segment - goto HOOK_CMD_W_FLASH ; write flash segment - goto HOOK_CMD_R_EEPROM ; read eeprom - goto HOOK_CMD_W_EEPROM ; write eeprom - goto HOOK_CMD_R_CONFIG ; read config - goto HOOK_CMD_R_CONFIG ; write config - - ;; ** generic error messages ******* -invalid_cmd ; received command code is not known or len is bogus - movlw E_INV_CMD - call ack_cmd - goto wait_new_cmd - -csum_error ; received command has an invalid check sum - movlw E_BAD_CSUM - call ack_cmd - goto wait_new_cmd - -address_invalid ; received command uses invalid address (i.e. not aligned to 16bytes) - movlw E_ADDR_INVALID - call ack_cmd - goto wait_new_cmd - -address_prohibited ; received command uses prohibited address (i.e. FLASH < 0x100) - movlw E_ADDR_PROHIB - call ack_cmd - goto wait_new_cmd - - ;; ** generic command handlers ************ - ;; ** identify ******* -cmd_identify - clrf csum - movf combuff,w - call com_tx_byte - - movlw .19 - call com_tx_byte - - movlw E_OK - call com_tx_byte - - movlw VERSION_MIN - call com_tx_byte - movlw VERSION_MAJ - call com_tx_byte - - movlw NAME_0 - call com_tx_byte - movlw NAME_1 - call com_tx_byte - movlw NAME_2 - call com_tx_byte - - movlw DEVID_L - call com_tx_byte - movlw DEVID_H - call com_tx_byte - - movlw FLASH_SIZE_L - call com_tx_byte - movlw FLASH_SIZE_H - call com_tx_byte - movlw FSS - call com_tx_byte - - movlw EEPROM_SIZE_L - call com_tx_byte - movlw EEPROM_SIZE_H - call com_tx_byte - movlw MESS - call com_tx_byte - - movlw SUPPORTED_L - call com_tx_byte - movlw SUPPORTED_H - call com_tx_byte - - movf csum,w - call com_tx_byte - goto wait_new_cmd - - ;; ** boot ******* -cmd_boot - movlw E_OK - call ack_cmd - goto USERVECT - - ;; ** not implemented commands ******* -cmd_not_impl - movlw E_NOT_IMPL - call ack_cmd - goto wait_new_cmd - - ;; ------------------------------------- - ;; chip specific commands -#include "cmds-16f887.inc" - - ;; ------------------------------------- - ;; ------------------------------------- - ;; dummy user code - org USERVECT - ;; goto USERVECT - bsf STATUS,RP0 - bcf TRISD,0 - bcf STATUS,RP0 -userloop - movlw b'00000001' - xorwf PORTD,f - movlw .255 - movwf cnt -usercnt - movlw .255 - movwf cnt2 -usercnt2 - decfsz cnt2,f - goto usercnt2 - decfsz cnt,f - goto usercnt - goto userloop - - ;; ------------------------------------- - ;; END - end -- cgit v1.2.3