📄 atmel8.c
字号:
/* * atmel8.c: atmel 8 bit (512k x 8 bit) flash driver * * Copyright (C) 2002 tpu (tapu@371.net) * * This program 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 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */#ident "$Id: sst16.c,v 1.4 2002/01/02 01:23:18 tpu Exp $"#ifdef HAVE_CONFIG_H# include <blob/config.h>#endif#include <blob/errno.h>#include <blob/flash.h>#include <blob/util.h>#include <blob/serial.h>#define READ_ARRAY 0x0000f0f0#define FLASH_ADDR1 0x0000aaaa#define FLASH_ADDR2 0x00005554#define UNLOCK1 0x0000aaaa#define UNLOCK2 0x00005555#define ERASE_SETUP 0x00008080#define ERASE_CONFIRM 0x00003030#define PGM_SETUP 0x0000a0a0static void check_data_polling(u16 *addr){ int timeout; u16 data; timeout = 0; while(timeout<0x0007ffff){ data = *addr; barrier(); if((data&0x80) == 0x80) break; timeout ++; }}static void check_toggle_ready(u16 *addr){ u16 currdata, predata; int timeout; timeout = 0; predata = *addr; barrier(); predata &= 0x40; while(timeout<0x7ffff){ currdata = *addr; barrier(); currdata &= 0x40; if(predata == currdata) break; predata = currdata; timeout ++; }}static int flash_erase_sst16(u32 *addr){ /* clear */ *(u16 *)FLASH_ADDR1 = READ_ARRAY; barrier(); /* prepare for erase */ *(u16 *)FLASH_ADDR1 = UNLOCK1; barrier(); *(u16 *)FLASH_ADDR2 = UNLOCK2; barrier(); *(u16 *)FLASH_ADDR1 = ERASE_SETUP; barrier(); /* erase command */ *(u16 *)FLASH_ADDR1 = UNLOCK1; barrier(); *(u16 *)FLASH_ADDR2 = UNLOCK2; barrier(); *(u16 *)addr = ERASE_CONFIRM; check_data_polling((u16 *)addr); return 0;}static int do_write_16(u16 *addr, u16 *data){ *(u16 *)FLASH_ADDR1 = UNLOCK1; barrier(); *(u16 *)FLASH_ADDR2 = UNLOCK2; barrier(); *(u16 *)FLASH_ADDR1 = PGM_SETUP; barrier(); *addr = *data; barrier(); check_toggle_ready(addr); return 0;}static int flash_write_sst16(u32 *dst, const u32* src){ u16 *addr, *data; addr = (u16 *)dst; data = (u16 *)src; /* clear */ *(u16 *)FLASH_ADDR1 = READ_ARRAY; barrier(); do_write_16(addr, data); addr ++; data ++; do_write_16(addr, data); return 0;}static int flash_lock_block_sst16(u32 *blockStart){ return 0;}static int flash_unlock_block_sst16(u32 *blockStart){ return 0;}static int flash_query_block_lock_sst16(u32 *blockStart){ return 0;}/* flash driver structure */flash_driver_t sst16_flash_driver = { erase: flash_erase_sst16, write: flash_write_sst16, lock_block: flash_lock_block_sst16, unlock_block: flash_unlock_block_sst16, query_block_lock: flash_query_block_lock_sst16};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -