diff options
author | Wolfgang Denk <wd@denx.de> | 2011-05-01 20:44:23 +0200 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2011-06-22 20:00:51 +0200 |
commit | 566e5cf451ae7e33e31bb62ae5b9b258e33f8609 (patch) | |
tree | ad2dd1fedb542a5974ca4d34081fbafb8f7f3f9b /board/trab | |
parent | 79cfe422615c010a75ece41662a05cd432ada389 (diff) |
ARM: drop unsupported 'trab' board
The 'trab' board configuration is broken, and there is nobody who is
interested and willing to fix it. Drop it.
This includes support for VFD displays which have always been used by
this board only.
Signed-off-by: Wolfgang Denk <wd@denx.de>
Diffstat (limited to 'board/trab')
-rw-r--r-- | board/trab/Makefile | 71 | ||||
-rw-r--r-- | board/trab/Pt1000_temp_data.h | 71 | ||||
-rw-r--r-- | board/trab/README.kbd | 44 | ||||
-rw-r--r-- | board/trab/auto_update.c | 676 | ||||
-rw-r--r-- | board/trab/cmd_trab.c | 879 | ||||
-rw-r--r-- | board/trab/config.mk | 26 | ||||
-rw-r--r-- | board/trab/flash.c | 569 | ||||
-rw-r--r-- | board/trab/lowlevel_init.S | 182 | ||||
-rw-r--r-- | board/trab/memory.c | 486 | ||||
-rw-r--r-- | board/trab/rs485.c | 205 | ||||
-rw-r--r-- | board/trab/rs485.h | 37 | ||||
-rw-r--r-- | board/trab/trab.c | 436 | ||||
-rw-r--r-- | board/trab/trab_fkt.c | 1418 | ||||
-rw-r--r-- | board/trab/tsc2000.c | 366 | ||||
-rw-r--r-- | board/trab/tsc2000.h | 148 | ||||
-rw-r--r-- | board/trab/u-boot.lds | 64 | ||||
-rw-r--r-- | board/trab/vfd.c | 574 |
17 files changed, 0 insertions, 6252 deletions
diff --git a/board/trab/Makefile b/board/trab/Makefile deleted file mode 100644 index 82da40c9af..0000000000 --- a/board/trab/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -# -# (C) Copyright 2000-2006 -# Wolfgang Denk, DENX Software Engineering, wd@denx.de. -# -# See file CREDITS for list of people who contributed to this -# project. -# -# 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 -# - -include $(TOPDIR)/config.mk - -LIB = $(obj)lib$(BOARD).o - -COBJS := trab.o flash.o vfd.o cmd_trab.o memory.o tsc2000.o auto_update.o -SOBJS := lowlevel_init.o - -COBJS_FKT := trab_fkt.o rs485.o tsc2000.o - -SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) $(COBJS_FKT:.o=.c) -OBJS := $(addprefix $(obj),$(COBJS)) -SOBJS := $(addprefix $(obj),$(SOBJS)) - -OBJS_FKT := $(addprefix $(obj),$(COBJS_FKT)) - -LOAD_ADDR = 0xc100000 - -######################################################################### - -all: $(LIB) $(obj)trab_fkt.srec $(obj)trab_fkt.bin - -$(LIB): $(obj).depend $(OBJS) $(SOBJS) - $(call cmd_link_o_target, $(OBJS) $(SOBJS)) - -$(obj)trab_fkt.srec: $(OBJS_FKT) $(LIB) - $(LD) -g -Ttext $(LOAD_ADDR) -o $(<:.o=) -e trab_fkt $^ $(LIB) \ - -L$(obj)../../examples/standalone -lstubs \ - -L$(obj)../../lib -lgeneric \ - $(PLATFORM_LIBS) - $(OBJCOPY) -O srec $(<:.o=) $@ - -$(obj)trab_fkt.bin: $(obj)trab_fkt.srec - $(OBJCOPY) -I srec -O binary $< $@ - -clean: - rm -f $(SOBJS) $(OBJS) $(OBJS_FKT) - -distclean: clean - rm -f $(LIB) core *.bak $(obj).depend - -######################################################################### - -# defines $(obj).depend target -include $(SRCTREE)/rules.mk - -sinclude $(obj).depend - -######################################################################### diff --git a/board/trab/Pt1000_temp_data.h b/board/trab/Pt1000_temp_data.h deleted file mode 100644 index 17e9ed7ae8..0000000000 --- a/board/trab/Pt1000_temp_data.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Data file for tsc2000 driver. - * Copyright (C) 2002, 2003 DENX Software Engineering, Wolfgang Denk, wd@denx.de - */ - -#ifndef _PT1000_TEMP_DATA_H -#define _PT1000_TEMP_DATA_H - -long Pt1000_temp_table[][2] = { - /* For quick range checking the largest element - * is placed at index 0. - * U, nV T, C*100 - */ - { 44000000 , 12165 }, - { -10000000 , -2644 }, - { -9000000 , -2381 }, - { -8000000 , -2118 }, - { -7000000 , -1855 }, - { -6000000 , -1591 }, - { -5000000 , -1327 }, - { -4000000 , -1063 }, - { -3000000 , -798 }, - { -2000000 , -532 }, - { -1000000 , -266 }, - { 0 , 000 }, - { 1000000 , 267 }, - { 2000000 , 534 }, - { 3000000 , 802 }, - { 4000000 , 1070 }, - { 5000000 , 1338 }, - { 6000000 , 1607 }, - { 7000000 , 1876 }, - { 8000000 , 2146 }, - { 9000000 , 2416 }, - { 10000000 , 2687 }, - { 11000000 , 2958 }, - { 12000000 , 3230 }, - { 13000000 , 3502 }, - { 14000000 , 3774 }, - { 15000000 , 4047 }, - { 16000000 , 4321 }, - { 17000000 , 4595 }, - { 18000000 , 4869 }, - { 19000000 , 5144 }, - { 20000000 , 5419 }, - { 21000000 , 5694 }, - { 22000000 , 5971 }, - { 23000000 , 6247 }, - { 24000000 , 6524 }, - { 25000000 , 6802 }, - { 26000000 , 7080 }, - { 27000000 , 7358 }, - { 28000000 , 7637 }, - { 29000000 , 7916 }, - { 30000000 , 8196 }, - { 31000000 , 8476 }, - { 32000000 , 8757 }, - { 33000000 , 9039 }, - { 34000000 , 9320 }, - { 35000000 , 9602 }, - { 36000000 , 9885 }, - { 37000000 , 10168 }, - { 38000000 , 10452 }, - { 39000000 , 10736 }, - { 40000000 , 11021 }, - { 41000000 , 11306 }, - { 42000000 , 11592 }, - { 43000000 , 11879 }, - { 44000000 , 12165 }, -}; -#endif /* _PT1000_TEMP_DATA_H */ diff --git a/board/trab/README.kbd b/board/trab/README.kbd deleted file mode 100644 index 3db00bccec..0000000000 --- a/board/trab/README.kbd +++ /dev/null @@ -1,44 +0,0 @@ - -The TRAB keyboard implementation is similar to that for LWMON and -R360MPI boards. The only difference concerns key naming. There are 4 -keys on TRAB: 1, 2, 3, 4. - -1) The "kbd" command provides information about the current state of - the keys. For example, - - TRAB # kbd - Keys: 1 0 1 0 - - means that keys 1 and 3 are pressed. The keyboard status is also - stored in the "keybd" environment variable. In this example we get - - keybd=1010 - -2) The "preboot" variable is set according to current environment - settings and keys pressed. This is an example: - - TRAB # setenv magic_keys XY - TRAB # setenv key_magicX 12 - TRAB # setenv key_cmdX echo ## Keys 1 + 2 pressed ##\;echo - TRAB # setenv key_magicY 13 - TRAB # setenv key_cmdY echo ## Keys 1 + 3 pressed ##\;echo - - Here "magic_keys=XY" means that the "key_magicX" and "key_magicY" - variables will be checked for a match. Each variable "key_magic*" - defines a set of keys. In the our example, if keys 1 and 3 are - pressed during reset, then "key_magicY" matches, so the "preboot" - variable will be set to the contents of "key_cmdY": - - preboot=echo ## Keys 1 + 3 pressed ##;echo - -3) The TRAB board has optional modem support. When a certain key - combination is pressed on the keyboard at power-on, the firmware - performs the necessary initialization of the modem and allows for - dial-in. The key combination is specified in the - "include/configs/trab.h" file. For example: - - #define CONFIG_MODEM_KEY_MAGIC "23" - - means that modem will be initialized if and only if both keys 2, 3 - are pressed. Note that the format of this string is similar to the - format of "key_magic*" environment variables described above. diff --git a/board/trab/auto_update.c b/board/trab/auto_update.c deleted file mode 100644 index bcb8505261..0000000000 --- a/board/trab/auto_update.c +++ /dev/null @@ -1,676 +0,0 @@ -/* - * (C) Copyright 2003 - * Gary Jennejohn, DENX Software Engineering, garyj@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#include <common.h> -#include <command.h> -#include <malloc.h> -#include <image.h> -#include <asm/byteorder.h> -#include <usb.h> - -#ifdef CONFIG_SYS_HUSH_PARSER -#include <hush.h> -#endif - -#ifdef CONFIG_AUTO_UPDATE - -#ifndef CONFIG_USB_OHCI_NEW -#error "must define CONFIG_USB_OHCI" -#endif - -#ifndef CONFIG_USB_STORAGE -#error "must define CONFIG_USB_STORAGE" -#endif - -#ifndef CONFIG_SYS_HUSH_PARSER -#error "must define CONFIG_SYS_HUSH_PARSER" -#endif - -#if !defined(CONFIG_CMD_FAT) -#error "must define CONFIG_CMD_FAT" -#endif - -/* - * Check whether a USB memory stick is plugged in. - * If one is found: - * 1) if prepare.img ist found load it into memory. If it is - * valid then run it. - * 2) if preinst.img is found load it into memory. If it is - * valid then run it. Update the EEPROM. - * 3) if firmw_01.img is found load it into memory. If it is valid, - * burn it into FLASH and update the EEPROM. - * 4) if kernl_01.img is found load it into memory. If it is valid, - * burn it into FLASH and update the EEPROM. - * 5) if app.img is found load it into memory. If it is valid, - * burn it into FLASH and update the EEPROM. - * 6) if disk.img is found load it into memory. If it is valid, - * burn it into FLASH and update the EEPROM. - * 7) if postinst.img is found load it into memory. If it is - * valid then run it. Update the EEPROM. - */ - -#undef AU_DEBUG - -#undef debug -#ifdef AU_DEBUG -#define debug(fmt,args...) printf (fmt ,##args) -#else -#define debug(fmt,args...) -#endif /* AU_DEBUG */ - -/* possible names of files on the USB stick. */ -#define AU_PREPARE "prepare.img" -#define AU_PREINST "preinst.img" -#define AU_FIRMWARE "firmw_01.img" -#define AU_KERNEL "kernl_01.img" -#define AU_APP "app.img" -#define AU_DISK "disk.img" -#define AU_POSTINST "postinst.img" - -struct flash_layout -{ - long start; - long end; -}; - -/* layout of the FLASH. ST = start address, ND = end address. */ -#ifndef CONFIG_FLASH_8MB /* 16 MB Flash, 32 MB RAM */ -#define AU_FL_FIRMWARE_ST 0x00000000 -#define AU_FL_FIRMWARE_ND 0x0009FFFF -#define AU_FL_VFD_ST 0x000A0000 -#define AU_FL_VFD_ND 0x000BFFFF -#define AU_FL_KERNEL_ST 0x000C0000 -#define AU_FL_KERNEL_ND 0x001BFFFF -#define AU_FL_APP_ST 0x001C0000 -#define AU_FL_APP_ND 0x005BFFFF -#define AU_FL_DISK_ST 0x005C0000 -#define AU_FL_DISK_ND 0x00FFFFFF -#else /* 8 MB Flash, 32 MB RAM */ -#define AU_FL_FIRMWARE_ST 0x00000000 -#define AU_FL_FIRMWARE_ND 0x0005FFFF -#define AU_FL_KERNEL_ST 0x00060000 -#define AU_FL_KERNEL_ND 0x0013FFFF -#define AU_FL_APP_ST 0x00140000 -#define AU_FL_APP_ND 0x0067FFFF -#define AU_FL_DISK_ST 0x00680000 -#define AU_FL_DISK_ND 0x007DFFFF -#define AU_FL_VFD_ST 0x007E0000 -#define AU_FL_VFD_ND 0x007FFFFF -#endif /* CONFIG_FLASH_8MB */ - -/* a structure with the offsets to values in the EEPROM */ -struct eeprom_layout -{ - int time; - int size; - int dcrc; -}; - -/* layout of the EEPROM - offset from the start. All entries are 32 bit. */ -#define AU_EEPROM_TIME_PREINST 64 -#define AU_EEPROM_SIZE_PREINST 68 -#define AU_EEPROM_DCRC_PREINST 72 -#define AU_EEPROM_TIME_FIRMWARE 76 -#define AU_EEPROM_SIZE_FIRMWARE 80 -#define AU_EEPROM_DCRC_FIRMWARE 84 -#define AU_EEPROM_TIME_KERNEL 88 -#define AU_EEPROM_SIZE_KERNEL 92 -#define AU_EEPROM_DCRC_KERNEL 96 -#define AU_EEPROM_TIME_APP 100 -#define AU_EEPROM_SIZE_APP 104 -#define AU_EEPROM_DCRC_APP 108 -#define AU_EEPROM_TIME_DISK 112 -#define AU_EEPROM_SIZE_DISK 116 -#define AU_EEPROM_DCRC_DISK 120 -#define AU_EEPROM_TIME_POSTINST 124 -#define AU_EEPROM_SIZE_POSTINST 128 -#define AU_EEPROM_DCRC_POSTINST 132 - -static int au_usb_stor_curr_dev; /* current device */ - -/* index of each file in the following arrays */ -#define IDX_PREPARE 0 -#define IDX_PREINST 1 -#define IDX_FIRMWARE 2 -#define IDX_KERNEL 3 -#define IDX_APP 4 -#define IDX_DISK 5 -#define IDX_POSTINST 6 -/* max. number of files which could interest us */ -#define AU_MAXFILES 7 -/* pointers to file names */ -char *aufile[AU_MAXFILES]; -/* sizes of flash areas for each file */ -long ausize[AU_MAXFILES]; -/* offsets into the EEEPROM */ -struct eeprom_layout auee_off[AU_MAXFILES] = { \ - {0}, \ - {AU_EEPROM_TIME_PREINST, AU_EEPROM_SIZE_PREINST, AU_EEPROM_DCRC_PREINST,}, \ - {AU_EEPROM_TIME_FIRMWARE, AU_EEPROM_SIZE_FIRMWARE, AU_EEPROM_DCRC_FIRMWARE,}, \ - {AU_EEPROM_TIME_KERNEL, AU_EEPROM_SIZE_KERNEL, AU_EEPROM_DCRC_KERNEL,}, \ - {AU_EEPROM_TIME_APP, AU_EEPROM_SIZE_APP, AU_EEPROM_DCRC_APP,}, \ - {AU_EEPROM_TIME_DISK, AU_EEPROM_SIZE_DISK, AU_EEPROM_DCRC_DISK,}, \ - {AU_EEPROM_TIME_POSTINST, AU_EEPROM_SIZE_POSTINST, AU_EEPROM_DCRC_POSTINST,} \ - }; -/* array of flash areas start and end addresses */ -struct flash_layout aufl_layout[AU_MAXFILES - 3] = { \ - {AU_FL_FIRMWARE_ST, AU_FL_FIRMWARE_ND,}, \ - {AU_FL_KERNEL_ST, AU_FL_KERNEL_ND,}, \ - {AU_FL_APP_ST, AU_FL_APP_ND,}, \ - {AU_FL_DISK_ST, AU_FL_DISK_ND,}, \ -}; -/* convert the index into aufile[] to an index into aufl_layout[] */ -#define FIDX_TO_LIDX(idx) ((idx) - 2) - -/* where to load files into memory */ -#define LOAD_ADDR ((unsigned char *)0x0C100000) -/* the app is the largest image */ -#define MAX_LOADSZ ausize[IDX_APP] - -/* externals */ -extern int fat_register_device(block_dev_desc_t *, int); -extern int file_fat_detectfs(void); -extern long file_fat_read(const char *, void *, unsigned long); -extern int i2c_read (unsigned char, unsigned int, int , unsigned char* , int); -extern int i2c_write (uchar, uint, int , uchar* , int); -#ifdef CONFIG_VFD -extern int trab_vfd (ulong); -extern int transfer_pic(unsigned char, unsigned char *, int, int); -#endif -extern int flash_sect_erase(ulong, ulong); -extern int flash_sect_protect (int, ulong, ulong); -extern int flash_write (char *, ulong, ulong); -/* change char* to void* to shutup the compiler */ -extern int i2c_write_multiple (uchar, uint, int, void *, int); -extern int i2c_read_multiple (uchar, uint, int, void *, int); -extern int u_boot_hush_start(void); - -int -au_check_cksum_valid(int idx, long nbytes) -{ - image_header_t *hdr; - - hdr = (image_header_t *)LOAD_ADDR; -#if defined(CONFIG_FIT) - if (genimg_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { - puts ("Non legacy image format not supported\n"); - return -1; - } -#endif - - if (nbytes != image_get_image_size (hdr)) { - printf ("Image %s bad total SIZE\n", aufile[idx]); - return -1; - } - /* check the data CRC */ - if (!image_check_dcrc (hdr)) { - printf ("Image %s bad data checksum\n", aufile[idx]); - return -1; - } - return 0; -} - -int -au_check_header_valid(int idx, long nbytes) -{ - image_header_t *hdr; - unsigned long checksum; - unsigned char buf[4]; - - hdr = (image_header_t *)LOAD_ADDR; -#if defined(CONFIG_FIT) - if (genimg_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { - puts ("Non legacy image format not supported\n"); - return -1; - } -#endif - - /* check the easy ones first */ -#undef CHECK_VALID_DEBUG -#ifdef CHECK_VALID_DEBUG - printf("magic %#x %#x ", image_get_magic (hdr), IH_MAGIC); - printf("arch %#x %#x ", image_get_arch (hdr), IH_ARCH_ARM); - printf("size %#x %#lx ", image_get_data_size (hdr), nbytes); - printf("type %#x %#x ", image_get_type (hdr), IH_TYPE_KERNEL); -#endif - if (nbytes < image_get_header_size ()) { - printf ("Image %s bad header SIZE\n", aufile[idx]); - return -1; - } - if (!image_check_magic (hdr) || !image_check_arch (hdr, IH_ARCH_ARM)) { - printf ("Image %s bad MAGIC or ARCH\n", aufile[idx]); - return -1; - } - /* check the hdr CRC */ - if (!image_check_hcrc (hdr)) { - printf ("Image %s bad header checksum\n", aufile[idx]); - return -1; - } - /* check the type - could do this all in one gigantic if() */ - if ((idx == IDX_FIRMWARE) && - !image_check_type (hdr, IH_TYPE_FIRMWARE)) { - printf ("Image %s wrong type\n", aufile[idx]); - return -1; - } - if ((idx == IDX_KERNEL) && !image_check_type (hdr, IH_TYPE_KERNEL)) { - printf ("Image %s wrong type\n", aufile[idx]); - return -1; - } - if ((idx == IDX_DISK) && !image_check_type (hdr, IH_TYPE_FILESYSTEM)) { - printf ("Image %s wrong type\n", aufile[idx]); - return -1; - } - if ((idx == IDX_APP) && !image_check_type (hdr, IH_TYPE_RAMDISK) - && !image_check_type (hdr, IH_TYPE_FILESYSTEM)) { - printf ("Image %s wrong type\n", aufile[idx]); - return -1; - } - if ((idx == IDX_PREPARE || idx == IDX_PREINST || idx == IDX_POSTINST) - && !image_check_type (hdr, IH_TYPE_SCRIPT)) { - printf ("Image %s wrong type\n", aufile[idx]); - return -1; - } - /* special case for prepare.img */ - if (idx == IDX_PREPARE) - return 0; - /* recycle checksum */ - checksum = image_get_data_size (hdr); - /* for kernel and app the image header must also fit into flash */ - if ((idx != IDX_DISK) && (idx != IDX_FIRMWARE)) - checksum += image_get_header_size (); - /* check the size does not exceed space in flash. HUSH scripts */ - /* all have ausize[] set to 0 */ - if ((ausize[idx] != 0) && (ausize[idx] < checksum)) { - printf ("Image %s is bigger than FLASH\n", aufile[idx]); - return -1; - } - /* check the time stamp from the EEPROM */ - /* read it in */ - i2c_read_multiple(0x54, auee_off[idx].time, 1, buf, sizeof(buf)); -#ifdef CHECK_VALID_DEBUG - printf ("buf[0] %#x buf[1] %#x buf[2] %#x buf[3] %#x " - "as int %#x time %#x\n", - buf[0], buf[1], buf[2], buf[3], - *((unsigned int *)buf), image_get_time (hdr)); -#endif - /* check it */ - if (*((unsigned int *)buf) >= image_get_time (hdr)) { - printf ("Image %s is too old\n", aufile[idx]); - return -1; - } - - return 0; -} - -/* power control defines */ -#define CPLD_VFD_BK ((volatile char *)0x04038002) -#define POWER_OFF (1 << 1) - -int -au_do_update(int idx, long sz) -{ - image_header_t *hdr; - char *addr; - long start, end; - int off, rc; - uint nbytes; - - hdr = (image_header_t *)LOAD_ADDR; -#if defined(CONFIG_FIT) - if (genimg_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { - puts ("Non legacy image format not supported\n"); - return -1; - } -#endif - - /* disable the power switch */ - *CPLD_VFD_BK |= POWER_OFF; - - /* execute a script */ - if (image_check_type (hdr, IH_TYPE_SCRIPT)) { - addr = (char *)((char *)hdr + image_get_header_size ()); - /* stick a NULL at the end of the script, otherwise */ - /* parse_string_outer() runs off the end. */ - addr[image_get_data_size (hdr)] = 0; - addr += 8; - parse_string_outer(addr, FLAG_PARSE_SEMICOLON); - return 0; - } - - start = aufl_layout[FIDX_TO_LIDX(idx)].start; - end = aufl_layout[FIDX_TO_LIDX(idx)].end; - - /* unprotect the address range */ - /* this assumes that ONLY the firmware is protected! */ - if (idx == IDX_FIRMWARE) { -#undef AU_UPDATE_TEST -#ifdef AU_UPDATE_TEST - /* erase it where Linux goes */ - start = aufl_layout[1].start; - end = aufl_layout[1].end; -#endif - flash_sect_protect(0, start, end); - } - - /* - * erase the address range. - */ - debug ("flash_sect_erase(%lx, %lx);\n", start, end); - flash_sect_erase(start, end); - wait_ms(100); - /* strip the header - except for the kernel and ramdisk */ - if (image_check_type (hdr, IH_TYPE_KERNEL) || - image_check_type (hdr, IH_TYPE_RAMDISK)) { - addr = (char *)hdr; - off = image_get_header_size (); - nbytes = image_get_image_size (hdr); - } else { - addr = (char *)((char *)hdr + image_get_header_size ()); -#ifdef AU_UPDATE_TEST - /* copy it to where Linux goes */ - if (idx == IDX_FIRMWARE) - start = aufl_layout[1].start; -#endif - off = 0; - nbytes = image_get_data_size (hdr); - } - - /* copy the data from RAM to FLASH */ - debug ("flash_write(%p, %lx %x)\n", addr, start, nbytes); - rc = flash_write(addr, start, nbytes); - if (rc != 0) { - printf("Flashing failed due to error %d\n", rc); - return -1; - } - - /* check the dcrc of the copy */ - if (crc32 (0, (uchar *)(start + off), image_get_data_size (hdr)) != - image_get_dcrc (hdr)) { - printf ("Image %s Bad Data Checksum After COPY\n", aufile[idx]); - return -1; - } - - /* protect the address range */ - /* this assumes that ONLY the firmware is protected! */ - if (idx == IDX_FIRMWARE) - flash_sect_protect(1, start, end); - return 0; -} - -int -au_update_eeprom(int idx) -{ - image_header_t *hdr; - int off; - uint32_t val; - - /* special case for prepare.img */ - if (idx == IDX_PREPARE) { - /* enable the power switch */ - *CPLD_VFD_BK &= ~POWER_OFF; - return 0; - } - - hdr = (image_header_t *)LOAD_ADDR; -#if defined(CONFIG_FIT) - if (genimg_get_format ((void *)hdr) != IMAGE_FORMAT_LEGACY) { - puts ("Non legacy image format not supported\n"); - return -1; - } -#endif - - /* write the time field into EEPROM */ - off = auee_off[idx].time; - val = image_get_time (hdr); - i2c_write_multiple(0x54, off, 1, &val, sizeof(val)); - /* write the size field into EEPROM */ - off = auee_off[idx].size; - val = image_get_data_size (hdr); - i2c_write_multiple(0x54, off, 1, &val, sizeof(val)); - /* write the dcrc field into EEPROM */ - off = auee_off[idx].dcrc; - val = image_get_dcrc (hdr); - i2c_write_multiple(0x54, off, 1, &val, sizeof(val)); - /* enable the power switch */ - *CPLD_VFD_BK &= ~POWER_OFF; - return 0; -} - -/* - * this is called from board_init() after the hardware has been set up - * and is usable. That seems like a good time to do this. - * Right now the return value is ignored. - */ -int -do_auto_update(void) -{ - block_dev_desc_t *stor_dev; - long sz; - int i, res = 0, bitmap_first, cnt, old_ctrlc, got_ctrlc; - char *env; - long start, end; - -#undef ERASE_EEPROM -#ifdef ERASE_EEPROM - int arr[18]; - memset(arr, 0, sizeof(arr)); - i2c_write_multiple(0x54, 64, 1, arr, sizeof(arr)); -#endif - au_usb_stor_curr_dev = -1; - /* start USB */ - if (usb_stop() < 0) { - debug ("usb_stop failed\n"); - return -1; - } - if (usb_init() < 0) { - debug ("usb_init failed\n"); - return -1; - } - /* - * check whether a storage device is attached (assume that it's - * a USB memory stick, since nothing else should be attached). - */ - au_usb_stor_curr_dev = usb_stor_scan(0); - if (au_usb_stor_curr_dev == -1) { - debug ("No device found. Not initialized?\n"); - res = -1; - goto xit; - } - /* check whether it has a partition table */ - stor_dev = get_dev("usb", 0); - if (stor_dev == NULL) { - debug ("uknown device type\n"); - res = -1; - goto xit; - } - if (fat_register_device(stor_dev, 1) != 0) { - debug ("Unable to use USB %d:%d for fatls\n", - au_usb_stor_curr_dev, 1); - res = -1; - goto xit; - } - if (file_fat_detectfs() != 0) { - debug ("file_fat_detectfs failed\n"); - } - - /* initialize the array of file names */ - memset(aufile, 0, sizeof(aufile)); - aufile[IDX_PREPARE] = AU_PREPARE; - aufile[IDX_PREINST] = AU_PREINST; - aufile[IDX_FIRMWARE] = AU_FIRMWARE; - aufile[IDX_KERNEL] = AU_KERNEL; - aufile[IDX_APP] = AU_APP; - aufile[IDX_DISK] = AU_DISK; - aufile[IDX_POSTINST] = AU_POSTINST; - /* initialize the array of flash sizes */ - memset(ausize, 0, sizeof(ausize)); - ausize[IDX_FIRMWARE] = (AU_FL_FIRMWARE_ND + 1) - AU_FL_FIRMWARE_ST; - ausize[IDX_KERNEL] = (AU_FL_KERNEL_ND + 1) - AU_FL_KERNEL_ST; - ausize[IDX_APP] = (AU_FL_APP_ND + 1) - AU_FL_APP_ST; - ausize[IDX_DISK] = (AU_FL_DISK_ND + 1) - AU_FL_DISK_ST; - /* - * now check whether start and end are defined using environment - * variables. - */ - start = -1; - end = 0; - env = getenv("firmware_st"); - if (env != NULL) - start = simple_strtoul(env, NULL, 16); - env = getenv("firmware_nd"); - if (env != NULL) - end = simple_strtoul(env, NULL, 16); - if (start >= 0 && end && end > start) { - ausize[IDX_FIRMWARE] = (end + 1) - start; - aufl_layout[0].start = start; - aufl_layout[0].end = end; - } - start = -1; - end = 0; - env = getenv("kernel_st"); - if (env != NULL) - start = simple_strtoul(env, NULL, 16); - env = getenv("kernel_nd"); - if (env != NULL) - end = simple_strtoul(env, NULL, 16); - if (start >= 0 && end && end > start) { - ausize[IDX_KERNEL] = (end + 1) - start; - aufl_layout[1].start = start; - aufl_layout[1].end = end; - } - start = -1; - end = 0; - env = getenv("app_st"); - if (env != NULL) - start = simple_strtoul(env, NULL, 16); - env = getenv("app_nd"); - if (env != NULL) - end = simple_strtoul(env, NULL, 16); - if (start >= 0 && end && end > start) { - ausize[IDX_APP] = (end + 1) - start; - aufl_layout[2].start = start; - aufl_layout[2].end = end; - } - start = -1; - end = 0; - env = getenv("disk_st"); - if (env != NULL) - start = simple_strtoul(env, NULL, 16); - env = getenv("disk_nd"); - if (env != NULL) - end = simple_strtoul(env, NULL, 16); - if (start >= 0 && end && end > start) { - ausize[IDX_DISK] = (end + 1) - start; - aufl_layout[3].start = start; - aufl_layout[3].end = end; - } - /* make certain that HUSH is runnable */ - u_boot_hush_start(); - /* make sure that we see CTRL-C and save the old state */ - old_ctrlc = disable_ctrlc(0); - - bitmap_first = 0; - /* just loop thru all the possible files */ - for (i = 0; i < AU_MAXFILES; i++) { - /* just read the header */ - sz = file_fat_read(aufile[i], LOAD_ADDR, image_get_header_size ()); - debug ("read %s sz %ld hdr %d\n", - aufile[i], sz, image_get_header_size ()); - if (sz <= 0 || sz < image_get_header_size ()) { - debug ("%s not found\n", aufile[i]); - continue; - } - if (au_check_header_valid(i, sz) < 0) { - debug ("%s header not valid\n", aufile[i]); - continue; - } - sz = file_fat_read(aufile[i], LOAD_ADDR, MAX_LOADSZ); - debug ("read %s sz %ld hdr %d\n", - aufile[i], sz, image_get_header_size ()); - if (sz <= 0 || sz <= image_get_header_size ()) { - debug ("%s not found\n", aufile[i]); - continue; - } - if (au_check_cksum_valid(i, sz) < 0) { - debug ("%s checksum not valid\n", aufile[i]); - continue; - } -#ifdef CONFIG_VFD - /* now that we have a valid file we can display the */ - /* bitmap. */ - if (bitmap_first == 0) { - env = getenv("bitmap2"); - if (env == NULL) { - trab_vfd(0); - } else { - /* not so simple - bitmap2 is supposed to */ - /* contain the address of the bitmap */ - env = (char *)simple_strtoul(env, NULL, 16); -/* NOTE: these are taken from vfd_logo.h. If that file changes then */ -/* these defines MUST also be updated! These may be wrong for bitmap2. */ -#define VFD_LOGO_WIDTH 112 -#define VFD_LOGO_HEIGHT 72 - /* must call transfer_pic directly */ - transfer_pic(3, (unsigned char *)env, - VFD_LOGO_HEIGHT, VFD_LOGO_WIDTH); - } - bitmap_first = 1; - } -#endif - /* this is really not a good idea, but it's what the */ - /* customer wants. */ - cnt = 0; - got_ctrlc = 0; - do { - res = au_do_update(i, sz); - /* let the user break out of the loop */ - if (ctrlc() || had_ctrlc()) { - clear_ctrlc(); - if (res < 0) - got_ctrlc = 1; - break; - } - cnt++; -#ifdef AU_TEST_ONLY - } while (res < 0 && cnt < 3); - if (cnt < 3) -#else - } while (res < 0); -#endif - /* - * it doesn't make sense to update the EEPROM if the - * update was interrupted by the user due to errors. - */ - if (got_ctrlc == 0) - au_update_eeprom(i); - else - /* enable the power switch */ - *CPLD_VFD_BK &= ~POWER_OFF; - } - /* restore the old state */ - disable_ctrlc(old_ctrlc); -xit: - usb_stop(); - return res; -} -#endif /* CONFIG_AUTO_UPDATE */ diff --git a/board/trab/cmd_trab.c b/board/trab/cmd_trab.c deleted file mode 100644 index dec3c61827..0000000000 --- a/board/trab/cmd_trab.c +++ /dev/null @@ -1,879 +0,0 @@ -/* - * (C) Copyright 2003 - * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#undef DEBUG - -#include <common.h> -#include <command.h> -#include <asm/arch/s3c24x0_cpu.h> -#include <rtc.h> - -/* - * TRAB board specific commands. Especially commands for burn-in and function - * test. - */ -#if defined(CONFIG_CMD_BSP) - -/* limits for valid range of VCC5V in mV */ -#define VCC5V_MIN 4500 -#define VCC5V_MAX 5500 - -/* - * Test strings for EEPROM test. Length of string 2 must not exceed length of - * string 1. Otherwise a buffer overrun could occur! - */ -#define EEPROM_TEST_STRING_1 "0987654321 :tset a si siht" -#define EEPROM_TEST_STRING_2 "this is a test: 1234567890" - -/* - * min/max limits for valid contact temperature during burn in test (in - * degree Centigrade * 100) - */ -#define MIN_CONTACT_TEMP -1000 -#define MAX_CONTACT_TEMP +9000 - -/* blinking frequency of status LED */ -#define LED_BLINK_FREQ 5 - -/* delay time between burn in cycles in seconds */ -#ifndef BURN_IN_CYCLE_DELAY /* if not defined in include/configs/trab.h */ -#define BURN_IN_CYCLE_DELAY 5 -#endif - -/* physical SRAM parameters */ -#define SRAM_ADDR 0x02000000 /* GCS1 */ -#define SRAM_SIZE 0x40000 /* 256 kByte */ - -/* CPLD-Register for controlling TRAB hardware functions */ -#define CPLD_BUTTONS ((volatile unsigned long *)0x04020000) -#define CPLD_FILL_LEVEL ((volatile unsigned long *)0x04008000) -#define CPLD_ROTARY_SWITCH ((volatile unsigned long *)0x04018000) -#define CPLD_RS485_RE ((volatile unsigned long *)0x04028000) - -/* I2C EEPROM device address */ -#define I2C_EEPROM_DEV_ADDR 0x54 - -/* EEPROM address map */ -#define EE_ADDR_TEST 192 -#define EE_ADDR_MAX_CYCLES 256 -#define EE_ADDR_STATUS 258 -#define EE_ADDR_PASS_CYCLES 259 -#define EE_ADDR_FIRST_ERROR_CYCLE 261 -#define EE_ADDR_FIRST_ERROR_NUM 263 -#define EE_ADDR_FIRST_ERROR_NAME 264 -#define EE_ADDR_ACT_CYCLE 280 - -/* Bit definitions for ADCCON */ -#define ADC_ENABLE_START 0x1 -#define ADC_READ_START 0x2 -#define ADC_STDBM 0x4 -#define ADC_INP_AIN0 (0x0 << 3) -#define ADC_INP_AIN1 (0x1 << 3) -#define ADC_INP_AIN2 (0x2 << 3) -#define ADC_INP_AIN3 (0x3 << 3) -#define ADC_INP_AIN4 (0x4 << 3) -#define ADC_INP_AIN5 (0x5 << 3) -#define ADC_INP_AIN6 (0x6 << 3) -#define ADC_INP_AIN7 (0x7 << 3) -#define ADC_PRSCEN 0x4000 -#define ADC_ECFLG 0x800 - -/* misc */ - -/* externals */ -extern int memory_post_tests (unsigned long start, unsigned long size); -extern int i2c_write (uchar, uint, int , uchar* , int); -extern int i2c_read (uchar, uint, int , uchar* , int); -extern void tsc2000_reg_init (void); -extern s32 tsc2000_contact_temp (void); -extern void tsc2000_spi_init(void); - -/* function declarations */ -int do_dip (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int do_vcc5v (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int do_burn_in (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int do_contact_temp (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int do_burn_in_status (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); -int i2c_write_multiple (uchar chip, uint addr, int alen, - uchar *buffer, int len); -int i2c_read_multiple (uchar chip, uint addr, int alen, - uchar *buffer, int len); -int do_temp_log (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); - -/* helper functions */ -static void adc_init (void); -static int adc_read (unsigned int channel); -static int read_dip (void); -static int read_vcc5v (void); -static int test_dip (void); -static int test_vcc5v (void); -static int test_rotary_switch (void); -static int test_sram (void); -static int test_eeprom (void); -static int test_contact_temp (void); -static void led_set (unsigned int); -static void led_blink (void); -static void led_init (void); -static void sdelay (unsigned long seconds); /* delay in seconds */ -static int dummy (void); -static int read_max_cycles(void); -static void test_function_table_init (void); -static void global_vars_init (void); -static int global_vars_write_to_eeprom (void); - -/* globals */ -u16 max_cycles; -u8 status; -u16 pass_cycles; -u16 first_error_cycle; -u8 first_error_num; -char first_error_name[16]; -u16 act_cycle; - -typedef struct test_function_s { - char *name; - int (*pf)(void); -} test_function_t; - -/* max number of Burn In Functions */ -#define BIF_MAX 6 - -/* table with burn in functions */ -test_function_t test_function[BIF_MAX]; - - -int do_burn_in (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int i; - int cycle_status; - - if (argc > 1) - return cmd_usage(cmdtp); - - led_init (); - global_vars_init (); - test_function_table_init (); - tsc2000_spi_init (); - - if (global_vars_write_to_eeprom () != 0) { - printf ("%s: error writing global_vars to eeprom\n", - __FUNCTION__); - return (1); - } - - if (read_max_cycles () != 0) { - printf ("%s: error reading max_cycles from eeprom\n", - __FUNCTION__); - return (1); - } - - if (max_cycles == 0) { - printf ("%s: error, burn in max_cycles = 0\n", __FUNCTION__); - return (1); - } - - status = 0; - for (act_cycle = 1; act_cycle <= max_cycles; act_cycle++) { - - cycle_status = 0; - - /* - * avoid timestamp overflow problem after about 68 minutes of - * udelay() time. - */ - reset_timer_masked (); - for (i = 0; i < BIF_MAX; i++) { - - /* call test function */ - if ((*test_function[i].pf)() != 0) { - printf ("error in %s test\n", - test_function[i].name); - - /* is it the first error? */ - if (status == 0) { - status = 1; - first_error_cycle = act_cycle; - - /* do not use error_num 0 */ - first_error_num = i+1; - strncpy (first_error_name, - test_function[i].name, - sizeof (first_error_name)); - led_set (0); - } - cycle_status = 1; - } - } - /* were all tests of actual cycle OK? */ - if (cycle_status == 0) - pass_cycles++; - - /* set status LED if no error is occoured since yet */ - if (status == 0) - led_set (1); - - printf ("%s: cycle %d finished\n", __FUNCTION__, act_cycle); - - /* pause between cycles */ - sdelay (BURN_IN_CYCLE_DELAY); - } - - if (global_vars_write_to_eeprom () != 0) { - led_set (0); - printf ("%s: error writing global_vars to eeprom\n", - __FUNCTION__); - status = 1; - } - - if (status == 0) { - led_blink (); /* endless loop!! */ - return (0); - } else { - led_set (0); - return (1); - } -} - -U_BOOT_CMD( - burn_in, 1, 1, do_burn_in, - "start burn-in test application on TRAB", - "\n" - " - start burn-in test application\n" - " The burn-in test could took a while to finish!\n" - " The content of the onboard EEPROM is modified!" -); - - -int do_dip (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int i, dip; - - if (argc > 1) - return cmd_usage(cmdtp); - - if ((dip = read_dip ()) == -1) - return 1; - - for (i = 0; i < 4; i++) { - if ((dip & (1 << i)) == 0) - printf("0"); - else - printf("1"); - } - printf("\n"); - - return 0; -} - -U_BOOT_CMD( - dip, 1, 1, do_dip, - "read dip switch on TRAB", - "\n" - " - read state of dip switch (S1) on TRAB board\n" - " read sequence: 1-2-3-4; ON=1; OFF=0; e.g.: \"0100\"" -); - - -int do_vcc5v (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int vcc5v; - - if (argc > 1) - return cmd_usage(cmdtp); - - if ((vcc5v = read_vcc5v ()) == -1) - return (1); - - printf ("%d", (vcc5v / 1000)); - printf (".%d", (vcc5v % 1000) / 100); - printf ("%d V\n", (vcc5v % 100) / 10) ; - - return 0; -} - -U_BOOT_CMD( - vcc5v, 1, 1, do_vcc5v, - "read VCC5V on TRAB", - "\n" - " - read actual value of voltage VCC5V" -); - - -int do_contact_temp (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int contact_temp; - - if (argc > 1) - return cmd_usage(cmdtp); - - tsc2000_spi_init (); - - contact_temp = tsc2000_contact_temp(); - printf ("%d degree C * 100\n", contact_temp) ; - - return 0; -} - -U_BOOT_CMD( - c_temp, 1, 1, do_contact_temp, - "read contact temperature on TRAB", - "" - " - reads the onboard temperature (=contact temperature)\n" -); - - -int do_burn_in_status (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - if (argc > 1) - return cmd_usage(cmdtp); - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_STATUS, 1, - (unsigned char*) &status, 1)) - return (1); - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_PASS_CYCLES, 1, - (unsigned char*) &pass_cycles, 2)) - return (1); - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_CYCLE, - 1, (unsigned char*) &first_error_cycle, 2)) - return (1); - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NUM, - 1, (unsigned char*) &first_error_num, 1)) - return (1); - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NAME, - 1, (unsigned char*)first_error_name, - sizeof (first_error_name))) - return (1); - - if (read_max_cycles () != 0) - return (1); - - printf ("max_cycles = %d\n", max_cycles); - printf ("status = %d\n", status); - printf ("pass_cycles = %d\n", pass_cycles); - printf ("first_error_cycle = %d\n", first_error_cycle); - printf ("first_error_num = %d\n", first_error_num); - printf ("first_error_name = %.*s\n",(int) sizeof(first_error_name), - first_error_name); - - return 0; -} - -U_BOOT_CMD( - bis, 1, 1, do_burn_in_status, - "print burn in status on TRAB", - "\n" - " - prints the status variables of the last burn in test\n" - " stored in the onboard EEPROM on TRAB board" -); - -static int read_dip (void) -{ - unsigned int result = 0; - int adc_val; - int i; - - /*********************************************************** - DIP switch connection (according to wa4-cpu.sp.301.pdf, page 3): - SW1 - AIN4 - SW2 - AIN5 - SW3 - AIN6 - SW4 - AIN7 - - "On" DIP switch position short-circuits the voltage from - the input channel (i.e. '0' conversion result means "on"). - *************************************************************/ - - for (i = 7; i > 3; i--) { - - if ((adc_val = adc_read (i)) == -1) { - printf ("%s: Channel %d could not be read\n", - __FUNCTION__, i); - return (-1); - } - - /* - * Input voltage (switch open) is 1.8 V. - * (Vin_High/VRef)*adc_res = (1,8V/2,5V)*1023) = 736 - * Set trigger at halve that value. - */ - if (adc_val < 368) - result |= (1 << (i-4)); - } - return (result); -} - - -static int read_vcc5v (void) -{ - s32 result; - - /* VCC5V is connected to channel 2 */ - - if ((result = adc_read (2)) == -1) { - printf ("%s: VCC5V could not be read\n", __FUNCTION__); - return (-1); - } - /* - * Calculate voltage value. Split in two parts because there is no - * floating point support. VCC5V is connected over an resistor divider: - * VCC5V=ADCval*2,5V/1023*(10K+30K)/10K. - */ - result = result * 10 * 1000 / 1023; /* result in mV */ - - return (result); -} - - -static int test_dip (void) -{ - static int first_run = 1; - static int first_dip; - - if (first_run) { - if ((first_dip = read_dip ()) == -1) { - return (1); - } - first_run = 0; - debug ("%s: first_dip=%d\n", __FUNCTION__, first_dip); - } - if (first_dip != read_dip ()) { - return (1); - } else { - return (0); - } -} - - -static int test_vcc5v (void) -{ - int vcc5v; - - if ((vcc5v = read_vcc5v ()) == -1) { - return (1); - } - - if ((vcc5v > VCC5V_MAX) || (vcc5v < VCC5V_MIN)) { - printf ("%s: vcc5v[V/100]=%d\n", __FUNCTION__, vcc5v); - return (1); - } else { - return (0); - } -} - - -static int test_rotary_switch (void) -{ - static int first_run = 1; - static int first_rs; - - if (first_run) { - /* - * clear bits in CPLD, because they have random values after - * power-up or reset. - */ - *CPLD_ROTARY_SWITCH |= (1 << 16) | (1 << 17); - - first_rs = ((*CPLD_ROTARY_SWITCH >> 16) & 0x7); - first_run = 0; - debug ("%s: first_rs=%d\n", __FUNCTION__, first_rs); - } - - if (first_rs != ((*CPLD_ROTARY_SWITCH >> 16) & 0x7)) { - return (1); - } else { - return (0); - } -} - - -static int test_sram (void) -{ - return (memory_post_tests (SRAM_ADDR, SRAM_SIZE)); -} - - -static int test_eeprom (void) -{ - unsigned char temp[sizeof (EEPROM_TEST_STRING_1)]; - int result = 0; - - /* write test string 1, read back and verify */ - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1, - (unsigned char*)EEPROM_TEST_STRING_1, - sizeof (EEPROM_TEST_STRING_1))) { - return (1); - } - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1, - temp, sizeof (EEPROM_TEST_STRING_1))) { - return (1); - } - - if (strcmp ((char *)temp, EEPROM_TEST_STRING_1) != 0) { - result = 1; - printf ("%s: error; read_str = \"%s\"\n", __FUNCTION__, temp); - } - - /* write test string 2, read back and verify */ - if (result == 0) { - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1, - (unsigned char*)EEPROM_TEST_STRING_2, - sizeof (EEPROM_TEST_STRING_2))) { - return (1); - } - - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_TEST, 1, - temp, sizeof (EEPROM_TEST_STRING_2))) { - return (1); - } - - if (strcmp ((char *)temp, EEPROM_TEST_STRING_2) != 0) { - result = 1; - printf ("%s: error; read str = \"%s\"\n", - __FUNCTION__, temp); - } - } - return (result); -} - - -static int test_contact_temp (void) -{ - int contact_temp; - - contact_temp = tsc2000_contact_temp (); - - if ((contact_temp < MIN_CONTACT_TEMP) - || (contact_temp > MAX_CONTACT_TEMP)) - return (1); - else - return (0); -} - - -int i2c_write_multiple (uchar chip, uint addr, int alen, - uchar *buffer, int len) -{ - int i; - - if (alen != 1) { - printf ("%s: addr len other than 1 not supported\n", - __FUNCTION__); - return (1); - } - - for (i = 0; i < len; i++) { - if (i2c_write (chip, addr+i, alen, buffer+i, 1)) { - printf ("%s: could not write to i2c device %d" - ", addr %d\n", __FUNCTION__, chip, addr); - return (1); - } -#if 0 - printf ("chip=%#x, addr+i=%#x+%d=%p, alen=%d, *buffer+i=" - "%#x+%d=%p=\"%.1s\"\n", chip, addr, i, addr+i, - alen, buffer, i, buffer+i, buffer+i); -#endif - - udelay (30000); - } - return (0); -} - - -int i2c_read_multiple ( uchar chip, uint addr, int alen, - uchar *buffer, int len) -{ - int i; - - if (alen != 1) { - printf ("%s: addr len other than 1 not supported\n", - __FUNCTION__); - return (1); - } - - for (i = 0; i < len; i++) { - if (i2c_read (chip, addr+i, alen, buffer+i, 1)) { - printf ("%s: could not read from i2c device %#x" - ", addr %d\n", __FUNCTION__, chip, addr); - return (1); - } - } - return (0); -} - - -static int adc_read (unsigned int channel) -{ - int j = 1000; /* timeout value for wait loop in us */ - int result; - struct s3c2400_adc *padc; - - padc = s3c2400_get_base_adc(); - channel &= 0x7; - - adc_init (); - - padc->adccon &= ~ADC_STDBM; /* select normal mode */ - padc->adccon &= ~(0x7 << 3); /* clear the channel bits */ - padc->adccon |= ((channel << 3) | ADC_ENABLE_START); - - while (j--) { - if ((padc->adccon & ADC_ENABLE_START) == 0) - break; - udelay (1); - } - - if (j == 0) { - printf("%s: ADC timeout\n", __FUNCTION__); - padc->adccon |= ADC_STDBM; /* select standby mode */ - return -1; - } - - result = padc->adcdat & 0x3FF; - - padc->adccon |= ADC_STDBM; /* select standby mode */ - - debug ("%s: channel %d, result[DIGIT]=%d\n", __FUNCTION__, - (padc->adccon >> 3) & 0x7, result); - - /* - * Wait for ADC to be ready for next conversion. This delay value was - * estimated, because the datasheet does not specify a value. - */ - udelay (1000); - - return (result); -} - - -static void adc_init (void) -{ - struct s3c2400_adc *padc; - - padc = s3c2400_get_base_adc(); - - padc->adccon &= ~(0xff << 6); /* clear prescaler bits */ - padc->adccon |= ((65 << 6) | ADC_PRSCEN); /* set prescaler */ - - /* - * Wait some time to avoid problem with very first call of - * adc_read(). Without this delay, sometimes the first read - * adc value is 0. Perhaps because the adjustment of prescaler - * takes some clock cycles? - */ - udelay (1000); - - return; -} - - -static void led_set (unsigned int state) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - led_init (); - - switch (state) { - case 0: /* turn LED off */ - gpio->padat |= (1 << 12); - break; - case 1: /* turn LED on */ - gpio->padat &= ~(1 << 12); - break; - default: - break; - } -} - -static void led_blink (void) -{ - led_init (); - - /* blink LED. This function does not return! */ - while (1) { - reset_timer_masked (); - led_set (1); - udelay (1000000 / LED_BLINK_FREQ / 2); - led_set (0); - udelay (1000000 / LED_BLINK_FREQ / 2); - } -} - - -static void led_init (void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* configure GPA12 as output and set to High -> LED off */ - gpio->pacon &= ~(1 << 12); - gpio->padat |= (1 << 12); -} - - -static void sdelay (unsigned long seconds) -{ - unsigned long i; - - for (i = 0; i < seconds; i++) { - udelay (1000000); - } -} - - -static int global_vars_write_to_eeprom (void) -{ - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_STATUS, 1, - (unsigned char*) &status, 1)) { - return (1); - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_PASS_CYCLES, 1, - (unsigned char*) &pass_cycles, 2)) { - return (1); - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_CYCLE, - 1, (unsigned char*) &first_error_cycle, 2)) { - return (1); - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NUM, - 1, (unsigned char*) &first_error_num, 1)) { - return (1); - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_FIRST_ERROR_NAME, - 1, (unsigned char*) first_error_name, - sizeof(first_error_name))) { - return (1); - } - return (0); -} - -static void global_vars_init (void) -{ - status = 1; /* error */ - pass_cycles = 0; - first_error_cycle = 0; - first_error_num = 0; - first_error_name[0] = '\0'; - act_cycle = 0; - max_cycles = 0; -} - - -static void test_function_table_init (void) -{ - int i; - - for (i = 0; i < BIF_MAX; i++) - test_function[i].pf = dummy; - - /* - * the length of "name" must not exceed 16, including the '\0' - * termination. See also the EEPROM address map. - */ - test_function[0].pf = test_dip; - test_function[0].name = "dip"; - - test_function[1].pf = test_vcc5v; - test_function[1].name = "vcc5v"; - - test_function[2].pf = test_rotary_switch; - test_function[2].name = "rotary_switch"; - - test_function[3].pf = test_sram; - test_function[3].name = "sram"; - - test_function[4].pf = test_eeprom; - test_function[4].name = "eeprom"; - - test_function[5].pf = test_contact_temp; - test_function[5].name = "contact_temp"; -} - - -static int read_max_cycles (void) -{ - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, EE_ADDR_MAX_CYCLES, 1, - (unsigned char *) &max_cycles, 2) != 0) { - return (1); - } - - return (0); -} - -static int dummy(void) -{ - return (0); -} - -int do_temp_log (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) -{ - int contact_temp; - int delay = 0; -#if defined(CONFIG_CMD_DATE) - struct rtc_time tm; -#endif - - if (argc > 2) - return cmd_usage(cmdtp); - - if (argc > 1) - delay = simple_strtoul(argv[1], NULL, 10); - - tsc2000_spi_init (); - while (1) { - -#if defined(CONFIG_CMD_DATE) - rtc_get (&tm); - printf ("%4d-%02d-%02d %2d:%02d:%02d - ", - tm.tm_year, tm.tm_mon, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); -#endif - - contact_temp = tsc2000_contact_temp(); - printf ("%d\n", contact_temp) ; - - if (delay != 0) - /* - * reset timer to avoid timestamp overflow problem - * after about 68 minutes of udelay() time. - */ - reset_timer_masked (); - sdelay (delay); - } - - return 0; -} - -U_BOOT_CMD( - tlog, 2, 1, do_temp_log, - "log contact temperature [1/100 C] to console (endlessly)", - "delay\n" - " - contact temperature [1/100 C] is printed endlessly to console\n" - " <delay> specifies the seconds to wait between two measurements\n" - " For each measurment a timestamp is printeted" -); - -#endif diff --git a/board/trab/config.mk b/board/trab/config.mk deleted file mode 100644 index 367f0b72a3..0000000000 --- a/board/trab/config.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -# (C) Copyright 2002 -# Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> -# -# TRAB board with S3C2400X (arm920t) cpu -# -# see http://www.samsung.com/ for more information on SAMSUNG -# - -# -# TRAB has 1 bank of 16 MB or 32 MB DRAM -# -# 0c00'0000 to 0e00'0000 -# -# Linux-Kernel is expected to be at 0c00'8000, entry 0c00'8000 -# -# we load ourself to 0CF0'0000 / 0DF0'0000 -# -# download areas is 0C80'0000 -# - -sinclude $(OBJTREE)/board/$(BOARDDIR)/config.tmp - -ifndef CONFIG_SYS_TEXT_BASE -CONFIG_SYS_TEXT_BASE = 0x0DF40000 -endif diff --git a/board/trab/flash.c b/board/trab/flash.c deleted file mode 100644 index 4e89c41027..0000000000 --- a/board/trab/flash.c +++ /dev/null @@ -1,569 +0,0 @@ -/* - * (C) Copyright 2002 - * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -/* #define DEBUG */ - -#include <common.h> -#include <environment.h> - -static ulong flash_get_size (vu_long *addr, flash_info_t *info); - -flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS]; - - -#define CMD_READ_ARRAY 0x00F000F0 -#define CMD_UNLOCK1 0x00AA00AA -#define CMD_UNLOCK2 0x00550055 -#define CMD_ERASE_SETUP 0x00800080 -#define CMD_ERASE_CONFIRM 0x00300030 -#define CMD_PROGRAM 0x00A000A0 -#define CMD_UNLOCK_BYPASS 0x00200020 -#define CMD_READ_MANF_ID 0x00900090 -#define CMD_UNLOCK_BYPASS_RES1 0x00900090 -#define CMD_UNLOCK_BYPASS_RES2 0x00000000 - -#define MEM_FLASH_ADDR (*(volatile u32 *)CONFIG_SYS_FLASH_BASE) -#define MEM_FLASH_ADDR1 (*(volatile u32 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 2))) -#define MEM_FLASH_ADDR2 (*(volatile u32 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 2))) - -#define BIT_ERASE_DONE 0x00800080 -#define BIT_RDY_MASK 0x00800080 -#define BIT_PROGRAM_ERROR 0x00200020 -#define BIT_TIMEOUT 0x80000000 /* our flag */ - -#define READY 1 -#define ERR 2 -#define TMO 4 - -/*----------------------------------------------------------------------- - */ - -ulong flash_init (void) -{ - int i, j; - ulong size = 0; - - for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; ++i) { - ulong flashbase = 0; - flash_info_t *info = &flash_info[i]; - - /* Init: no FLASHes known */ - info->flash_id = FLASH_UNKNOWN; - - size += flash_get_size (CONFIG_SYS_FLASH_BASE, info); - - if (i == 0) - flashbase = CONFIG_SYS_FLASH_BASE; - else - panic ("configured too many flash banks!\n"); - for (j = 0; j < info->sector_count; j++) { - - info->protect[j] = 0; - info->start[j] = flashbase; - - switch (info->flash_id & FLASH_TYPEMASK) { - case (FLASH_AM320B & FLASH_TYPEMASK): - case (FLASH_MXLV320B & FLASH_TYPEMASK): - /* Boot sector type: 8 x 8 + N x 128 kB */ - flashbase += (j < 8) ? 0x4000 : 0x20000; - break; - case (FLASH_AM640U & FLASH_TYPEMASK): - /* Uniform sector type: 128 kB */ - flashbase += 0x20000; - break; - default: - printf ("## Bad flash chip type 0x%04lX\n", - info->flash_id & FLASH_TYPEMASK); - } - } - } - - /* - * Protect monitor and environment sectors - */ - flash_protect ( FLAG_PROTECT_SET, - CONFIG_SYS_FLASH_BASE, - CONFIG_SYS_FLASH_BASE + monitor_flash_len - 1, - &flash_info[0]); - - flash_protect ( FLAG_PROTECT_SET, - CONFIG_ENV_ADDR, - CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1, &flash_info[0]); - -#ifdef CONFIG_ENV_ADDR_REDUND - flash_protect ( FLAG_PROTECT_SET, - CONFIG_ENV_ADDR_REDUND, - CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SECT_SIZE - 1, - &flash_info[0]); -#endif - - return size; -} - -/*----------------------------------------------------------------------- - */ -void flash_print_info (flash_info_t * info) -{ - int i; - - switch (info->flash_id & FLASH_VENDMASK) { - case (FLASH_MAN_AMD & FLASH_VENDMASK): - printf ("AMD "); break; - case (FLASH_MAN_FUJ & FLASH_VENDMASK): - printf ("FUJITSU "); break; - case (FLASH_MAN_MX & FLASH_VENDMASK): - printf ("MACRONIX "); break; - default: printf ("Unknown Vendor "); break; - } - - switch (info->flash_id & FLASH_TYPEMASK) { - case (FLASH_AM320B & FLASH_TYPEMASK): - printf ("2x Am29LV320DB (32Mbit)\n"); - break; - case (FLASH_MXLV320B & FLASH_TYPEMASK): - printf ("2x MX29LV320DB (32Mbit)\n"); - break; - case (FLASH_AM640U & FLASH_TYPEMASK): - printf ("2x Am29LV640D (64Mbit)\n"); - break; - default: - printf ("Unknown Chip Type\n"); - goto Done; - break; - } - - printf (" Size: %ld MB in %d Sectors\n", - info->size >> 20, info->sector_count); - - printf (" Sector Start Addresses:"); - for (i = 0; i < info->sector_count; i++) { - if ((i % 5) == 0) { - printf ("\n "); - } - printf (" %08lX%s", - info->start[i], - info->protect[i] ? " (RO)" : " "); - } - printf ("\n"); - -Done: ; -} - -/*----------------------------------------------------------------------- - */ - -int flash_erase (flash_info_t * info, int s_first, int s_last) -{ - ulong result; - -#if 0 - int cflag; -#endif - int iflag, prot, sect; - int rc = ERR_OK; - int chip1, chip2; - - debug ("flash_erase: s_first %d s_last %d\n", s_first, s_last); - - /* first look for protection bits */ - - if (info->flash_id == FLASH_UNKNOWN) - return ERR_UNKNOWN_FLASH_TYPE; - - if ((s_first < 0) || (s_first > s_last)) { - return ERR_INVAL; - } - - switch (info->flash_id & FLASH_VENDMASK) { - case (FLASH_MAN_AMD & FLASH_VENDMASK): break; /* OK */ - case (FLASH_MAN_FUJ & FLASH_VENDMASK): break; /* OK */ - case (FLASH_MAN_MX & FLASH_VENDMASK): break; /* OK */ - default: - debug ("## flash_erase: unknown manufacturer\n"); - return (ERR_UNKNOWN_FLASH_VENDOR); - } - - prot = 0; - for (sect = s_first; sect <= s_last; ++sect) { - if (info->protect[sect]) { - prot++; - } - } - - if (prot) { - printf ("- Warning: %d protected sectors will not be erased!\n", - prot); - } else { - printf ("\n"); - } - - /* - * Disable interrupts which might cause a timeout - * here. Remember that our exception vectors are - * at address 0 in the flash, and we don't want a - * (ticker) exception to happen while the flash - * chip is in programming mode. - */ -#if 0 - cflag = icache_status (); - icache_disable (); -#endif - iflag = disable_interrupts (); - - /* Start erase on unprotected sectors */ - for (sect = s_first; sect <= s_last && !ctrlc (); sect++) { - - debug ("Erasing sector %2d @ %08lX... ", - sect, info->start[sect]); - - /* arm simple, non interrupt dependent timer */ - reset_timer_masked (); - - if (info->protect[sect] == 0) { /* not protected */ - vu_long *addr = (vu_long *) (info->start[sect]); - - MEM_FLASH_ADDR1 = CMD_UNLOCK1; - MEM_FLASH_ADDR2 = CMD_UNLOCK2; - MEM_FLASH_ADDR1 = CMD_ERASE_SETUP; - - MEM_FLASH_ADDR1 = CMD_UNLOCK1; - MEM_FLASH_ADDR2 = CMD_UNLOCK2; - *addr = CMD_ERASE_CONFIRM; - - /* wait until flash is ready */ - chip1 = chip2 = 0; - - do { - result = *addr; - - /* check timeout */ - if (get_timer_masked () > CONFIG_SYS_FLASH_ERASE_TOUT) { - MEM_FLASH_ADDR1 = CMD_READ_ARRAY; - chip1 = TMO; - break; - } - - if (!chip1 && (result & 0xFFFF) & BIT_ERASE_DONE) - chip1 = READY; - - if (!chip1 && (result & 0xFFFF) & BIT_PROGRAM_ERROR) - chip1 = ERR; - - if (!chip2 && (result >> 16) & BIT_ERASE_DONE) - chip2 = READY; - - if (!chip2 && (result >> 16) & BIT_PROGRAM_ERROR) - chip2 = ERR; - - } while (!chip1 || !chip2); - - MEM_FLASH_ADDR1 = CMD_READ_ARRAY; - - if (chip1 == ERR || chip2 == ERR) { - rc = ERR_PROG_ERROR; - printf ("Flash erase error\n"); - goto outahere; - } - if (chip1 == TMO) { - rc = ERR_TIMOUT; - printf ("Flash erase timeout error\n"); - goto outahere; - } - } - } - -outahere: - /* allow flash to settle - wait 10 ms */ - udelay_masked (10000); - - if (iflag) - enable_interrupts (); - -#if 0 - if (cflag) - icache_enable (); -#endif - return rc; -} - -/*----------------------------------------------------------------------- - * Copy memory to flash - */ - -static int write_word (flash_info_t * info, ulong dest, ulong data) -{ - vu_long *addr = (vu_long *) dest; - ulong result; - int rc = ERR_OK; - -#if 0 - int cflag; -#endif - int iflag; - int chip1, chip2; - - /* - * Check if Flash is (sufficiently) erased - */ - result = *addr; - if ((result & data) != data) - return ERR_NOT_ERASED; - - /* - * Disable interrupts which might cause a timeout - * here. Remember that our exception vectors are - * at address 0 in the flash, and we don't want a - * (ticker) exception to happen while the flash - * chip is in programming mode. - */ -#if 0 - cflag = icache_status (); - icache_disable (); -#endif - iflag = disable_interrupts (); - - MEM_FLASH_ADDR1 = CMD_UNLOCK1; - MEM_FLASH_ADDR2 = CMD_UNLOCK2; - MEM_FLASH_ADDR1 = CMD_PROGRAM; - *addr = data; - - /* arm simple, non interrupt dependent timer */ - reset_timer_masked (); - - /* wait until flash is ready */ - chip1 = chip2 = 0; - do { - result = *addr; - - /* check timeout */ - if (get_timer_masked () > CONFIG_SYS_FLASH_WRITE_TOUT) { - chip1 = ERR | TMO; - break; - } - if (!chip1 && ((result & 0x80) == (data & 0x80))) - chip1 = READY; - - if (!chip1 && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) { - result = *addr; - - if ((result & 0x80) == (data & 0x80)) - chip1 = READY; - else - chip1 = ERR; - } - - if (!chip2 && ((result & (0x80 << 16)) == (data & (0x80 << 16)))) - chip2 = READY; - - if (!chip2 && ((result >> 16) & BIT_PROGRAM_ERROR)) { - result = *addr; - - if ((result & (0x80 << 16)) == (data & (0x80 << 16))) - chip2 = READY; - else - chip2 = ERR; - } - - } while (!chip1 || !chip2); - - *addr = CMD_READ_ARRAY; - - if (chip1 == ERR || chip2 == ERR || *addr != data) { - rc = ERR_PROG_ERROR; - printf ("Flash program error\n"); - debug ("chip1: %#x, chip2: %#x, addr: %#lx *addr: %#lx, " - "data: %#lx\n", - chip1, chip2, addr, *addr, data); - } - - if (iflag) - enable_interrupts (); - -#if 0 - if (cflag) - icache_enable (); -#endif - - return rc; -} - -/*----------------------------------------------------------------------- - * Copy memory to flash. - */ - -int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt) -{ - ulong cp, wp, data; - int l; - int i, rc; - - wp = (addr & ~3); /* get lower word aligned address */ - - /* - * handle unaligned start bytes - */ - if ((l = addr - wp) != 0) { - data = 0; - for (i = 0, cp = wp; i < l; ++i, ++cp) { - data = (data >> 8) | (*(uchar *) cp << 24); - } - for (; i < 4 && cnt > 0; ++i) { - data = (data >> 8) | (*src++ << 24); - --cnt; - ++cp; - } - for (; cnt == 0 && i < 4; ++i, ++cp) { - data = (data >> 8) | (*(uchar *) cp << 24); - } - - if ((rc = write_word (info, wp, data)) != 0) { - goto Done; - } - wp += 4; - } - - /* - * handle word aligned part - */ - while (cnt >= 4) { - if (((ulong)src) & 0x3) { - for (i = 0; i < 4; i++) { - ((char *)&data)[i] = ((vu_char *)src)[i]; - } - } - else { - data = *((vu_long *) src); - } - - if ((rc = write_word (info, wp, data)) != 0) { - goto Done; - } - src += 4; - wp += 4; - cnt -= 4; - } - - if (cnt == 0) { - rc = ERR_OK; - goto Done; - } - - /* - * handle unaligned tail bytes - */ - data = 0; - for (i = 0, cp = wp; i < 4 && cnt > 0; ++i, ++cp) { - data = (data >> 8) | (*src++ << 24); - --cnt; - } - for (; i < 4; ++i, ++cp) { - data = (data >> 8) | (*(uchar *) cp << 24); - } - - rc = write_word (info, wp, data); - - Done: - - return (rc); -} - -/*----------------------------------------------------------------------- - */ - -static ulong flash_get_size (vu_long *addr, flash_info_t *info) -{ - ulong value; - - /* Write auto select command sequence and read Manufacturer ID */ - addr[0x0555] = CMD_UNLOCK1; - addr[0x02AA] = CMD_UNLOCK2; - addr[0x0555] = CMD_READ_MANF_ID; - - value = addr[0]; - - debug ("Manuf. ID @ 0x%08lx: 0x%08lx\n", (ulong)addr, value); - - switch (value) { - case AMD_MANUFACT: - info->flash_id = FLASH_MAN_AMD; - break; - case FUJ_MANUFACT: - info->flash_id = FLASH_MAN_FUJ; - break; - case MX_MANUFACT: - info->flash_id = FLASH_MAN_MX; - break; - default: - info->flash_id = FLASH_UNKNOWN; - info->sector_count = 0; - info->size = 0; - addr[0] = CMD_READ_ARRAY; /* restore read mode */ - debug ("## flash_init: unknown manufacturer\n"); - return (0); /* no or unknown flash */ - } - - value = addr[1]; /* device ID */ - - debug ("Device ID @ 0x%08lx: 0x%08lx\n", (ulong)(&addr[1]), value); - - switch (value) { - case AMD_ID_LV320B: - info->flash_id += FLASH_AM320B; - info->sector_count = 71; - info->size = 0x00800000; - - addr[0] = CMD_READ_ARRAY; /* restore read mode */ - break; /* => 8 MB */ - - case AMD_ID_LV640U: - info->flash_id += FLASH_AM640U; - info->sector_count = 128; - info->size = 0x01000000; - - addr[0] = CMD_READ_ARRAY; /* restore read mode */ - break; /* => 16 MB */ - - case MX_ID_LV320B: - info->flash_id += FLASH_MXLV320B; - info->sector_count = 71; - info->size = 0x00800000; - - addr[0] = CMD_READ_ARRAY; /* restore read mode */ - break; /* => 8 MB */ - - default: - debug ("## flash_init: unknown flash chip\n"); - info->flash_id = FLASH_UNKNOWN; - addr[0] = CMD_READ_ARRAY; /* restore read mode */ - return (0); /* => no or unknown flash */ - - } - - if (info->sector_count > CONFIG_SYS_MAX_FLASH_SECT) { - printf ("** ERROR: sector count %d > max (%d) **\n", - info->sector_count, CONFIG_SYS_MAX_FLASH_SECT); - info->sector_count = CONFIG_SYS_MAX_FLASH_SECT; - } - - return (info->size); -} diff --git a/board/trab/lowlevel_init.S b/board/trab/lowlevel_init.S deleted file mode 100644 index 3cef41473b..0000000000 --- a/board/trab/lowlevel_init.S +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Memory Setup stuff - taken from blob memsetup.S - * - * Copyright (C) 1999 2000 2001 Erik Mouw (J.A.K.Mouw@its.tudelft.nl) and - * Jan-Derk Bakker (J.D.Bakker@its.tudelft.nl) - * - * Modified for the TRAB board by - * (C) Copyright 2002-2003 - * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - - -#include <config.h> -#include <version.h> - - -/* some parameters for the board */ - -/* - * - * Copied from linux/arch/arm/boot/compressed/head-s3c2400.S - * - * Copyright (C) 2001 Samsung Electronics by chc, 010406 - * - * TRAB specific tweaks. - * - */ - -/* memory controller */ -#define BWSCON 0x14000000 - -/* Bank0 */ -#define B0_Tacs 0x1 /* 1 clk */ -#define B0_Tcos 0x1 /* 1 clk */ -#define B0_Tacc 0x5 /* 8 clk */ -#define B0_Tcoh 0x1 /* 1 clk */ -#define B0_Tah 0x1 /* 1 clk */ -#define B0_Tacp 0x0 -#define B0_PMC 0x0 /* normal */ - -/* Bank1 - SRAM */ -#define B1_Tacs 0x1 /* 1 clk */ -#define B1_Tcos 0x1 /* 1 clk */ -#define B1_Tacc 0x5 /* 8 clk */ -#define B1_Tcoh 0x1 /* 1 clk */ -#define B1_Tah 0x1 /* 1 clk */ -#define B1_Tacp 0x0 -#define B1_PMC 0x0 /* normal */ - -/* Bank2 - CPLD */ -#define B2_Tacs 0x1 /* 1 clk */ -#define B2_Tcos 0x1 /* 1 clk */ -#define B2_Tacc 0x5 /* 8 clk */ -#define B2_Tcoh 0x1 /* 1 clk */ -#define B2_Tah 0x1 /* 1 clk */ -#define B2_Tacp 0x0 -#define B2_PMC 0x0 /* normal */ - -/* Bank3 - setup for the cs8900 */ -#define B3_Tacs 0x3 /* 4 clk */ -#define B3_Tcos 0x3 /* 4 clk */ -#define B3_Tacc 0x7 /* 14 clk */ -#define B3_Tcoh 0x1 /* 1 clk */ -#define B3_Tah 0x0 /* 0 clk */ -#define B3_Tacp 0x3 /* 6 clk */ -#define B3_PMC 0x0 /* normal */ - -/* Bank4 */ -#define B4_Tacs 0x0 /* 0 clk */ -#define B4_Tcos 0x0 /* 0 clk */ -#define B4_Tacc 0x7 /* 14 clk */ -#define B4_Tcoh 0x0 /* 0 clk */ -#define B4_Tah 0x0 /* 0 clk */ -#define B4_Tacp 0x0 -#define B4_PMC 0x0 /* normal */ - -/* Bank5 */ -#define B5_Tacs 0x0 /* 0 clk */ -#define B5_Tcos 0x0 /* 0 clk */ -#define B5_Tacc 0x7 /* 14 clk */ -#define B5_Tcoh 0x0 /* 0 clk */ -#define B5_Tah 0x0 /* 0 clk */ -#define B5_Tacp 0x0 -#define B5_PMC 0x0 /* normal */ - -#ifndef CONFIG_RAM_16MB /* 32 MB RAM */ -/* Bank6 */ -#define B6_MT 0x3 /* SDRAM */ -#define B6_Trcd 0x0 /* 2clk */ -#define B6_SCAN 0x1 /* 9 bit */ - -/* Bank7 */ -#define B7_MT 0x3 /* SDRAM */ -#define B7_Trcd 0x0 /* 2clk */ -#define B7_SCAN 0x1 /* 9 bit */ -#else /* CONFIG_RAM_16MB = 16 MB RAM */ -/* Bank6 */ -#define B6_MT 0x3 /* SDRAM */ -#define B6_Trcd 0x1 /* 2clk */ -#define B6_SCAN 0x0 /* 8 bit */ - -/* Bank7 */ -#define B7_MT 0x3 /* SDRAM */ -#define B7_Trcd 0x1 /* 2clk */ -#define B7_SCAN 0x0 /* 8 bit */ -#endif /* CONFIG_RAM_16MB */ - -/* refresh parameter */ -#define REFEN 0x1 /* enable refresh */ -#define TREFMD 0x0 /* CBR(CAS before RAS)/auto refresh */ -#define Trp 0x0 /* 2 clk */ -#define Trc 0x3 /* 7 clk */ -#define Tchr 0x2 /* 3 clk */ - -#ifdef CONFIG_TRAB_50MHZ -#define REFCNT 1269 /* period=15.6 us, HCLK=50Mhz, (2048+1-15.6*50) */ -#else -#define REFCNT 1011 /* period=15.6 us, HCLK=66.5Mhz, (2048+1-15.6*66.5) */ -#endif - - -_TEXT_BASE: - .word CONFIG_SYS_TEXT_BASE - -.globl lowlevel_init -lowlevel_init: - /* memory control configuration */ - /* make r0 relative the current location so that it */ - /* reads SMRDATA out of FLASH rather than memory ! */ - ldr r0, =SMRDATA - ldr r1, _TEXT_BASE - sub r0, r0, r1 - ldr r1, =BWSCON /* Bus Width Status Controller */ - add r2, r0, #52 -0: - ldr r3, [r0], #4 - str r3, [r1], #4 - cmp r2, r0 - bne 0b - - /* everything is fine now */ - mov pc, lr - - .ltorg -/* the literal pools origin */ - -SMRDATA: - .word 0x2211d644 /* d->Ethernet, 6->CPLD, 4->SRAM, 4->FLASH */ - .word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)) /* GCS0 */ - .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)) /* GCS1 */ - .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)) /* GCS2 */ - .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)) /* GCS3 */ - .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)) /* GCS4 */ - .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)) /* GCS5 */ - .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) /* GCS6 */ - .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) /* GCS7 */ - .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) -#ifndef CONFIG_RAM_16MB /* 32 MB RAM */ - .word 0x10 /* BUSWIDTH=32, SCLK power saving mode, BANKSIZE 32M/32M */ -#else /* CONFIG_RAM_16MB = 16 MB RAM */ - .word 0x17 /* BUSWIDTH=32, SCLK power saving mode, BANKSIZE 16M/16M */ -#endif /* CONFIG_RAM_16MB */ - .word 0x20 /* MRSR6, CL=2clk */ - .word 0x20 /* MRSR7 */ diff --git a/board/trab/memory.c b/board/trab/memory.c deleted file mode 100644 index 895b68ef75..0000000000 --- a/board/trab/memory.c +++ /dev/null @@ -1,486 +0,0 @@ -/* - * (C) Copyright 2002-2003 - * Wolfgang Denk, DENX Software Engineering, wd@denx.de. - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#include <common.h> - -/* Memory test - * - * General observations: - * o The recommended test sequence is to test the data lines: if they are - * broken, nothing else will work properly. Then test the address - * lines. Finally, test the cells in the memory now that the test - * program knows that the address and data lines work properly. - * This sequence also helps isolate and identify what is faulty. - * - * o For the address line test, it is a good idea to use the base - * address of the lowest memory location, which causes a '1' bit to - * walk through a field of zeros on the address lines and the highest - * memory location, which causes a '0' bit to walk through a field of - * '1's on the address line. - * - * o Floating buses can fool memory tests if the test routine writes - * a value and then reads it back immediately. The problem is, the - * write will charge the residual capacitance on the data bus so the - * bus retains its state briefely. When the test program reads the - * value back immediately, the capacitance of the bus can allow it - * to read back what was written, even though the memory circuitry - * is broken. To avoid this, the test program should write a test - * pattern to the target location, write a different pattern elsewhere - * to charge the residual capacitance in a differnt manner, then read - * the target location back. - * - * o Always read the target location EXACTLY ONCE and save it in a local - * variable. The problem with reading the target location more than - * once is that the second and subsequent reads may work properly, - * resulting in a failed test that tells the poor technician that - * "Memory error at 00000000, wrote aaaaaaaa, read aaaaaaaa" which - * doesn't help him one bit and causes puzzled phone calls. Been there, - * done that. - * - * Data line test: - * --------------- - * This tests data lines for shorts and opens by forcing adjacent data - * to opposite states. Because the data lines could be routed in an - * arbitrary manner the must ensure test patterns ensure that every case - * is tested. By using the following series of binary patterns every - * combination of adjacent bits is test regardless of routing. - * - * ...101010101010101010101010 - * ...110011001100110011001100 - * ...111100001111000011110000 - * ...111111110000000011111111 - * - * Carrying this out, gives us six hex patterns as follows: - * - * 0xaaaaaaaaaaaaaaaa - * 0xcccccccccccccccc - * 0xf0f0f0f0f0f0f0f0 - * 0xff00ff00ff00ff00 - * 0xffff0000ffff0000 - * 0xffffffff00000000 - * - * To test for short and opens to other signals on our boards, we - * simply test with the 1's complemnt of the paterns as well, resulting - * in twelve patterns total. - * - * After writing a test pattern. a special pattern 0x0123456789ABCDEF is - * written to a different address in case the data lines are floating. - * Thus, if a byte lane fails, you will see part of the special - * pattern in that byte lane when the test runs. For example, if the - * xx__xxxxxxxxxxxx byte line fails, you will see aa23aaaaaaaaaaaa - * (for the 'a' test pattern). - * - * Address line test: - * ------------------ - * This function performs a test to verify that all the address lines - * hooked up to the RAM work properly. If there is an address line - * fault, it usually shows up as two different locations in the address - * map (related by the faulty address line) mapping to one physical - * memory storage location. The artifact that shows up is writing to - * the first location "changes" the second location. - * - * To test all address lines, we start with the given base address and - * xor the address with a '1' bit to flip one address line. For each - * test, we shift the '1' bit left to test the next address line. - * - * In the actual code, we start with address sizeof(ulong) since our - * test pattern we use is a ulong and thus, if we tried to test lower - * order address bits, it wouldn't work because our pattern would - * overwrite itself. - * - * Example for a 4 bit address space with the base at 0000: - * 0000 <- base - * 0001 <- test 1 - * 0010 <- test 2 - * 0100 <- test 3 - * 1000 <- test 4 - * Example for a 4 bit address space with the base at 0010: - * 0010 <- base - * 0011 <- test 1 - * 0000 <- (below the base address, skipped) - * 0110 <- test 2 - * 1010 <- test 3 - * - * The test locations are successively tested to make sure that they are - * not "mirrored" onto the base address due to a faulty address line. - * Note that the base and each test location are related by one address - * line flipped. Note that the base address need not be all zeros. - * - * Memory tests 1-4: - * ----------------- - * These tests verify RAM using sequential writes and reads - * to/from RAM. There are several test cases that use different patterns to - * verify RAM. Each test case fills a region of RAM with one pattern and - * then reads the region back and compares its contents with the pattern. - * The following patterns are used: - * - * 1a) zero pattern (0x00000000) - * 1b) negative pattern (0xffffffff) - * 1c) checkerboard pattern (0x55555555) - * 1d) checkerboard pattern (0xaaaaaaaa) - * 2) bit-flip pattern ((1 << (offset % 32)) - * 3) address pattern (offset) - * 4) address pattern (~offset) - * - * Being run in normal mode, the test verifies only small 4Kb - * regions of RAM around each 1Mb boundary. For example, for 64Mb - * RAM the following areas are verified: 0x00000000-0x00000800, - * 0x000ff800-0x00100800, 0x001ff800-0x00200800, ..., 0x03fff800- - * 0x04000000. If the test is run in slow-test mode, it verifies - * the whole RAM. - */ - -/* #ifdef CONFIG_POST */ - -#include <post.h> -#include <watchdog.h> - -/* #if CONFIG_POST & CONFIG_SYS_POST_MEMORY */ - -/* - * Define INJECT_*_ERRORS for testing error detection in the presence of - * _good_ hardware. - */ -#undef INJECT_DATA_ERRORS -#undef INJECT_ADDRESS_ERRORS - -#ifdef INJECT_DATA_ERRORS -#warning "Injecting data line errors for testing purposes" -#endif - -#ifdef INJECT_ADDRESS_ERRORS -#warning "Injecting address line errors for testing purposes" -#endif - - -/* - * This function performs a double word move from the data at - * the source pointer to the location at the destination pointer. - * This is helpful for testing memory on processors which have a 64 bit - * wide data bus. - * - * On those PowerPC with FPU, use assembly and a floating point move: - * this does a 64 bit move. - * - * For other processors, let the compiler generate the best code it can. - */ -static void move64(const unsigned long long *src, unsigned long long *dest) -{ -#if defined(CONFIG_MPC8260) || defined(CONFIG_MPC824X) - asm ("lfd 0, 0(3)\n\t" /* fpr0 = *scr */ - "stfd 0, 0(4)" /* *dest = fpr0 */ - : : : "fr0" ); /* Clobbers fr0 */ - return; -#else - *dest = *src; -#endif -} - -/* - * This is 64 bit wide test patterns. Note that they reside in ROM - * (which presumably works) and the tests write them to RAM which may - * not work. - * - * The "otherpattern" is written to drive the data bus to values other - * than the test pattern. This is for detecting floating bus lines. - * - */ -const static unsigned long long pattern[] = { - 0xaaaaaaaaaaaaaaaaULL, - 0xccccccccccccccccULL, - 0xf0f0f0f0f0f0f0f0ULL, - 0xff00ff00ff00ff00ULL, - 0xffff0000ffff0000ULL, - 0xffffffff00000000ULL, - 0x00000000ffffffffULL, - 0x0000ffff0000ffffULL, - 0x00ff00ff00ff00ffULL, - 0x0f0f0f0f0f0f0f0fULL, - 0x3333333333333333ULL, - 0x5555555555555555ULL, -}; -const unsigned long long otherpattern = 0x0123456789abcdefULL; - - -static int memory_post_dataline(unsigned long long * pmem) -{ - unsigned long long temp64; - int num_patterns = sizeof(pattern)/ sizeof(pattern[0]); - int i; - unsigned int hi, lo, pathi, patlo; - int ret = 0; - - for ( i = 0; i < num_patterns; i++) { - move64(&(pattern[i]), pmem++); - /* - * Put a different pattern on the data lines: otherwise they - * may float long enough to read back what we wrote. - */ - move64(&otherpattern, pmem--); - move64(pmem, &temp64); - -#ifdef INJECT_DATA_ERRORS - temp64 ^= 0x00008000; -#endif - - if (temp64 != pattern[i]){ - pathi = (pattern[i]>>32) & 0xffffffff; - patlo = pattern[i] & 0xffffffff; - - hi = (temp64>>32) & 0xffffffff; - lo = temp64 & 0xffffffff; - - printf ("Memory (date line) error at %08lx, " - "wrote %08x%08x, read %08x%08x !\n", - (ulong)pmem, pathi, patlo, hi, lo); - ret = -1; - } - } - return ret; -} - -static int memory_post_addrline(ulong *testaddr, ulong *base, ulong size) -{ - ulong *target; - ulong *end; - ulong readback; - ulong xor; - int ret = 0; - - end = (ulong *)((ulong)base + size); /* pointer arith! */ - xor = 0; - for(xor = sizeof(ulong); xor > 0; xor <<= 1) { - target = (ulong *)((ulong)testaddr ^ xor); - if((target >= base) && (target < end)) { - *testaddr = ~*target; - readback = *target; - -#ifdef INJECT_ADDRESS_ERRORS - if(xor == 0x00008000) { - readback = *testaddr; - } -#endif - if(readback == *testaddr) { - printf ("Memory (address line) error at %08lx<->%08lx, " - "XOR value %08lx !\n", - (ulong)testaddr, (ulong)target, - xor); - ret = -1; - } - } - } - return ret; -} - -static int memory_post_test1 (unsigned long start, - unsigned long size, - unsigned long val) -{ - unsigned long i; - ulong *mem = (ulong *) start; - ulong readback; - int ret = 0; - - for (i = 0; i < size / sizeof (ulong); i++) { - mem[i] = val; - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) { - readback = mem[i]; - if (readback != val) { - printf ("Memory error at %08lx, " - "wrote %08lx, read %08lx !\n", - (ulong)(mem + i), val, readback); - - ret = -1; - break; - } - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - return ret; -} - -static int memory_post_test2 (unsigned long start, unsigned long size) -{ - unsigned long i; - ulong *mem = (ulong *) start; - ulong readback; - int ret = 0; - - for (i = 0; i < size / sizeof (ulong); i++) { - mem[i] = 1 << (i % 32); - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) { - readback = mem[i]; - if (readback != (1 << (i % 32))) { - printf ("Memory error at %08lx, " - "wrote %08x, read %08lx !\n", - (ulong)(mem + i), 1 << (i % 32), readback); - - ret = -1; - break; - } - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - return ret; -} - -static int memory_post_test3 (unsigned long start, unsigned long size) -{ - unsigned long i; - ulong *mem = (ulong *) start; - ulong readback; - int ret = 0; - - for (i = 0; i < size / sizeof (ulong); i++) { - mem[i] = i; - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) { - readback = mem[i]; - if (readback != i) { - printf ("Memory error at %08lx, " - "wrote %08lx, read %08lx !\n", - (ulong)(mem + i), i, readback); - - ret = -1; - break; - } - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - return ret; -} - -static int memory_post_test4 (unsigned long start, unsigned long size) -{ - unsigned long i; - ulong *mem = (ulong *) start; - ulong readback; - int ret = 0; - - for (i = 0; i < size / sizeof (ulong); i++) { - mem[i] = ~i; - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - for (i = 0; i < size / sizeof (ulong) && ret == 0; i++) { - readback = mem[i]; - if (readback != ~i) { - printf ("Memory error at %08lx, " - "wrote %08lx, read %08lx !\n", - (ulong)(mem + i), ~i, readback); - - ret = -1; - break; - } - if (i % 1024 == 0) - WATCHDOG_RESET (); - } - - return ret; -} - -int memory_post_tests (unsigned long start, unsigned long size) -{ - int ret = 0; - - if (ret == 0) - ret = memory_post_dataline ((unsigned long long *)start); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_addrline ((ulong *)start, (ulong *)start, size); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_addrline ((ulong *)(start + size - 8), - (ulong *)start, size); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test1 (start, size, 0x00000000); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test1 (start, size, 0xffffffff); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test1 (start, size, 0x55555555); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test1 (start, size, 0xaaaaaaaa); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test2 (start, size); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test3 (start, size); - WATCHDOG_RESET (); - if (ret == 0) - ret = memory_post_test4 (start, size); - WATCHDOG_RESET (); - - return ret; -} - -#if 0 -DECLARE_GLOBAL_DATA_PTR; - -int memory_post_test (int flags) -{ - int ret = 0; - bd_t *bd = gd->bd; - phys_size_t memsize = (bd->bi_memsize >= 256 << 20 ? - 256 << 20 : bd->bi_memsize) - (1 << 20); - - - if (flags & POST_SLOWTEST) { - ret = memory_post_tests (CONFIG_SYS_SDRAM_BASE, memsize); - } else { /* POST_NORMAL */ - - unsigned long i; - - for (i = 0; i < (memsize >> 20) && ret == 0; i++) { - if (ret == 0) - ret = memory_post_tests (i << 20, 0x800); - if (ret == 0) - ret = memory_post_tests ((i << 20) + 0xff800, 0x800); - } - } - - return ret; -} -#endif /* 0 */ - -/* #endif */ /* CONFIG_POST & CONFIG_SYS_POST_MEMORY */ -/* #endif */ /* CONFIG_POST */ diff --git a/board/trab/rs485.c b/board/trab/rs485.c deleted file mode 100644 index 30336f262c..0000000000 --- a/board/trab/rs485.c +++ /dev/null @@ -1,205 +0,0 @@ -/* - * (C) Copyright 2003 - * Martin Krause, TQ-Systems GmbH, <martin.krause@tqs.de> - * - * Based on arch/arm/cpu/arm920t/serial.c, by Gary Jennejohn - * (C) Copyright 2002 Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * 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 - * - */ - -#include <common.h> -#include <asm/arch/s3c24x0_cpu.h> -#include "rs485.h" - -static void rs485_setbrg (void); -static void rs485_cfgio (void); -static void set_rs485re(unsigned char rs485re_state); -static void set_rs485de(unsigned char rs485de_state); -static void rs485_setbrg (void); -#ifdef NOT_USED -static void trab_rs485_disable_tx(void); -static void trab_rs485_disable_rx(void); -#endif - -#define UART_NR S3C24X0_UART1 - -/* CPLD-Register for controlling TRAB hardware functions */ -#define CPLD_RS485_RE ((volatile unsigned long *)0x04028000) - -static void rs485_setbrg (void) -{ - struct s3c24x0_uart * const uart = s3c24x0_get_base_uart(UART_NR); - int i; - unsigned int reg = 0; - - /* value is calculated so : (int)(PCLK/16./baudrate) -1 */ - /* reg = (33000000 / (16 * gd->baudrate)) - 1; */ - reg = (33000000 / (16 * 38400)) - 1; - - /* FIFO enable, Tx/Rx FIFO clear */ - uart->ufcon = 0x07; - uart->umcon = 0x0; - /* Normal,No parity,1 stop,8 bit */ - uart->ulcon = 0x3; - /* - * tx=level,rx=edge,disable timeout int.,enable rx error int., - * normal,interrupt or polling - */ - uart->ucon = 0x245; - uart->ubrdiv = reg; - - for (i = 0; i < 100; i++); -} - -static void rs485_cfgio (void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - gpio->pfcon &= ~(0x3 << 2); - gpio->pfcon |= (0x2 << 2); /* configure GPF1 as RXD1 */ - - gpio->pfcon &= ~(0x3 << 6); - gpio->pfcon |= (0x2 << 6); /* configure GPF3 as TXD1 */ - - gpio->pfup |= (1 << 1); /* disable pullup on GPF1 */ - gpio->pfup |= (1 << 3); /* disable pullup on GPF3 */ - - gpio->pacon &= ~(1 << 11); /* set GPA11 (RS485_DE) to output */ -} - -/* - * Initialise the rs485 port with the given baudrate. The settings - * are always 8 data bits, no parity, 1 stop bit, no start bits. - * - */ -int rs485_init (void) -{ - rs485_cfgio (); - rs485_setbrg (); - - return (0); -} - -/* - * Read a single byte from the rs485 port. Returns 1 on success, 0 - * otherwise. When the function is succesfull, the character read is - * written into its argument c. - */ -int rs485_getc (void) -{ - struct s3c24x0_uart * const uart = s3c24x0_get_base_uart(UART_NR); - - /* wait for character to arrive */ - while (!(uart->utrstat & 0x1)) - ; - - return uart->urxh & 0xff; -} - -/* - * Output a single byte to the rs485 port. - */ -void rs485_putc (const char c) -{ - struct s3c24x0_uart * const uart = s3c24x0_get_base_uart(UART_NR); - - /* wait for room in the tx FIFO */ - while (!(uart->utrstat & 0x2)) - ; - - uart->utxh = c; - - /* If \n, also do \r */ - if (c == '\n') - rs485_putc ('\r'); -} - -/* - * Test whether a character is in the RX buffer - */ -int rs485_tstc (void) -{ - struct s3c24x0_uart * const uart = s3c24x0_get_base_uart(UART_NR); - - return uart->utrstat & 0x1; -} - -void rs485_puts (const char *s) -{ - while (*s) { - rs485_putc (*s++); - } -} - - -/* - * State table: - * RE DE Result - * 1 1 XMIT - * 0 0 RCV - * 1 0 Shutdown - */ - -/* function that controls the receiver enable for the rs485 */ -/* rs485re_state reflects the level (0/1) of the RE pin */ - -static void set_rs485re(unsigned char rs485re_state) -{ - if(rs485re_state) - *CPLD_RS485_RE = 0x010000; - else - *CPLD_RS485_RE = 0x0; -} - -/* function that controls the sender enable for the rs485 */ -/* rs485de_state reflects the level (0/1) of the DE pin */ - -static void set_rs485de(unsigned char rs485de_state) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* This is on PORT A bit 11 */ - if(rs485de_state) - gpio->padat |= (1 << 11); - else - gpio->padat &= ~(1 << 11); -} - - -void trab_rs485_enable_tx(void) -{ - set_rs485de(1); - set_rs485re(1); -} - -void trab_rs485_enable_rx(void) -{ - set_rs485re(0); - set_rs485de(0); -} - -#ifdef NOT_USED -static void trab_rs485_disable_tx(void) -{ - set_rs485de(0); -} - -static void trab_rs485_disable_rx(void) -{ - set_rs485re(1); -} -#endif diff --git a/board/trab/rs485.h b/board/trab/rs485.h deleted file mode 100644 index 19e32446c3..0000000000 --- a/board/trab/rs485.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * (C) Copyright 2003 - * Martin Krause, TQ-Systems GmbH, <martin.krause@tqs.de> - * - * Based on arch/arm/cpu/arm920t/serial.c, by Gary Jennejohn - * (C) Copyright 2002 Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * 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 - * - */ - -#ifndef _RS485_H_ -#define _RS485_H_ - -#include <asm/arch/s3c24x0_cpu.h> - -int rs485_init (void); -int rs485_getc (void); -void rs485_putc (const char c); -int rs485_tstc (void); -void rs485_puts (const char *s); -void trab_rs485_enable_tx(void); -void trab_rs485_enable_rx(void); - -#endif /* _RS485_H_ */ diff --git a/board/trab/trab.c b/board/trab/trab.c deleted file mode 100644 index 0f74e8fa1b..0000000000 --- a/board/trab/trab.c +++ /dev/null @@ -1,436 +0,0 @@ -/* - * (C) Copyright 2002 - * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -/* #define DEBUG */ - -#include <common.h> -#include <netdev.h> -#include <malloc.h> -#include <asm/arch/s3c24x0_cpu.h> -#include <command.h> - -DECLARE_GLOBAL_DATA_PTR; - -#ifdef CONFIG_SYS_BRIGHTNESS -static void spi_init(void); -static void wait_transmit_done(void); -static void tsc2000_write(unsigned int page, unsigned int reg, - unsigned int data); -static void tsc2000_set_brightness(void); -#endif -#ifdef CONFIG_MODEM_SUPPORT -static int key_pressed(void); -extern void disable_putc(void); -extern int do_mdm_init; /* defined in common/main.c */ - -/* - * We need a delay of at least 500 us after turning on the VFD clock - * before we can read any useful information for the CPLD controlling - * the keyboard switches. Let's play safe and wait 5 ms. The problem - * is that timers are not available yet, so we use a manually timed - * loop. - */ -#define KBD_MDELAY 5000 -static void udelay_no_timer (int usec) -{ - int i; - int delay = usec * 3; - - for (i = 0; i < delay; i ++) gd->bd->bi_arch_number = MACH_TYPE_TRAB; -} -#endif /* CONFIG_MODEM_SUPPORT */ - -/* - * Miscellaneous platform dependent initialisations - */ - -int board_init () -{ -#if defined(CONFIG_VFD) - extern int vfd_init_clocks(void); -#endif - struct s3c24x0_clock_power * const clk_power = - s3c24x0_get_base_clock_power(); - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* memory and cpu-speed are setup before relocation */ -#ifdef CONFIG_TRAB_50MHZ - /* change the clock to be 50 MHz 1:1:1 */ - /* MDIV:0x5c PDIV:4 SDIV:2 */ - clk_power->mpllcon = 0x5c042; - clk_power->clkdivn = 0; -#else - /* change the clock to be 133 MHz 1:2:4 */ - /* MDIV:0x7d PDIV:4 SDIV:1 */ - clk_power->mpllcon = 0x7d041; - clk_power->clkdivn = 3; -#endif - - /* set up the I/O ports */ - gpio->pacon = 0x3ffff; - gpio->pbcon = 0xaaaaaaaa; - gpio->pbup = 0xffff; - /* INPUT nCTS0 nRTS0 TXD[1] TXD[0] RXD[1] RXD[0] */ - /* 00, 10, 10, 10, 10, 10, 10 */ - gpio->pfcon = (2<<0) | (2<<2) | (2<<4) | (2<<6) | (2<<8) | (2<<10); -#ifdef CONFIG_HWFLOW - /* do not pull up RXD0, RXD1, TXD0, TXD1, CTS0, RTS0 */ - gpio->pfup = (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4) | (1<<5); -#else - /* do not pull up RXD0, RXD1, TXD0, TXD1 */ - gpio->pfup = (1<<0) | (1<<1) | (1<<2) | (1<<3); -#endif - gpio->pgcon = 0x0; - gpio->pgup = 0x0; - gpio->opencr = 0x0; - - /* suppress flicker of the VFDs */ - gpio->misccr = 0x40; - gpio->pfcon |= (2<<12); - - gd->bd->bi_arch_number = MACH_TYPE_TRAB; - - /* adress of boot parameters */ - gd->bd->bi_boot_params = 0x0c000100; - - /* Make sure both buzzers are turned off */ - gpio->pdcon |= 0x5400; - gpio->pddat &= ~0xE0; - -#ifdef CONFIG_VFD - vfd_init_clocks(); -#endif /* CONFIG_VFD */ - -#ifdef CONFIG_MODEM_SUPPORT - udelay_no_timer (KBD_MDELAY); - - if (key_pressed()) { - disable_putc(); /* modem doesn't understand banner etc */ - do_mdm_init = 1; - } -#endif /* CONFIG_MODEM_SUPPORT */ - -#ifdef CONFIG_DRIVER_S3C24X0_I2C - /* Configure I/O ports PG5 und PG6 for I2C */ - gpio->pgcon = (gpio->pgcon & 0x003c00) | 0x003c00; -#endif /* CONFIG_DRIVER_S3C24X0_I2C */ - - return 0; -} - -int dram_init (void) -{ - gd->bd->bi_dram[0].start = PHYS_SDRAM_1; - gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; - return 0; -} - -/*----------------------------------------------------------------------- - * Keyboard Controller - */ - -/* Maximum key number */ -#define KEYBD_KEY_NUM 4 - -#define KBD_DATA (((*(volatile ulong *)0x04020000) >> 16) & 0xF) - -static char *key_match (ulong); - -int misc_init_r (void) -{ - ulong kbd_data = KBD_DATA; - char *str; - char keybd_env[KEYBD_KEY_NUM + 1]; - int i; - -#ifdef CONFIG_VERSION_VARIABLE - { - /* Set version variable. Please note, that this variable is - * also set in main_loop() later in the boot process. The - * version variable has to be set this early, because so it - * could be used in script files on an usb stick, which - * might be called during do_auto_update() */ - extern char version_string[]; - - setenv ("ver", version_string); - } -#endif /* CONFIG_VERSION_VARIABLE */ - -#ifdef CONFIG_AUTO_UPDATE - { - extern int do_auto_update(void); - /* this has priority over all else */ - do_auto_update(); - } -#endif - - for (i = 0; i < KEYBD_KEY_NUM; ++i) { - keybd_env[i] = '0' + ((kbd_data >> i) & 1); - } - keybd_env[i] = '\0'; - debug ("** Setting keybd=\"%s\"\n", keybd_env); - setenv ("keybd", keybd_env); - - str = strdup (key_match (kbd_data)); /* decode keys */ - -#ifdef CONFIG_PREBOOT /* automatically configure "preboot" command on key match */ - debug ("** Setting preboot=\"%s\"\n", str); - setenv ("preboot", str); /* set or delete definition */ -#endif /* CONFIG_PREBOOT */ - if (str != NULL) { - free (str); - } - -#ifdef CONFIG_SYS_BRIGHTNESS - tsc2000_set_brightness(); -#endif - return (0); -} - -#ifdef CONFIG_PREBOOT - -static uchar kbd_magic_prefix[] = "key_magic"; -static uchar kbd_command_prefix[] = "key_cmd"; - -static int compare_magic (ulong kbd_data, char *str) -{ - uchar key_mask; - - debug ("compare_magic: kbd: %04lx str: \"%s\"\n",kbd_data,str); - for (; *str; str++) - { - uchar c = *str - '1'; - - if (c >= KEYBD_KEY_NUM) /* bad key number */ - return -1; - - key_mask = 1 << c; - - if (!(kbd_data & key_mask)) { /* key not pressed */ - debug ( "compare_magic: " - "kbd: %04lx mask: %04lx - key not pressed\n", - kbd_data, key_mask ); - return -1; - } - - kbd_data &= ~key_mask; - } - - if (kbd_data) { /* key(s) not released */ - debug ( "compare_magic: " - "kbd: %04lx - key(s) not released\n", kbd_data); - return -1; - } - - return 0; -} - -/*----------------------------------------------------------------------- - * Check if pressed key(s) match magic sequence, - * and return the command string associated with that key(s). - * - * If no key press was decoded, NULL is returned. - * - * Note: the first character of the argument will be overwritten with - * the "magic charcter code" of the decoded key(s), or '\0'. - * - * - * Note: the string points to static environment data and must be - * saved before you call any function that modifies the environment. - */ -static char *key_match (ulong kbd_data) -{ - char magic[sizeof (kbd_magic_prefix) + 1]; - char cmd_name[sizeof (kbd_command_prefix) + 1]; - char *suffix; - char *kbd_magic_keys; - - /* - * The following string defines the characters that can pe appended - * to "key_magic" to form the names of environment variables that - * hold "magic" key codes, i. e. such key codes that can cause - * pre-boot actions. If the string is empty (""), then only - * "key_magic" is checked (old behaviour); the string "125" causes - * checks for "key_magic1", "key_magic2" and "key_magic5", etc. - */ - if ((kbd_magic_keys = getenv ("magic_keys")) == NULL) - kbd_magic_keys = ""; - - debug ("key_match: magic_keys=\"%s\"\n", kbd_magic_keys); - - /* loop over all magic keys; - * use '\0' suffix in case of empty string - */ - for (suffix=kbd_magic_keys; *suffix || suffix==kbd_magic_keys; ++suffix) - { - sprintf (magic, "%s%c", kbd_magic_prefix, *suffix); - - debug ("key_match: magic=\"%s\"\n", - getenv(magic) ? getenv(magic) : "<UNDEFINED>"); - - if (compare_magic(kbd_data, getenv(magic)) == 0) - { - sprintf (cmd_name, "%s%c", kbd_command_prefix, *suffix); - debug ("key_match: cmdname %s=\"%s\"\n", - cmd_name, - getenv (cmd_name) ? - getenv (cmd_name) : - "<UNDEFINED>"); - return (getenv (cmd_name)); - } - } - debug ("key_match: no match\n"); - return (NULL); -} -#endif /* CONFIG_PREBOOT */ - -/* Read Keyboard status */ -int do_kbd (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) -{ - ulong kbd_data = KBD_DATA; - char keybd_env[KEYBD_KEY_NUM + 1]; - int i; - - puts ("Keys:"); - for (i = 0; i < KEYBD_KEY_NUM; ++i) { - keybd_env[i] = '0' + ((kbd_data >> i) & 1); - printf (" %c", keybd_env[i]); - } - keybd_env[i] = '\0'; - putc ('\n'); - setenv ("keybd", keybd_env); - return 0; -} - -U_BOOT_CMD( - kbd, 1, 1, do_kbd, - "read keyboard status", - "" -); - -#ifdef CONFIG_MODEM_SUPPORT -static int key_pressed(void) -{ - return (compare_magic(KBD_DATA, CONFIG_MODEM_KEY_MAGIC) == 0); -} -#endif /* CONFIG_MODEM_SUPPORT */ - -#ifdef CONFIG_SYS_BRIGHTNESS - -static inline void SET_CS_TOUCH(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - gpio->pddat &= 0x5FF; -} - -static inline void CLR_CS_TOUCH(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - gpio->pddat |= 0x200; -} - -static void spi_init(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - int i; - - /* Configure I/O ports. */ - gpio->pdcon = (gpio->pdcon & 0xF3FFFF) | 0x040000; - gpio->pgcon = (gpio->pgcon & 0x0F3FFF) | 0x008000; - gpio->pgcon = (gpio->pgcon & 0x0CFFFF) | 0x020000; - gpio->pgcon = (gpio->pgcon & 0x03FFFF) | 0x080000; - - CLR_CS_TOUCH(); - - spi->ch[0].sppre = 0x1F; /* Baudrate ca. 514kHz */ - spi->ch[0].sppin = 0x01; /* SPI-MOSI holds Level after last bit */ - spi->ch[0].spcon = 0x1A; /* Polling, Prescale, Master, CPOL=0, CPHA=1 */ - - /* Dummy byte ensures clock to be low. */ - for (i = 0; i < 10; i++) { - spi->ch[0].sptdat = 0xFF; - } - wait_transmit_done(); -} - -static void wait_transmit_done(void) -{ - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - - while (!(spi->ch[0].spsta & 0x01)) /* wait until transfer is done */ - ; -} - -static void tsc2000_write(unsigned int page, unsigned int reg, - unsigned int data) -{ - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - unsigned int command; - - SET_CS_TOUCH(); - command = 0x0000; - command |= (page << 11); - command |= (reg << 5); - - spi->ch[0].sptdat = (command & 0xFF00) >> 8; - wait_transmit_done(); - spi->ch[0].sptdat = (command & 0x00FF); - wait_transmit_done(); - spi->ch[0].sptdat = (data & 0xFF00) >> 8; - wait_transmit_done(); - spi->ch[0].sptdat = (data & 0x00FF); - wait_transmit_done(); - - CLR_CS_TOUCH(); -} - -static void tsc2000_set_brightness(void) -{ - char tmp[10]; - int i, br; - - spi_init(); - tsc2000_write(1, 2, 0x0); /* Power up DAC */ - - i = getenv_f("brightness", tmp, sizeof(tmp)); - br = (i > 0) - ? (int) simple_strtoul (tmp, NULL, 10) - : CONFIG_SYS_BRIGHTNESS; - - tsc2000_write(0, 0xb, br & 0xff); -} -#endif - -#ifdef CONFIG_CMD_NET -int board_eth_init(bd_t *bis) -{ - int rc = 0; -#ifdef CONFIG_CS8900 - rc = cs8900_initialize(0, CONFIG_CS8900_BASE); -#endif - return rc; -} -#endif diff --git a/board/trab/trab_fkt.c b/board/trab/trab_fkt.c deleted file mode 100644 index fe3dab351f..0000000000 --- a/board/trab/trab_fkt.c +++ /dev/null @@ -1,1418 +0,0 @@ -/* - * (C) Copyright 2003 - * Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#define DEBUG - -#include <common.h> -#include <exports.h> -#include <timestamp.h> -#include <asm/arch/s3c24x0_cpu.h> -#include "tsc2000.h" -#include "rs485.h" - -/* - * define, to wait for the touch to be pressed, before reading coordinates in - * command do_touch. If not defined, an error message is printed, when the - * command do_touch is invoked and the touch is not pressed within an specific - * interval. - */ -#undef CONFIG_TOUCH_WAIT_PRESSED - -/* max time to wait for touch is pressed */ -#ifndef CONFIG_TOUCH_WAIT_PRESSED -#define TOUCH_TIMEOUT 5 -#endif /* !CONFIG_TOUCH_WAIT_PRESSED */ - -/* assignment of CPU internal ADC channels with TRAB hardware */ -#define VCC5V 2 -#define VCC12V 3 - -/* CPLD-Register for controlling TRAB hardware functions */ -#define CPLD_BUTTONS ((volatile unsigned long *)0x04020000) -#define CPLD_FILL_LEVEL ((volatile unsigned long *)0x04008000) -#define CPLD_ROTARY_SWITCH ((volatile unsigned long *)0x04018000) -#define CPLD_RS485_RE ((volatile unsigned long *)0x04028000) - -/* timer configuration bits for buzzer and PWM */ -#define START2 (1 << 12) -#define UPDATE2 (1 << 13) -#define INVERT2 (1 << 14) -#define RELOAD2 (1 << 15) -#define START3 (1 << 16) -#define UPDATE3 (1 << 17) -#define INVERT3 (1 << 18) -#define RELOAD3 (1 << 19) - -#define PCLK 66000000 -#define BUZZER_FREQ 1000 /* frequency in Hz */ -#define PWM_FREQ 500 - - -/* definitions of I2C EEPROM device address */ -#define I2C_EEPROM_DEV_ADDR 0x54 - -/* definition for touch panel calibration points */ -#define CALIB_TL 0 /* calibration point in (T)op (L)eft corner */ -#define CALIB_DR 1 /* calibration point in (D)own (R)ight corner */ - -/* EEPROM address map */ -#define SERIAL_NUMBER 8 -#define TOUCH_X0 52 -#define TOUCH_Y0 54 -#define TOUCH_X1 56 -#define TOUCH_Y1 58 -#define CRC16 60 - -/* EEPROM stuff */ -#define EEPROM_MAX_CRC_BUF 64 - -/* RS485 stuff */ -#define RS485_MAX_RECEIVE_BUF_LEN 100 - -/* Bit definitions for ADCCON */ -#define ADC_ENABLE_START 0x1 -#define ADC_READ_START 0x2 -#define ADC_STDBM 0x4 -#define ADC_INP_AIN0 (0x0 << 3) -#define ADC_INP_AIN1 (0x1 << 3) -#define ADC_INP_AIN2 (0x2 << 3) -#define ADC_INP_AIN3 (0x3 << 3) -#define ADC_INP_AIN4 (0x4 << 3) -#define ADC_INP_AIN5 (0x5 << 3) -#define ADC_INP_AIN6 (0x6 << 3) -#define ADC_INP_AIN7 (0x7 << 3) -#define ADC_PRSCEN 0x4000 -#define ADC_ECFLG 0x8000 - -/* function test functions */ -int do_dip (void); -int do_info (void); -int do_vcc5v (void); -int do_vcc12v (void); -int do_buttons (void); -int do_fill_level (void); -int do_rotary_switch (void); -int do_pressure (void); -int do_v_bat (void); -int do_vfd_id (void); -int do_buzzer (char * const *); -int do_led (char * const *); -int do_full_bridge (char * const *); -int do_dac (char * const *); -int do_motor_contact (void); -int do_motor (char * const *); -int do_pwm (char * const *); -int do_thermo (char * const *); -int do_touch (char * const *); -int do_rs485 (char * const *); -int do_serial_number (char * const *); -int do_crc16 (void); -int do_power_switch (void); -int do_gain (char * const *); -int do_eeprom (char * const *); - -/* helper functions */ -static void adc_init (void); -static int adc_read (unsigned int channel); -static void print_identifier (void); - -#ifdef CONFIG_TOUCH_WAIT_PRESSED -static void touch_wait_pressed (void); -#else -static int touch_check_pressed (void); -#endif /* CONFIG_TOUCH_WAIT_PRESSED */ - -static void touch_read_x_y (int *x, int *y); -static int touch_write_clibration_values (int calib_point, int x, int y); -static int rs485_send_line (const char *data); -static int rs485_receive_chars (char *data, int timeout); -static unsigned short updcrc(unsigned short icrc, unsigned char *icp, - unsigned int icnt); - -#if defined(CONFIG_CMD_I2C) -static int trab_eeprom_read (char * const *argv); -static int trab_eeprom_write (char * const *argv); -int i2c_write_multiple (uchar chip, uint addr, int alen, uchar *buffer, - int len); -int i2c_read_multiple ( uchar chip, uint addr, int alen, uchar *buffer, - int len); -#endif - -/* - * TRAB board specific commands. Especially commands for burn-in and function - * test. - */ - -int trab_fkt (int argc, char * const argv[]) -{ - int i; - - app_startup(argv); - if (get_version () != XF_VERSION) { - printf ("Wrong XF_VERSION. Please re-compile with actual " - "u-boot sources\n"); - printf ("Example expects ABI version %d\n", XF_VERSION); - printf ("Actual U-Boot ABI version %d\n", (int)get_version()); - return 1; - } - - debug ("argc = %d\n", argc); - - for (i=0; i<=argc; ++i) { - debug ("argv[%d] = \"%s\"\n", i, argv[i] ? argv[i] : "<NULL>"); - } - - adc_init (); - - switch (argc) { - - case 0: - case 1: - break; - - case 2: - if (strcmp (argv[1], "info") == 0) { - return (do_info ()); - } - if (strcmp (argv[1], "dip") == 0) { - return (do_dip ()); - } - if (strcmp (argv[1], "vcc5v") == 0) { - return (do_vcc5v ()); - } - if (strcmp (argv[1], "vcc12v") == 0) { - return (do_vcc12v ()); - } - if (strcmp (argv[1], "buttons") == 0) { - return (do_buttons ()); - } - if (strcmp (argv[1], "fill_level") == 0) { - return (do_fill_level ()); - } - if (strcmp (argv[1], "rotary_switch") == 0) { - return (do_rotary_switch ()); - } - if (strcmp (argv[1], "pressure") == 0) { - return (do_pressure ()); - } - if (strcmp (argv[1], "v_bat") == 0) { - return (do_v_bat ()); - } - if (strcmp (argv[1], "vfd_id") == 0) { - return (do_vfd_id ()); - } - if (strcmp (argv[1], "motor_contact") == 0) { - return (do_motor_contact ()); - } - if (strcmp (argv[1], "crc16") == 0) { - return (do_crc16 ()); - } - if (strcmp (argv[1], "power_switch") == 0) { - return (do_power_switch ()); - } - break; - - case 3: - if (strcmp (argv[1], "full_bridge") == 0) { - return (do_full_bridge (argv)); - } - if (strcmp (argv[1], "dac") == 0) { - return (do_dac (argv)); - } - if (strcmp (argv[1], "motor") == 0) { - return (do_motor (argv)); - } - if (strcmp (argv[1], "pwm") == 0) { - return (do_pwm (argv)); - } - if (strcmp (argv[1], "thermo") == 0) { - return (do_thermo (argv)); - } - if (strcmp (argv[1], "touch") == 0) { - return (do_touch (argv)); - } - if (strcmp (argv[1], "serial_number") == 0) { - return (do_serial_number (argv)); - } - if (strcmp (argv[1], "buzzer") == 0) { - return (do_buzzer (argv)); - } - if (strcmp (argv[1], "gain") == 0) { - return (do_gain (argv)); - } - break; - - case 4: - if (strcmp (argv[1], "led") == 0) { - return (do_led (argv)); - } - if (strcmp (argv[1], "rs485") == 0) { - return (do_rs485 (argv)); - } - if (strcmp (argv[1], "serial_number") == 0) { - return (do_serial_number (argv)); - } - break; - - case 5: - if (strcmp (argv[1], "eeprom") == 0) { - return (do_eeprom (argv)); - } - break; - - case 6: - if (strcmp (argv[1], "eeprom") == 0) { - return (do_eeprom (argv)); - } - break; - - default: - break; - } - - printf ("Usage:\n<command> <parameter1> <parameter2> ...\n"); - return 1; -} - -void hang (void) -{ - puts ("### ERROR ### Please RESET the board ###\n"); - for (;;); -} - -int do_info (void) -{ - printf ("Stand-alone application for TRAB board function test\n"); - printf ("Built: %s at %s\n", U_BOOT_DATE, U_BOOT_TIME); - - return 0; -} - -int do_dip (void) -{ - unsigned int result = 0; - int adc_val; - int i; - - /*********************************************************** - DIP switch connection (according to wa4-cpu.sp.301.pdf, page 3): - SW1 - AIN4 - SW2 - AIN5 - SW3 - AIN6 - SW4 - AIN7 - - "On" DIP switch position short-circuits the voltage from - the input channel (i.e. '0' conversion result means "on"). - *************************************************************/ - - for (i = 7; i > 3; i--) { - - if ((adc_val = adc_read (i)) == -1) { - printf ("Channel %d could not be read\n", i); - return 1; - } - - /* - * Input voltage (switch open) is 1.8 V. - * (Vin_High/VRef)*adc_res = (1,8V/2,5V)*1023) = 736 - * Set trigger at halve that value. - */ - if (adc_val < 368) - result |= (1 << (i-4)); - } - - /* print result to console */ - print_identifier (); - for (i = 0; i < 4; i++) { - if ((result & (1 << i)) == 0) - printf("0"); - else - printf("1"); - } - printf("\n"); - - return 0; -} - - -int do_vcc5v (void) -{ - int result; - - /* VCC5V is connected to channel 2 */ - - if ((result = adc_read (VCC5V)) == -1) { - printf ("VCC5V could not be read\n"); - return 1; - } - - /* - * Calculate voltage value. Split in two parts because there is no - * floating point support. VCC5V is connected over an resistor divider: - * VCC5V=ADCval*2,5V/1023*(10K+30K)/10K. - */ - print_identifier (); - printf ("%d", (result & 0x3FF)* 10 / 1023); - printf (".%d", ((result & 0x3FF)* 10 % 1023)* 10 / 1023); - printf ("%d V\n", (((result & 0x3FF) * 10 % 1023 ) * 10 % 1023) - * 10 / 1024); - - return 0; -} - - -int do_vcc12v (void) -{ - int result; - - if ((result = adc_read (VCC12V)) == -1) { - printf ("VCC12V could not be read\n"); - return 1; - } - - /* - * Calculate voltage value. Split in two parts because there is no - * floating point support. VCC5V is connected over an resistor divider: - * VCC12V=ADCval*2,5V/1023*(30K+270K)/30K. - */ - print_identifier (); - printf ("%d", (result & 0x3FF)* 25 / 1023); - printf (".%d V\n", ((result & 0x3FF)* 25 % 1023) * 10 / 1023); - - return 0; -} - -static int adc_read (unsigned int channel) -{ - int j = 1000; /* timeout value for wait loop in us */ - int result; - struct s3c2400_adc *padc; - - padc = s3c2400_get_base_adc(); - channel &= 0x7; - - padc->adccon &= ~ADC_STDBM; /* select normal mode */ - padc->adccon &= ~(0x7 << 3); /* clear the channel bits */ - padc->adccon |= ((channel << 3) | ADC_ENABLE_START); - - while (j--) { - if ((padc->adccon & ADC_ENABLE_START) == 0) - break; - udelay (1); - } - - if (j == 0) { - printf("%s: ADC timeout\n", __FUNCTION__); - padc->adccon |= ADC_STDBM; /* select standby mode */ - return -1; - } - - result = padc->adcdat & 0x3FF; - - padc->adccon |= ADC_STDBM; /* select standby mode */ - - debug ("%s: channel %d, result[DIGIT]=%d\n", __FUNCTION__, - (padc->adccon >> 3) & 0x7, result); - - /* - * Wait for ADC to be ready for next conversion. This delay value was - * estimated, because the datasheet does not specify a value. - */ - udelay (1000); - - return (result); -} - - -static void adc_init (void) -{ - struct s3c2400_adc *padc; - - padc = s3c2400_get_base_adc(); - - padc->adccon &= ~(0xff << 6); /* clear prescaler bits */ - padc->adccon |= ((65 << 6) | ADC_PRSCEN); /* set prescaler */ - - /* - * Wait some time to avoid problem with very first call of - * adc_read(). Without * this delay, sometimes the first read adc - * value is 0. Perhaps because the * adjustment of prescaler takes - * some clock cycles? - */ - udelay (1000); - - return; -} - - -int do_buttons (void) -{ - int result; - int i; - - result = *CPLD_BUTTONS; /* read CPLD */ - debug ("%s: cpld_taster (32 bit) %#x\n", __FUNCTION__, result); - - /* print result to console */ - print_identifier (); - for (i = 16; i <= 19; i++) { - if ((result & (1 << i)) == 0) - printf("0"); - else - printf("1"); - } - printf("\n"); - return 0; -} - - -int do_power_switch (void) -{ - int result; - - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* configure GPE7 as input */ - gpio->pecon &= ~(0x3 << (2 * 7)); - - /* signal GPE7 from power switch is low active: 0=on , 1=off */ - result = ((gpio->pedat & (1 << 7)) == (1 << 7)) ? 0 : 1; - - print_identifier (); - printf("%d\n", result); - return 0; -} - - -int do_fill_level (void) -{ - int result; - - result = *CPLD_FILL_LEVEL; /* read CPLD */ - debug ("%s: cpld_fuellstand (32 bit) %#x\n", __FUNCTION__, result); - - /* print result to console */ - print_identifier (); - if ((result & (1 << 16)) == 0) - printf("0\n"); - else - printf("1\n"); - return 0; -} - - -int do_rotary_switch (void) -{ - int result; - /* - * Please note, that the default values of the direction bits are - * undefined after reset. So it is a good idea, to make first a dummy - * call to this function, to clear the direction bits and set so to - * proper values. - */ - - result = *CPLD_ROTARY_SWITCH; /* read CPLD */ - debug ("%s: cpld_inc (32 bit) %#x\n", __FUNCTION__, result); - - *CPLD_ROTARY_SWITCH |= (3 << 16); /* clear direction bits in CPLD */ - - /* print result to console */ - print_identifier (); - if ((result & (1 << 16)) == (1 << 16)) - printf("R"); - if ((result & (1 << 17)) == (1 << 17)) - printf("L"); - if (((result & (1 << 16)) == 0) && ((result & (1 << 17)) == 0)) - printf("0"); - if ((result & (1 << 18)) == 0) - printf("0\n"); - else - printf("1\n"); - return 0; -} - - -int do_vfd_id (void) -{ - int i; - long int pcup_old, pccon_old; - int vfd_board_id; - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* try to red vfd board id from the value defined by pull-ups */ - - pcup_old = gpio->pcup; - pccon_old = gpio->pccon; - - gpio->pcup = (gpio->pcup & 0xFFF0); /* activate GPC0...GPC3 pull-ups */ - gpio->pccon = (gpio->pccon & 0xFFFFFF00); /* configure GPC0...GPC3 as - * inputs */ - udelay (10); /* allow signals to settle */ - vfd_board_id = (~gpio->pcdat) & 0x000F; /* read GPC0...GPC3 port pins */ - - gpio->pccon = pccon_old; - gpio->pcup = pcup_old; - - /* print vfd_board_id to console */ - print_identifier (); - for (i = 0; i < 4; i++) { - if ((vfd_board_id & (1 << i)) == 0) - printf("0"); - else - printf("1"); - } - printf("\n"); - return 0; -} - -int do_buzzer (char * const *argv) -{ - int counter; - - struct s3c24x0_timers * const timers = s3c24x0_get_base_timers(); - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* set prescaler for timer 2, 3 and 4 */ - timers->tcfg0 &= ~0xFF00; - timers->tcfg0 |= 0x0F00; - - /* set divider for timer 2 */ - timers->tcfg1 &= ~0xF00; - timers->tcfg1 |= 0x300; - - /* set frequency */ - counter = (PCLK / BUZZER_FREQ) >> 9; - timers->ch[2].tcntb = counter; - timers->ch[2].tcmpb = counter / 2; - - if (strcmp (argv[2], "on") == 0) { - debug ("%s: frequency: %d\n", __FUNCTION__, - BUZZER_FREQ); - - /* configure pin GPD7 as TOUT2 */ - gpio->pdcon &= ~0xC000; - gpio->pdcon |= 0x8000; - - /* start */ - timers->tcon = (timers->tcon | UPDATE2 | RELOAD2) & - ~INVERT2; - timers->tcon = (timers->tcon | START2) & ~UPDATE2; - return (0); - } - else if (strcmp (argv[2], "off") == 0) { - /* stop */ - timers->tcon &= ~(START2 | RELOAD2); - - /* configure GPD7 as output and set to low */ - gpio->pdcon &= ~0xC000; - gpio->pdcon |= 0x4000; - gpio->pddat &= ~0x80; - return (0); - } - - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; -} - - -int do_led (char * const *argv) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* configure PC14 and PC15 as output */ - gpio->pccon &= ~(0xF << 28); - gpio->pccon |= (0x5 << 28); - - /* configure PD0 and PD4 as output */ - gpio->pdcon &= ~((0x3 << 8) | 0x3); - gpio->pdcon |= ((0x1 << 8) | 0x1); - - switch (simple_strtoul(argv[2], NULL, 10)) { - - case 0: - case 1: - break; - - case 2: - if (strcmp (argv[3], "on") == 0) - gpio->pcdat |= (1 << 14); - else - gpio->pcdat &= ~(1 << 14); - return 0; - - case 3: - if (strcmp (argv[3], "on") == 0) - gpio->pcdat |= (1 << 15); - else - gpio->pcdat &= ~(1 << 15); - return 0; - - case 4: - if (strcmp (argv[3], "on") == 0) - gpio->pddat |= (1 << 0); - else - gpio->pddat &= ~(1 << 0); - return 0; - - case 5: - if (strcmp (argv[3], "on") == 0) - gpio->pddat |= (1 << 4); - else - gpio->pddat &= ~(1 << 4); - return 0; - - default: - break; - - } - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; -} - - -int do_full_bridge (char * const *argv) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* configure PD5 and PD6 as output */ - gpio->pdcon &= ~((0x3 << 5*2) | (0x3 << 6*2)); - gpio->pdcon |= ((0x1 << 5*2) | (0x1 << 6*2)); - - if (strcmp (argv[2], "+") == 0) { - gpio->pddat |= (1 << 5); - gpio->pddat |= (1 << 6); - return 0; - } - else if (strcmp (argv[2], "-") == 0) { - gpio->pddat &= ~(1 << 5); - gpio->pddat |= (1 << 6); - return 0; - } - else if (strcmp (argv[2], "off") == 0) { - gpio->pddat &= ~(1 << 5); - gpio->pddat &= ~(1 << 6); - return 0; - } - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; -} - -/* val must be in [0, 4095] */ -static inline unsigned long tsc2000_to_uv (u16 val) -{ - return ((250000 * val) / 4096) * 10; -} - - -int do_dac (char * const *argv) -{ - int brightness; - - /* initialize SPI */ - tsc2000_spi_init (); - - if (((brightness = simple_strtoul (argv[2], NULL, 10)) < 0) || - (brightness > 255)) { - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; - } - tsc2000_write(TSC2000_REG_DACCTL, 0x0); /* Power up DAC */ - tsc2000_write(TSC2000_REG_DAC, brightness & 0xff); - - return 0; -} - - -int do_v_bat (void) -{ - unsigned long ret, res; - - /* initialize SPI */ - spi_init (); - - tsc2000_write(TSC2000_REG_ADC, 0x1836); - - /* now wait for data available */ - adc_wait_conversion_done(); - - ret = tsc2000_read(TSC2000_REG_BAT1); - res = (tsc2000_to_uv(ret) + 1250) / 2500; - res += (ERROR_BATTERY * res) / 1000; - - print_identifier (); - printf ("%ld", (res / 100)); - printf (".%ld", ((res % 100) / 10)); - printf ("%ld V\n", (res % 10)); - return 0; -} - - -int do_pressure (void) -{ - /* initialize SPI */ - spi_init (); - - tsc2000_write(TSC2000_REG_ADC, 0x2436); - - /* now wait for data available */ - adc_wait_conversion_done(); - - print_identifier (); - printf ("%d\n", tsc2000_read(TSC2000_REG_AUX2)); - return 0; -} - - -int do_motor_contact (void) -{ - int result; - - result = *CPLD_FILL_LEVEL; /* read CPLD */ - debug ("%s: cpld_fuellstand (32 bit) %#x\n", __FUNCTION__, result); - - /* print result to console */ - print_identifier (); - if ((result & (1 << 17)) == 0) - printf("0\n"); - else - printf("1\n"); - return 0; -} - -int do_motor (char * const *argv) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - /* Configure I/O port */ - gpio->pgcon &= ~(0x3 << 0); - gpio->pgcon |= (0x1 << 0); - - if (strcmp (argv[2], "on") == 0) { - gpio->pgdat &= ~(1 << 0); - return 0; - } - if (strcmp (argv[2], "off") == 0) { - gpio->pgdat |= (1 << 0); - return 0; - } - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; -} - -static void print_identifier (void) -{ - printf ("## FKT: "); -} - -int do_pwm (char * const *argv) -{ - int counter; - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - struct s3c24x0_timers * const timers = s3c24x0_get_base_timers(); - - if (strcmp (argv[2], "on") == 0) { - /* configure pin GPD8 as TOUT3 */ - gpio->pdcon &= ~(0x3 << 8*2); - gpio->pdcon |= (0x2 << 8*2); - - /* set prescaler for timer 2, 3 and 4 */ - timers->tcfg0 &= ~0xFF00; - timers->tcfg0 |= 0x0F00; - - /* set divider for timer 3 */ - timers->tcfg1 &= ~(0xf << 12); - timers->tcfg1 |= (0x3 << 12); - - /* set frequency */ - counter = (PCLK / PWM_FREQ) >> 9; - timers->ch[3].tcntb = counter; - timers->ch[3].tcmpb = counter / 2; - - /* start timer */ - timers->tcon = (timers->tcon | UPDATE3 | RELOAD3) & ~INVERT3; - timers->tcon = (timers->tcon | START3) & ~UPDATE3; - return 0; - } - if (strcmp (argv[2], "off") == 0) { - - /* stop timer */ - timers->tcon &= ~(START2 | RELOAD2); - - /* configure pin GPD8 as output and set to 0 */ - gpio->pdcon &= ~(0x3 << 8*2); - gpio->pdcon |= (0x1 << 8*2); - gpio->pddat &= ~(1 << 8); - return 0; - } - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; -} - - -int do_thermo (char * const *argv) -{ - int channel, res; - - tsc2000_reg_init (); - - if (strcmp (argv[2], "all") == 0) { - int i; - for (i=0; i <= 15; i++) { - res = tsc2000_read_channel(i); - print_identifier (); - printf ("c%d: %d\n", i, res); - } - return 0; - } - channel = simple_strtoul (argv[2], NULL, 10); - res = tsc2000_read_channel(channel); - print_identifier (); - printf ("%d\n", res); - return 0; /* return OK */ -} - - -int do_touch (char * const *argv) -{ - int x, y; - - if (strcmp (argv[2], "tl") == 0) { -#ifdef CONFIG_TOUCH_WAIT_PRESSED - touch_wait_pressed(); -#else - { - int i; - for (i = 0; i < (TOUCH_TIMEOUT * 1000); i++) { - if (touch_check_pressed ()) { - break; - } - udelay (1000); /* pause 1 ms */ - } - } - if (!touch_check_pressed()) { - print_identifier (); - printf ("error: touch not pressed\n"); - return 1; - } -#endif /* CONFIG_TOUCH_WAIT_PRESSED */ - touch_read_x_y (&x, &y); - - print_identifier (); - printf ("x=%d y=%d\n", x, y); - return touch_write_clibration_values (CALIB_TL, x, y); - } - else if (strcmp (argv[2], "dr") == 0) { -#ifdef CONFIG_TOUCH_WAIT_PRESSED - touch_wait_pressed(); -#else - { - int i; - for (i = 0; i < (TOUCH_TIMEOUT * 1000); i++) { - if (touch_check_pressed ()) { - break; - } - udelay (1000); /* pause 1 ms */ - } - } - if (!touch_check_pressed()) { - print_identifier (); - printf ("error: touch not pressed\n"); - return 1; - } -#endif /* CONFIG_TOUCH_WAIT_PRESSED */ - touch_read_x_y (&x, &y); - - print_identifier (); - printf ("x=%d y=%d\n", x, y); - - return touch_write_clibration_values (CALIB_DR, x, y); - } - return 1; /* not "tl", nor "dr", so return error */ -} - - -#ifdef CONFIG_TOUCH_WAIT_PRESSED -static void touch_wait_pressed (void) -{ - while (!(tsc2000_read(TSC2000_REG_ADC) & TC_PSM)); -} - -#else -static int touch_check_pressed (void) -{ - return (tsc2000_read(TSC2000_REG_ADC) & TC_PSM); -} -#endif /* CONFIG_TOUCH_WAIT_PRESSED */ - -static int touch_write_clibration_values (int calib_point, int x, int y) -{ -#if defined(CONFIG_CMD_I2C) - int x_verify = 0; - int y_verify = 0; - - tsc2000_reg_init (); - - if (calib_point == CALIB_TL) { - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_X0, 1, - (unsigned char *)&x, 2)) { - return 1; - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_Y0, 1, - (unsigned char *)&y, 2)) { - return 1; - } - - /* verify written values */ - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_X0, 1, - (unsigned char *)&x_verify, 2)) { - return 1; - } - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_Y0, 1, - (unsigned char *)&y_verify, 2)) { - return 1; - } - if ((y != y_verify) || (x != x_verify)) { - print_identifier (); - printf ("error: verify error\n"); - return 1; - } - return 0; /* no error */ - } - else if (calib_point == CALIB_DR) { - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_X1, 1, - (unsigned char *)&x, 2)) { - return 1; - } - if (i2c_write_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_Y1, 1, - (unsigned char *)&y, 2)) { - return 1; - } - - /* verify written values */ - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_X1, 1, - (unsigned char *)&x_verify, 2)) { - return 1; - } - if (i2c_read_multiple (I2C_EEPROM_DEV_ADDR, TOUCH_Y1, 1, - (unsigned char *)&y_verify, 2)) { - return 1; - } - if ((y != y_verify) || (x != x_verify)) { - print_identifier (); - printf ("error: verify error\n"); - return 1; - } - return 0; - } - return 1; -#else - printf ("No I2C support enabled (CONFIG_CMD_I2C), could not write " - "to EEPROM\n"); - return (1); -#endif -} - - -static void touch_read_x_y (int *px, int *py) -{ - tsc2000_write(TSC2000_REG_ADC, DEFAULT_ADC | TC_AD0 | TC_AD1); - adc_wait_conversion_done(); - *px = tsc2000_read(TSC2000_REG_X); - - tsc2000_write(TSC2000_REG_ADC, DEFAULT_ADC | TC_AD2); - adc_wait_conversion_done(); - *py = tsc2000_read(TSC2000_REG_Y); -} - - -int do_rs485 (char * const *argv) -{ - int timeout; - char data[RS485_MAX_RECEIVE_BUF_LEN]; - - if (strcmp (argv[2], "send") == 0) { - return (rs485_send_line (argv[3])); - } - else if (strcmp (argv[2], "receive") == 0) { - timeout = simple_strtoul(argv[3], NULL, 10); - if (rs485_receive_chars (data, timeout) != 0) { - print_identifier (); - printf ("## nothing received\n"); - return (1); - } - else { - print_identifier (); - printf ("%s\n", data); - return (0); - } - } - printf ("%s: unknown command %s\n", __FUNCTION__, argv[2]); - return (1); /* unknown command, return error */ -} - - -static int rs485_send_line (const char *data) -{ - rs485_init (); - trab_rs485_enable_tx (); - rs485_puts (data); - rs485_putc ('\n'); - - return (0); -} - - -static int rs485_receive_chars (char *data, int timeout) -{ - int i; - int receive_count = 0; - - rs485_init (); - trab_rs485_enable_rx (); - - /* test every 1 ms for received characters to avoid a receive FIFO - * overrun (@ 38.400 Baud) */ - for (i = 0; i < (timeout * 1000); i++) { - while (rs485_tstc ()) { - if (receive_count >= RS485_MAX_RECEIVE_BUF_LEN-1) - break; - *data++ = rs485_getc (); - receive_count++; - } - udelay (1000); /* pause 1 ms */ - } - *data = '\0'; /* terminate string */ - - if (receive_count == 0) - return (1); - else - return (0); -} - - -int do_serial_number (char * const *argv) -{ -#if defined(CONFIG_CMD_I2C) - unsigned int serial_number; - - if (strcmp (argv[2], "read") == 0) { - if (i2c_read (I2C_EEPROM_DEV_ADDR, SERIAL_NUMBER, 1, - (unsigned char *)&serial_number, 4)) { - printf ("could not read from eeprom\n"); - return (1); - } - print_identifier (); - printf ("%08d\n", serial_number); - return (0); - } - else if (strcmp (argv[2], "write") == 0) { - serial_number = simple_strtoul(argv[3], NULL, 10); - if (i2c_write (I2C_EEPROM_DEV_ADDR, SERIAL_NUMBER, 1, - (unsigned char *)&serial_number, 4)) { - printf ("could not write to eeprom\n"); - return (1); - } - return (0); - } - printf ("%s: unknown command %s\n", __FUNCTION__, argv[2]); - return (1); /* unknown command, return error */ -#else - printf ("No I2C support enabled (CONFIG_CMD_I2C), could not write " - "to EEPROM\n"); - return (1); -#endif -} - - -int do_crc16 (void) -{ -#if defined(CONFIG_CMD_I2C) - int crc; - unsigned char buf[EEPROM_MAX_CRC_BUF]; - - if (i2c_read (I2C_EEPROM_DEV_ADDR, 0, 1, buf, 60)) { - printf ("could not read from eeprom\n"); - return (1); - } - crc = 0; /* start value of crc calculation */ - crc = updcrc (crc, buf, 60); - - print_identifier (); - printf ("crc16=%#04x\n", crc); - - if (i2c_write (I2C_EEPROM_DEV_ADDR, CRC16, 1, (unsigned char *)&crc, - sizeof (crc))) { - printf ("could not read from eeprom\n"); - return (1); - } - return (0); -#else - printf ("No I2C support enabled (CONFIG_CMD_I2C), could not write " - "to EEPROM\n"); - return (1); -#endif -} - - -/* - * Calculate, intelligently, the CRC of a dataset incrementally given a - * buffer full at a time. - * Initialize crc to 0 for XMODEM, -1 for CCITT. - * - * Usage: - * newcrc = updcrc( oldcrc, bufadr, buflen ) - * unsigned int oldcrc, buflen; - * char *bufadr; - * - * Compile with -DTEST to generate program that prints CRC of stdin to stdout. - * Compile with -DMAKETAB to print values for crctab to stdout - */ - - /* the CRC polynomial. This is used by XMODEM (almost CCITT). - * If you change P, you must change crctab[]'s initial value to what is - * printed by initcrctab() - */ -#define P 0x1021 - - /* number of bits in CRC: don't change it. */ -#define W 16 - - /* this the number of bits per char: don't change it. */ -#define B 8 - -static unsigned short crctab[1<<B] = { /* as calculated by initcrctab() */ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, - 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, - 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, - 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, - 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, - 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, - 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, - 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, - 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, - 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, - 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, - 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, - 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, - 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, - 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, - 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, - 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, - 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, - 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, - 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, - 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, - 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 - }; - -static unsigned short updcrc(unsigned short icrc, unsigned char *icp, - unsigned int icnt ) -{ - register unsigned short crc = icrc; - register unsigned char *cp = icp; - register unsigned int cnt = icnt; - - while (cnt--) - crc = (crc<<B) ^ crctab[(crc>>(W-B)) ^ *cp++]; - - return (crc); -} - - -int do_gain (char * const *argv) -{ - int range; - - range = simple_strtoul (argv[2], NULL, 10); - if ((range < 1) || (range > 3)) - { - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return 1; - } - - tsc2000_set_range (range); - return (0); -} - - -int do_eeprom (char * const *argv) -{ -#if defined(CONFIG_CMD_I2C) - if (strcmp (argv[2], "read") == 0) { - return (trab_eeprom_read (argv)); - } - - else if (strcmp (argv[2], "write") == 0) { - return (trab_eeprom_write (argv)); - } - - printf ("%s: invalid parameter %s\n", __FUNCTION__, argv[2]); - return (1); -#else - printf ("No I2C support enabled (CONFIG_CMD_I2C), could not write " - "to EEPROM\n"); - return (1); -#endif -} - -#if defined(CONFIG_CMD_I2C) -static int trab_eeprom_read (char * const *argv) -{ - int i; - int len; - unsigned int addr; - long int value = 0; - uchar *buffer; - - buffer = (uchar *) &value; - addr = simple_strtoul (argv[3], NULL, 10); - addr &= 0xfff; - len = simple_strtoul (argv[4], NULL, 10); - if ((len < 1) || (len > 4)) { - printf ("%s: invalid parameter %s\n", __FUNCTION__, - argv[4]); - return (1); - } - for (i = 0; i < len; i++) { - if (i2c_read (I2C_EEPROM_DEV_ADDR, addr+i, 1, buffer+i, 1)) { - printf ("%s: could not read from i2c device %#x" - ", addr %d\n", __FUNCTION__, - I2C_EEPROM_DEV_ADDR, addr); - return (1); - } - } - print_identifier (); - if (strcmp (argv[5], "-") == 0) { - if (len == 1) - printf ("%d\n", (signed char) value); - else if (len == 2) - printf ("%d\n", (signed short int) value); - else - printf ("%ld\n", value); - } - else { - if (len == 1) - printf ("%d\n", (unsigned char) value); - else if (len == 2) - printf ("%d\n", (unsigned short int) value); - else - printf ("%ld\n", (unsigned long int) value); - } - return (0); -} - -static int trab_eeprom_write (char * const *argv) -{ - int i; - int len; - unsigned int addr; - long int value = 0; - uchar *buffer; - - buffer = (uchar *) &value; - addr = simple_strtoul (argv[3], NULL, 10); - addr &= 0xfff; - len = simple_strtoul (argv[4], NULL, 10); - if ((len < 1) || (len > 4)) { - printf ("%s: invalid parameter %s\n", __FUNCTION__, - argv[4]); - return (1); - } - value = simple_strtol (argv[5], NULL, 10); - debug ("value=%ld\n", value); - for (i = 0; i < len; i++) { - if (i2c_write (I2C_EEPROM_DEV_ADDR, addr+i, 1, buffer+i, 1)) { - printf ("%s: could not write to i2c device %d" - ", addr %d\n", __FUNCTION__, - I2C_EEPROM_DEV_ADDR, addr); - return (1); - } -#if 0 - printf ("chip=%#x, addr+i=%#x+%d=%p, alen=%d, *buffer+i=" - "%#x+%d=%p=%#x \n",I2C_EEPROM_DEV_ADDR_DEV_ADDR , addr, - i, addr+i, 1, buffer, i, buffer+i, *(buffer+i)); -#endif - udelay (30000); /* wait for EEPROM ready */ - } - return (0); -} - -int i2c_write_multiple (uchar chip, uint addr, int alen, - uchar *buffer, int len) -{ - int i; - - if (alen != 1) { - printf ("%s: addr len other than 1 not supported\n", - __FUNCTION__); - return (1); - } - - for (i = 0; i < len; i++) { - if (i2c_write (chip, addr+i, alen, buffer+i, 1)) { - printf ("%s: could not write to i2c device %d" - ", addr %d\n", __FUNCTION__, chip, addr); - return (1); - } -#if 0 - printf ("chip=%#x, addr+i=%#x+%d=%p, alen=%d, *buffer+i=" - "%#x+%d=%p=\"%.1s\"\n", chip, addr, i, addr+i, - alen, buffer, i, buffer+i, buffer+i); -#endif - - udelay (30000); - } - return (0); -} - -int i2c_read_multiple ( uchar chip, uint addr, int alen, - uchar *buffer, int len) -{ - int i; - - if (alen != 1) { - printf ("%s: addr len other than 1 not supported\n", - __FUNCTION__); - return (1); - } - - for (i = 0; i < len; i++) { - if (i2c_read (chip, addr+i, alen, buffer+i, 1)) { - printf ("%s: could not read from i2c device %#x" - ", addr %d\n", __FUNCTION__, chip, addr); - return (1); - } - } - return (0); -} -#endif diff --git a/board/trab/tsc2000.c b/board/trab/tsc2000.c deleted file mode 100644 index 426ed9c520..0000000000 --- a/board/trab/tsc2000.c +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Functions to access the TSC2000 controller on TRAB board (used for scanning - * thermo sensors) - * - * Copyright (C) 2003 Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de - * - * Copyright (C) 2002 DENX Software Engineering, Wolfgang Denk, wd@denx.de - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#include <common.h> -#include <asm/arch/s3c24x0_cpu.h> -#include <asm/io.h> -#include <div64.h> -#include "tsc2000.h" - -#include "Pt1000_temp_data.h" - -/* helper function */ -#define abs(value) (((value) < 0) ? ((value)*-1) : (value)) - -/* - * Maximal allowed deviation between two immediate meassurments of an analog - * thermo channel. 1 DIGIT = 0.0276 °C. This is used to filter sporadic - * "jumps" in measurment. - */ -#define MAX_DEVIATION 18 /* unit: DIGITs of adc; 18 DIGIT = 0.5 °C */ - -void tsc2000_spi_init(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - int i; - - /* Configure I/O ports. */ - gpio->pdcon = (gpio->pdcon & 0xF3FFFF) | 0x040000; - gpio->pgcon = (gpio->pgcon & 0x0F3FFF) | 0x008000; - gpio->pgcon = (gpio->pgcon & 0x0CFFFF) | 0x020000; - gpio->pgcon = (gpio->pgcon & 0x03FFFF) | 0x080000; - - CLR_CS_TOUCH(); - - spi->ch[0].sppre = 0x1F; /* Baud-rate ca. 514kHz */ - spi->ch[0].sppin = 0x01; /* SPI-MOSI holds Level after last bit */ - spi->ch[0].spcon = 0x1A; /* Polling, Prescaler, Master, CPOL=0, - CPHA=1 */ - - /* Dummy byte ensures clock to be low. */ - for (i = 0; i < 10; i++) { - spi->ch[0].sptdat = 0xFF; - } - spi_wait_transmit_done(); -} - - -void spi_wait_transmit_done(void) -{ - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - - while (!(spi->ch[0].spsta & 0x01)) /* wait until transfer is done */ - ; -} - - -void tsc2000_write(unsigned short reg, unsigned short data) -{ - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - unsigned int command; - - SET_CS_TOUCH(); - command = reg; - spi->ch[0].sptdat = (command & 0xFF00) >> 8; - spi_wait_transmit_done(); - spi->ch[0].sptdat = (command & 0x00FF); - spi_wait_transmit_done(); - spi->ch[0].sptdat = (data & 0xFF00) >> 8; - spi_wait_transmit_done(); - spi->ch[0].sptdat = (data & 0x00FF); - spi_wait_transmit_done(); - - CLR_CS_TOUCH(); -} - - -unsigned short tsc2000_read (unsigned short reg) -{ - unsigned short command, data; - struct s3c24x0_spi * const spi = s3c24x0_get_base_spi(); - - SET_CS_TOUCH(); - command = 0x8000 | reg; - - spi->ch[0].sptdat = (command & 0xFF00) >> 8; - spi_wait_transmit_done(); - spi->ch[0].sptdat = (command & 0x00FF); - spi_wait_transmit_done(); - - spi->ch[0].sptdat = 0xFF; - spi_wait_transmit_done(); - data = spi->ch[0].sprdat; - spi->ch[0].sptdat = 0xFF; - spi_wait_transmit_done(); - - CLR_CS_TOUCH(); - return (spi->ch[0].sprdat & 0x0FF) | (data << 8); -} - - -void tsc2000_set_mux (unsigned int channel) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - CLR_MUX1_ENABLE; CLR_MUX2_ENABLE; - CLR_MUX3_ENABLE; CLR_MUX4_ENABLE; - switch (channel) { - case 0: - CLR_MUX0; CLR_MUX1; - SET_MUX1_ENABLE; - break; - case 1: - SET_MUX0; CLR_MUX1; - SET_MUX1_ENABLE; - break; - case 2: - CLR_MUX0; SET_MUX1; - SET_MUX1_ENABLE; - break; - case 3: - SET_MUX0; SET_MUX1; - SET_MUX1_ENABLE; - break; - case 4: - CLR_MUX0; CLR_MUX1; - SET_MUX2_ENABLE; - break; - case 5: - SET_MUX0; CLR_MUX1; - SET_MUX2_ENABLE; - break; - case 6: - CLR_MUX0; SET_MUX1; - SET_MUX2_ENABLE; - break; - case 7: - SET_MUX0; SET_MUX1; - SET_MUX2_ENABLE; - break; - case 8: - CLR_MUX0; CLR_MUX1; - SET_MUX3_ENABLE; - break; - case 9: - SET_MUX0; CLR_MUX1; - SET_MUX3_ENABLE; - break; - case 10: - CLR_MUX0; SET_MUX1; - SET_MUX3_ENABLE; - break; - case 11: - SET_MUX0; SET_MUX1; - SET_MUX3_ENABLE; - break; - case 12: - CLR_MUX0; CLR_MUX1; - SET_MUX4_ENABLE; - break; - case 13: - SET_MUX0; CLR_MUX1; - SET_MUX4_ENABLE; - break; - case 14: - CLR_MUX0; SET_MUX1; - SET_MUX4_ENABLE; - break; - case 15: - SET_MUX0; SET_MUX1; - SET_MUX4_ENABLE; - break; - default: - CLR_MUX0; CLR_MUX1; - } -} - - -void tsc2000_set_range (unsigned int range) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - switch (range) { - case 1: - CLR_SEL_TEMP_V_0; SET_SEL_TEMP_V_1; - CLR_SEL_TEMP_V_2; CLR_SEL_TEMP_V_3; - break; - case 2: - CLR_SEL_TEMP_V_0; CLR_SEL_TEMP_V_1; - CLR_SEL_TEMP_V_2; SET_SEL_TEMP_V_3; - break; - case 3: - SET_SEL_TEMP_V_0; CLR_SEL_TEMP_V_1; - SET_SEL_TEMP_V_2; CLR_SEL_TEMP_V_3; - break; - } -} - - -u16 tsc2000_read_channel (unsigned int channel) -{ - u16 res; - - tsc2000_set_mux(channel); - udelay(20 * TSC2000_DELAY_BASE); - - tsc2000_write(TSC2000_REG_ADC, 0x2036); - adc_wait_conversion_done (); - res = tsc2000_read(TSC2000_REG_AUX1); - return res; -} - - -s32 tsc2000_contact_temp (void) -{ - long adc_pt1000, offset; - long u_pt1000; - long contact_temp; - long temp1, temp2; - - tsc2000_reg_init (); - tsc2000_set_range (3); - - /* - * Because of sporadic "jumps" in the measured adc values every - * channel is read two times. If there is a significant difference - * between the two measurements, then print an error and do a third - * measurement, because it is very unlikely that a successive third - * measurement goes also wrong. - */ - temp1 = tsc2000_read_channel (14); - temp2 = tsc2000_read_channel (14); - if (abs(temp2 - temp1) < MAX_DEVIATION) - adc_pt1000 = temp2; - else { - printf ("%s: read adc value (channel 14) exceeded max allowed " - "deviation: %d * 0.0276 °C\n", - __FUNCTION__, MAX_DEVIATION); - printf ("adc value 1: %ld DIGITs\nadc value 2: %ld DIGITs\n", - temp1, temp2); - adc_pt1000 = tsc2000_read_channel (14); - printf ("use (third read) adc value: adc_pt1000 = " - "%ld DIGITs\n", adc_pt1000); - } - debug ("read channel 14 (pt1000 adc value): %ld\n", adc_pt1000); - - temp1 = tsc2000_read_channel (15); - temp2 = tsc2000_read_channel (15); - if (abs(temp2 - temp1) < MAX_DEVIATION) - offset = temp2; - else { - printf ("%s: read adc value (channel 15) exceeded max allowed " - "deviation: %d * 0.0276 °C\n", - __FUNCTION__, MAX_DEVIATION); - printf ("adc value 1: %ld DIGITs\nadc value 2: %ld DIGITs\n", - temp1, temp2); - offset = tsc2000_read_channel (15); - printf ("use (third read) adc value: offset = %ld DIGITs\n", - offset); - } - debug ("read channel 15 (offset): %ld\n", offset); - - /* - * Formula for calculating voltage drop on PT1000 resistor: u_pt1000 = - * x_range3 * (adc_raw - offset) / 10. Formula to calculate x_range3: - * x_range3 = (2500 * (1000000 + err_vref + err_amp3)) / (4095*6). The - * error correction Values err_vref and err_amp3 are assumed as 0 in - * u-boot, because this could cause only a very small error (< 1%). - */ - u_pt1000 = (101750 * (adc_pt1000 - offset)) / 10; - debug ("u_pt1000: %ld\n", u_pt1000); - - if (tsc2000_interpolate(u_pt1000, Pt1000_temp_table, - &contact_temp) == -1) { - printf ("%s: error interpolating PT1000 vlaue\n", - __FUNCTION__); - return (-1000); - } - debug ("contact_temp: %ld\n", contact_temp); - - return contact_temp; -} - - -void tsc2000_reg_init (void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - tsc2000_write(TSC2000_REG_ADC, 0x2036); - tsc2000_write(TSC2000_REG_REF, 0x0011); - tsc2000_write(TSC2000_REG_DACCTL, 0x0000); - - CON_MUX0; - CON_MUX1; - - CON_MUX1_ENABLE; - CON_MUX2_ENABLE; - CON_MUX3_ENABLE; - CON_MUX4_ENABLE; - - CON_SEL_TEMP_V_0; - CON_SEL_TEMP_V_1; - CON_SEL_TEMP_V_2; - CON_SEL_TEMP_V_3; - - tsc2000_set_mux(0); - tsc2000_set_range(0); -} - - -int tsc2000_interpolate(long value, long data[][2], long *result) -{ - int i; - unsigned long long val; - - /* the data is sorted and the first element is upper - * limit so we can easily check for out-of-band values - */ - if (data[0][0] < value || data[1][0] > value) - return -1; - - i = 1; - while (data[i][0] < value) - i++; - - /* To prevent overflow we have to store the intermediate - result in 'long long'. - */ - - val = ((unsigned long long)(data[i][1] - data[i-1][1]) - * (unsigned long long)(value - data[i-1][0])); - do_div(val, (data[i][0] - data[i-1][0])); - *result = data[i-1][1] + val; - - return 0; -} - - -void adc_wait_conversion_done(void) -{ - while (!(tsc2000_read(TSC2000_REG_ADC) & (1 << 14))); -} diff --git a/board/trab/tsc2000.h b/board/trab/tsc2000.h deleted file mode 100644 index f3cecb928e..0000000000 --- a/board/trab/tsc2000.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Functions to access the TSC2000 controller on TRAB board (used for scanning - * thermo sensors) - * - * Copyright (C) 2003 Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de - * - * Copyright (C) 2002 DENX Software Engineering, Wolfgang Denk, wd@denx.de - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -#ifndef _TSC2000_H_ -#define _TSC2000_H_ - -/* temperature channel multiplexer definitions */ -#define CON_MUX0 (gpio->pccon = (gpio->pccon & 0x0FFFFFCFF) | 0x00000100) -#define CLR_MUX0 (gpio->pcdat &= 0x0FFEF) -#define SET_MUX0 (gpio->pcdat |= 0x00010) - -#define CON_MUX1 (gpio->pccon = (gpio->pccon & 0x0FFFFF3FF) | 0x00000400) -#define CLR_MUX1 (gpio->pcdat &= 0x0FFDF) -#define SET_MUX1 (gpio->pcdat |= 0x00020) - -#define CON_MUX1_ENABLE (gpio->pccon = (gpio->pccon & 0x0FFFFCFFF) | 0x00001000) -#define CLR_MUX1_ENABLE (gpio->pcdat |= 0x00040) -#define SET_MUX1_ENABLE (gpio->pcdat &= 0x0FFBF) - -#define CON_MUX2_ENABLE (gpio->pccon = (gpio->pccon & 0x0FFFF3FFF) | 0x00004000) -#define CLR_MUX2_ENABLE (gpio->pcdat |= 0x00080) -#define SET_MUX2_ENABLE (gpio->pcdat &= 0x0FF7F) - -#define CON_MUX3_ENABLE (gpio->pccon = (gpio->pccon & 0x0FFFCFFFF) | 0x00010000) -#define CLR_MUX3_ENABLE (gpio->pcdat |= 0x00100) -#define SET_MUX3_ENABLE (gpio->pcdat &= 0x0FEFF) - -#define CON_MUX4_ENABLE (gpio->pccon = (gpio->pccon & 0x0FFF3FFFF) | 0x00040000) -#define CLR_MUX4_ENABLE (gpio->pcdat |= 0x00200) -#define SET_MUX4_ENABLE (gpio->pcdat &= 0x0FDFF) - -#define CON_SEL_TEMP_V_0 (gpio->pccon = (gpio->pccon & 0x0FFCFFFFF) | \ - 0x00100000) -#define CLR_SEL_TEMP_V_0 (gpio->pcdat &= 0x0FBFF) -#define SET_SEL_TEMP_V_0 (gpio->pcdat |= 0x00400) - -#define CON_SEL_TEMP_V_1 (gpio->pccon = (gpio->pccon & 0x0FF3FFFFF) | \ - 0x00400000) -#define CLR_SEL_TEMP_V_1 (gpio->pcdat &= 0x0F7FF) -#define SET_SEL_TEMP_V_1 (gpio->pcdat |= 0x00800) - -#define CON_SEL_TEMP_V_2 (gpio->pccon = (gpio->pccon & 0x0FCFFFFFF) | \ - 0x01000000) -#define CLR_SEL_TEMP_V_2 (gpio->pcdat &= 0x0EFFF) -#define SET_SEL_TEMP_V_2 (gpio->pcdat |= 0x01000) - -#define CON_SEL_TEMP_V_3 (gpio->pccon = (gpio->pccon & 0x0F3FFFFFF) | \ - 0x04000000) -#define CLR_SEL_TEMP_V_3 (gpio->pcdat &= 0x0DFFF) -#define SET_SEL_TEMP_V_3 (gpio->pcdat |= 0x02000) - -/* TSC2000 register definition */ -#define TSC2000_REG_X ((0 << 11) | (0 << 5)) -#define TSC2000_REG_Y ((0 << 11) | (1 << 5)) -#define TSC2000_REG_Z1 ((0 << 11) | (2 << 5)) -#define TSC2000_REG_Z2 ((0 << 11) | (3 << 5)) -#define TSC2000_REG_BAT1 ((0 << 11) | (5 << 5)) -#define TSC2000_REG_BAT2 ((0 << 11) | (6 << 5)) -#define TSC2000_REG_AUX1 ((0 << 11) | (7 << 5)) -#define TSC2000_REG_AUX2 ((0 << 11) | (8 << 5)) -#define TSC2000_REG_TEMP1 ((0 << 11) | (9 << 5)) -#define TSC2000_REG_TEMP2 ((0 << 11) | (0xA << 5)) -#define TSC2000_REG_DAC ((0 << 11) | (0xB << 5)) -#define TSC2000_REG_ZERO ((0 << 11) | (0x10 << 5)) -#define TSC2000_REG_ADC ((1 << 11) | (0 << 5)) -#define TSC2000_REG_DACCTL ((1 << 11) | (2 << 5)) -#define TSC2000_REG_REF ((1 << 11) | (3 << 5)) -#define TSC2000_REG_RESET ((1 << 11) | (4 << 5)) -#define TSC2000_REG_CONFIG ((1 << 11) | (5 << 5)) - -/* bit definition of TSC2000 ADC register */ -#define TC_PSM (1 << 15) -#define TC_STS (1 << 14) -#define TC_AD3 (1 << 13) -#define TC_AD2 (1 << 12) -#define TC_AD1 (1 << 11) -#define TC_AD0 (1 << 10) -#define TC_RS1 (1 << 9) -#define TC_RS0 (1 << 8) -#define TC_AV1 (1 << 7) -#define TC_AV0 (1 << 6) -#define TC_CL1 (1 << 5) -#define TC_CL0 (1 << 4) -#define TC_PV2 (1 << 3) -#define TC_PV1 (1 << 2) -#define TC_PV0 (1 << 1) - -/* default value for TSC2000 ADC register for use with touch functions */ -#define DEFAULT_ADC (TC_PV1 | TC_AV0 | TC_AV1 | TC_RS0) - -#define TSC2000_DELAY_BASE 500 -#define TSC2000_NO_SENSOR -0x10000 - -#define ERROR_BATTERY 220 /* must be adjusted, if R68 is changed on TRAB */ - -void tsc2000_write(unsigned short, unsigned short); -unsigned short tsc2000_read (unsigned short); -u16 tsc2000_read_channel (unsigned int); -void tsc2000_set_mux (unsigned int); -void tsc2000_set_range (unsigned int); -void tsc2000_reg_init (void); -s32 tsc2000_contact_temp (void); -void spi_wait_transmit_done (void); -void tsc2000_spi_init(void); -int tsc2000_interpolate(long value, long data[][2], long *result); -void adc_wait_conversion_done(void); - - -static inline void SET_CS_TOUCH(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - gpio->pddat &= 0x5FF; -} - - -static inline void CLR_CS_TOUCH(void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - gpio->pddat |= 0x200; -} - -#endif /* _TSC2000_H_ */ diff --git a/board/trab/u-boot.lds b/board/trab/u-boot.lds deleted file mode 100644 index 45944016f8..0000000000 --- a/board/trab/u-boot.lds +++ /dev/null @@ -1,64 +0,0 @@ -/* - * (C) Copyright 2002 - * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") -/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/ -OUTPUT_ARCH(arm) -ENTRY(_start) -SECTIONS -{ - . = 0x00000000; - - . = ALIGN(4); - .text : - { - arch/arm/cpu/arm920t/start.o (.text) - lib/zlib.o (.text) - lib/crc32.o (.text) - lib/string.o (.text) - - . = DEFINED(env_offset) ? env_offset : .; - common/env_embedded.o (.ppcenv) - - *(.text) - } - - . = ALIGN(4); - .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } - - . = ALIGN(4); - .data : { *(.data) } - - . = ALIGN(4); - .got : { *(.got) } - - . = .; - __u_boot_cmd_start = .; - .u_boot_cmd : { *(.u_boot_cmd) } - __u_boot_cmd_end = .; - - . = ALIGN(4); - __bss_start = .; - .bss (NOLOAD) : { *(.bss) . = ALIGN(4); } - __bss_end__ = .; -} diff --git a/board/trab/vfd.c b/board/trab/vfd.c deleted file mode 100644 index 9a2b1ba1a5..0000000000 --- a/board/trab/vfd.c +++ /dev/null @@ -1,574 +0,0 @@ -/* - * (C) Copyright 2001 - * Wolfgang Denk, DENX Software Engineering -- wd@denx.de - * - * See file CREDITS for list of people who contributed to this - * project. - * - * 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 - */ - -/************************************************************************/ -/* ** DEBUG SETTINGS */ -/************************************************************************/ - -/* #define DEBUG */ - -/************************************************************************/ -/* ** HEADER FILES */ -/************************************************************************/ - -#include <config.h> -#include <common.h> -#include <version.h> -#include <stdarg.h> -#include <linux/types.h> -#include <stdio_dev.h> -#include <asm/arch/s3c24x0_cpu.h> - -DECLARE_GLOBAL_DATA_PTR; - -#ifdef CONFIG_VFD - -/************************************************************************/ -/* ** CONFIG STUFF -- should be moved to board config file */ -/************************************************************************/ - -/************************************************************************/ - -#ifndef PAGE_SIZE -#define PAGE_SIZE 4096 -#endif - -#define ROT 0x09 -#define BLAU 0x0C -#define VIOLETT 0X0D - -/* MAGIC */ -#define FRAME_BUF_SIZE ((256*4*56)/8) -#define frame_buf_offs 4 - -/* defines for starting Timer3 as CPLD-Clk */ -#define START3 (1 << 16) -#define UPDATE3 (1 << 17) -#define INVERT3 (1 << 18) -#define RELOAD3 (1 << 19) - -/* CPLD-Register for controlling vfd-blank-signal */ -#define VFD_DISABLE (*(volatile uchar *)0x04038000=0x0000) -#define VFD_ENABLE (*(volatile uchar *)0x04038000=0x0001) - -/* Supported VFD Types */ -#define VFD_TYPE_T119C 1 /* Noritake T119C VFD */ -#define VFD_TYPE_MN11236 2 - -/*#define NEW_CPLD_CLK*/ - -int vfd_board_id; - -/* taken from armboot/common/vfd.c */ -unsigned long adr_vfd_table[112][18][2][4][2]; -unsigned char bit_vfd_table[112][18][2][4][2]; - -/* - * initialize the values for the VFD-grid-control in the framebuffer - */ -void init_grid_ctrl(void) -{ - ulong adr, grid_cycle; - unsigned int bit, display; - unsigned char temp, bit_nr; - - /* - * clear frame buffer (logical clear => set to "black") - */ - memset ((void *)(gd->fb_base), 0, FRAME_BUF_SIZE); - - switch (gd->vfd_type) { - case VFD_TYPE_T119C: - for (display=0; display<4; display++) { - for(grid_cycle=0; grid_cycle<56; grid_cycle++) { - bit = grid_cycle * 256 * 4 + - (grid_cycle + 200) * 4 + - frame_buf_offs + display; - /* wrap arround if offset (see manual S3C2400) */ - if (bit>=FRAME_BUF_SIZE*8) - bit = bit - (FRAME_BUF_SIZE * 8); - adr = gd->fb_base + (bit/32) * 4 + (3 - (bit%32) / 8); - bit_nr = bit % 8; - bit_nr = (bit_nr > 3) ? bit_nr-4 : bit_nr+4; - temp=(*(volatile unsigned char*)(adr)); - temp |= (1<<bit_nr); - (*(volatile unsigned char*)(adr))=temp; - - if(grid_cycle<55) - bit = grid_cycle*256*4+(grid_cycle+201)*4+frame_buf_offs+display; - else - bit = grid_cycle*256*4+200*4+frame_buf_offs+display-4; /* grid nr. 0 */ - /* wrap arround if offset (see manual S3C2400) */ - if (bit>=FRAME_BUF_SIZE*8) - bit = bit-(FRAME_BUF_SIZE*8); - adr = gd->fb_base+(bit/32)*4+(3-(bit%32)/8); - bit_nr = bit%8; - bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4; - temp=(*(volatile unsigned char*)(adr)); - temp |= (1<<bit_nr); - (*(volatile unsigned char*)(adr))=temp; - } - } - break; - case VFD_TYPE_MN11236: - for (display=0; display<4; display++) { - for (grid_cycle=0; grid_cycle<38; grid_cycle++) { - bit = grid_cycle * 256 * 4 + - (253 - grid_cycle) * 4 + - frame_buf_offs + display; - /* wrap arround if offset (see manual S3C2400) */ - if (bit>=FRAME_BUF_SIZE*8) - bit = bit - (FRAME_BUF_SIZE * 8); - adr = gd->fb_base + (bit/32) * 4 + (3 - (bit%32) / 8); - bit_nr = bit % 8; - bit_nr = (bit_nr > 3) ? bit_nr-4 : bit_nr+4; - temp=(*(volatile unsigned char*)(adr)); - temp |= (1<<bit_nr); - (*(volatile unsigned char*)(adr))=temp; - - if(grid_cycle<37) - bit = grid_cycle*256*4+(252-grid_cycle)*4+frame_buf_offs+display; - - /* wrap arround if offset (see manual S3C2400) */ - if (bit>=FRAME_BUF_SIZE*8) - bit = bit-(FRAME_BUF_SIZE*8); - adr = gd->fb_base+(bit/32)*4+(3-(bit%32)/8); - bit_nr = bit%8; - bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4; - temp=(*(volatile unsigned char*)(adr)); - temp |= (1<<bit_nr); - (*(volatile unsigned char*)(adr))=temp; - } - } - break; - default: - printf ("Warning: unknown display type\n"); - break; - } -} - -/* - *create translation table for getting easy the right position in the - *physical framebuffer for some x/y-coordinates of the VFDs - */ -void create_vfd_table(void) -{ - unsigned long vfd_table[112][18][2][4][2]; - unsigned int x, y, color, display, entry, pixel; - unsigned int x_abcdef = 0; - - switch (gd->vfd_type) { - case VFD_TYPE_T119C: - for(y=0; y<=17; y++) { /* Line */ - for(x=0; x<=111; x++) { /* Column */ - for(display=0; display <=3; display++) { - - /* Display 0 blue pixels */ - vfd_table[x][y][0][display][0] = - (x==0) ? y*16+display - : (x%4)*4+y*16+((x-1)/2)*1024+display; - /* Display 0 red pixels */ - vfd_table[x][y][1][display][0] = - (x==0) ? y*16+512+display - : (x%4)*4+y*16+((x-1)/2)*1024+512+display; - } - } - } - break; - case VFD_TYPE_MN11236: - for(y=0; y<=17; y++) { /* Line */ - for(x=0; x<=111; x++) { /* Column */ - for(display=0; display <=3; display++) { - - vfd_table[x][y][0][display][0]=0; - vfd_table[x][y][0][display][1]=0; - vfd_table[x][y][1][display][0]=0; - vfd_table[x][y][1][display][1]=0; - - switch (x%6) { - case 0: x_abcdef=0; break; /* a -> a */ - case 1: x_abcdef=2; break; /* b -> c */ - case 2: x_abcdef=4; break; /* c -> e */ - case 3: x_abcdef=5; break; /* d -> f */ - case 4: x_abcdef=3; break; /* e -> d */ - case 5: x_abcdef=1; break; /* f -> b */ - } - - /* blue pixels */ - vfd_table[x][y][0][display][0] = - (x>1) ? x_abcdef*4+((x-1)/3)*1024+y*48+display - : x_abcdef*4+ 0+y*48+display; - /* blue pixels */ - if (x>1 && (x-1)%3) - vfd_table[x][y][0][display][1] = x_abcdef*4+((x-1)/3+1)*1024+y*48+display; - - /* red pixels */ - vfd_table[x][y][1][display][0] = - (x>1) ? x_abcdef*4+24+((x-1)/3)*1024+y*48+display - : x_abcdef*4+24+ 0+y*48+display; - /* red pixels */ - if (x>1 && (x-1)%3) - vfd_table[x][y][1][display][1] = x_abcdef*4+24+((x-1)/3+1)*1024+y*48+display; - } - } - } - break; - default: - /* do nothing */ - return; - } - - /* - * Create table with entries for physical byte adresses and - * bit-number within the byte - * from table with bit-numbers within the total framebuffer - */ - for(y=0;y<18;y++) { - for(x=0;x<112;x++) { - for(color=0;color<2;color++) { - for(display=0;display<4;display++) { - for(entry=0;entry<2;entry++) { - unsigned long adr = gd->fb_base; - unsigned int bit_nr = 0; - - pixel = vfd_table[x][y][color][display][entry] + frame_buf_offs; - /* - * wrap arround if offset - * (see manual S3C2400) - */ - if (pixel>=FRAME_BUF_SIZE*8) - pixel = pixel-(FRAME_BUF_SIZE*8); - adr = gd->fb_base+(pixel/32)*4+(3-(pixel%32)/8); - bit_nr = pixel%8; - bit_nr = (bit_nr>3)?bit_nr-4:bit_nr+4; - - adr_vfd_table[x][y][color][display][entry] = adr; - bit_vfd_table[x][y][color][display][entry] = bit_nr; - } - } - } - } - } -} - -/* - * Set/clear pixel of the VFDs - */ -void set_vfd_pixel(unsigned char x, unsigned char y, - unsigned char color, unsigned char display, - unsigned char value) -{ - ulong adr; - unsigned char bit_nr, temp; - - if (! gd->vfd_type) { - /* Unknown type. */ - return; - } - - /* Pixel-Eintrag Nr. 1 */ - adr = adr_vfd_table[x][y][color][display][0]; - /* Pixel-Eintrag Nr. 1 */ - bit_nr = bit_vfd_table[x][y][color][display][0]; - temp=(*(volatile unsigned char*)(adr)); - - if (value) - temp |= (1<<bit_nr); - else - temp &= ~(1<<bit_nr); - - (*(volatile unsigned char*)(adr))=temp; -} - -/* - * transfer image from BMP-File - */ -void transfer_pic(int display, unsigned char *adr, int height, int width) -{ - int x, y; - unsigned char temp; - - for (; height > 0; height -= 18) - { - if (height > 18) - y = 18; - else - y = height; - for (; y > 0; y--) - { - for (x = 0; x < width; x += 2) - { - temp = *adr++; - set_vfd_pixel(x, y-1, 0, display, 0); - set_vfd_pixel(x, y-1, 1, display, 0); - if ((temp >> 4) == BLAU) - set_vfd_pixel(x, y-1, 0, display, 1); - else if ((temp >> 4) == ROT) - set_vfd_pixel(x, y-1, 1, display, 1); - else if ((temp >> 4) == VIOLETT) - { - set_vfd_pixel(x, y-1, 0, display, 1); - set_vfd_pixel(x, y-1, 1, display, 1); - } - set_vfd_pixel(x+1, y-1, 0, display, 0); - set_vfd_pixel(x+1, y-1, 1, display, 0); - if ((temp & 0x0F) == BLAU) - set_vfd_pixel(x+1, y-1, 0, display, 1); - else if ((temp & 0x0F) == ROT) - set_vfd_pixel(x+1, y-1, 1, display, 1); - else if ((temp & 0x0F) == VIOLETT) - { - set_vfd_pixel(x+1, y-1, 0, display, 1); - set_vfd_pixel(x+1, y-1, 1, display, 1); - } - } - } - if (display > 0) - display--; - else - display = 3; - } -} - -/* - * This function initializes VFD clock that is needed for the CPLD that - * manages the keyboard. - */ -int vfd_init_clocks (void) -{ - int i; - - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - struct s3c24x0_timers * const timers = s3c24x0_get_base_timers(); - struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd(); - - /* try to determine display type from the value - * defined by pull-ups - */ - gpio->pcup = (gpio->pcup & 0xFFF0); /* activate GPC0...GPC3 pullups */ - gpio->pccon = (gpio->pccon & 0xFFFFFF00); /* cfg GPC0...GPC3 inputs */ - /* allow signals to settle */ - for (i=0; i<10000; i++) /* udelay isn't working yet at this point! */ - __asm__("NOP"); - vfd_board_id = (~gpio->pcdat) & 0x000F; /* read GPC0...GPC3 port pins */ - - VFD_DISABLE; /* activate blank for the vfd */ - -#define NEW_CPLD_CLK - -#ifdef NEW_CPLD_CLK - if (vfd_board_id) { - /* If new board revision, then use PWM 3 as cpld-clock */ - /* Enable 500 Hz timer for fill level sensor to operate properly */ - /* Configure TOUT3 as functional pin, disable pull-up */ - gpio->pdcon &= ~0x30000; - gpio->pdcon |= 0x20000; - gpio->pdup |= (1 << 8); - - /* Configure the prescaler */ - timers->tcfg0 &= ~0xff00; - timers->tcfg0 |= 0x0f00; - - /* Select MUX input (divider) for timer3 (1/16) */ - timers->tcfg1 &= ~0xf000; - timers->tcfg1 |= 0x3000; - - /* Enable autoreload and set the counter and compare - * registers to values for the 500 Hz clock - * (for a given prescaler (15) and divider (16)): - * counter = (66000000 / 500) >> 9; - */ - timers->ch[3].tcntb = 0x101; - timers->ch[3].tcmpb = 0x101 / 2; - - /* Start timer */ - timers->tcon = (timers->tcon | UPDATE3 | RELOAD3) & ~INVERT3; - timers->tcon = (timers->tcon | START3) & ~UPDATE3; - } -#endif - /* If old board revision, then use vm-signal as cpld-clock */ - lcd->lcdcon2 = 0x00FFC000; - lcd->lcdcon3 = 0x0007FF00; - lcd->lcdcon4 = 0x00000000; - lcd->lcdcon5 = 0x00000400; - lcd->lcdcon1 = 0x00000B75; - /* VM (GPD1) is used as clock for the CPLD */ - gpio->pdcon = (gpio->pdcon & 0xFFFFFFF3) | 0x00000008; - - return 0; -} - -/* - * initialize LCD-Controller of the S3C2400 for using VFDs - * - * VFD detection depends on the board revision: - * starting from Rev. 200 a type code can be read from the data pins, - * driven by some pull-up resistors; all earlier systems must be - * manually configured. The type is set in the "vfd_type" environment - * variable. - */ -int drv_vfd_init(void) -{ - struct s3c24x0_lcd * const lcd = s3c24x0_get_base_lcd(); - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - char *tmp; - ulong palette; - static int vfd_init_done = 0; - int vfd_inv_data = 0; - - if (vfd_init_done != 0) - return (0); - vfd_init_done = 1; - - debug("Detecting Revison of WA4-VFD: ID=0x%X\n", vfd_board_id); - - switch (vfd_board_id) { - case 0: /* board revision < Rev.200 */ - if ((tmp = getenv ("vfd_type")) == NULL) { - break; - } - if (strcmp(tmp, "T119C") == 0) { - gd->vfd_type = VFD_TYPE_T119C; - } else if (strcmp(tmp, "MN11236") == 0) { - gd->vfd_type = VFD_TYPE_MN11236; - } else { - /* cannot use printf for a warning here */ - gd->vfd_type = 0; /* unknown */ - } - - break; - default: /* default to MN11236, data inverted */ - gd->vfd_type = VFD_TYPE_MN11236; - vfd_inv_data = 1; - setenv ("vfd_type", "MN11236"); - } - debug ("VFD type: %s%s\n", - (gd->vfd_type == VFD_TYPE_T119C) ? "T119C" : - (gd->vfd_type == VFD_TYPE_MN11236) ? "MN11236" : - "unknown", - vfd_inv_data ? ", inverted data" : ""); - - gd->fb_base = gd->fb_base; - create_vfd_table(); - init_grid_ctrl(); - - for (palette=0; palette < 16; palette++) - (*(volatile unsigned int*)(PALETTE+(palette*4)))=palette; - for (palette=16; palette < 256; palette++) - (*(volatile unsigned int*)(PALETTE+(palette*4)))=0x00; - - /* - * Hinweis: Der Framebuffer ist um genau ein Nibble verschoben - * Das erste angezeigte Pixel wird aus dem zweiten Nibble geholt - * das letzte angezeigte Pixel wird aus dem ersten Nibble geholt - * (wrap around) - * see manual S3C2400 - */ - /* Stopp LCD-Controller */ - lcd->lcdcon1 = 0x00000000; - /* frame buffer startadr */ - lcd->lcdsaddr1 = gd->fb_base >> 1; - /* frame buffer endadr */ - lcd->lcdsaddr2 = (gd->fb_base + FRAME_BUF_SIZE) >> 1; - lcd->lcdsaddr3 = ((256/4)); - lcd->lcdcon2 = 0x000DC000; - if(gd->vfd_type == VFD_TYPE_MN11236) - lcd->lcdcon2 = 37 << 14; /* MN11236: 38 lines */ - else - lcd->lcdcon2 = 55 << 14; /* T119C: 56 lines */ - lcd->lcdcon3 = 0x0051000A; - lcd->lcdcon4 = 0x00000001; - if (gd->vfd_type && vfd_inv_data) - lcd->lcdcon5 = 0x000004C0; - else - lcd->lcdcon5 = 0x00000440; - - /* Port pins as LCD output */ - gpio->pccon = (gpio->pccon & 0xFFFFFF00) | 0x000000AA; - gpio->pdcon = (gpio->pdcon & 0xFFFFFF03) | 0x000000A8; - - /* Synchronize VFD enable with LCD controller to avoid flicker */ - lcd->lcdcon1 = 0x00000B75; /* Start LCD-Controller */ - while ((lcd->lcdcon5 & 0x180000) != 0x100000) /* Wait for VSYNC end */ - ; - while ((lcd->lcdcon5 & 0x060000) != 0x040000) /* Wait for next HSYNC */ - ; - while ((lcd->lcdcon5 & 0x060000) == 0x040000) - ; - while ((lcd->lcdcon5 & 0x060000) != 0x000000) - ; - if(gd->vfd_type) - VFD_ENABLE; - - debug("LCDSADDR1: %lX\n", lcd->lcdsaddr1); - debug("LCDSADDR2: %lX\n", lcd->lcdsaddr2); - debug("LCDSADDR3: %lX\n", lcd->lcdsaddr3); - - return 0; -} - -/* - * Disable VFD: should be run before resetting the system: - * disable VM, enable pull-up - */ -void disable_vfd (void) -{ - struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio(); - - VFD_DISABLE; - gpio->pdcon &= ~0xC; - gpio->pdup &= ~0x2; -} - -/************************************************************************/ -/* ** ROM capable initialization part - needed to reserve FB memory */ -/************************************************************************/ - -/* - * This is called early in the system initialization to grab memory - * for the VFD controller. - * - * Note that this is running from ROM, so no write access to global data. - */ -ulong vfd_setmem (ulong addr) -{ - ulong size; - - /* Round up to nearest full page */ - size = (FRAME_BUF_SIZE + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); - - debug ("Reserving %ldk for VFD Framebuffer at: %08lx\n", size>>10, addr); - - return (size); -} - -/* - * Calculate fb size for VIDEOLFB_ATAG. Size returned contains fb, - * descriptors and palette areas. - */ -ulong calc_fbsize (void) -{ - return FRAME_BUF_SIZE; -} - -#endif /* CONFIG_VFD */ |