📄 system3.c
字号:
/********************************************************************** * system3.c * * AUTOR: SELETZ * * Implements several POST routines for PT System 3 platform * * Copyright (C) 2001 Stefan Eletzhofer <stefan.eletzhofer@www.eletztrick.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#ident "$Id: system3.c,v 1.8 2002/01/07 19:36:15 seletz Exp $"/********************************************************************** * Includes */#ifdef HAVE_CONFIG_H# include <blob/config.h>#endif#include <blob/types.h>#include <blob/errno.h>#include <blob/util.h>#include <blob/command.h>#include <blob/init.h>#include <blob/serial.h>#include <blob/time.h>#include <blob/sa1100.h>#include <blob/sa1111.h>#include <blob/lcd.h>/********************************************************************** * defines */#define MEM(adr) (*((u32*)adr))#define SET(reg,bit) ((reg) |= (1<<(bit)))#define CLR(reg,bit) ((reg) &= ~(1<<(bit)))/* Optimization barrier *//* The "volatile" is due to gcc bugs */#define barrier() __asm__ __volatile__("": : :"memory")#define CPLD_BASE (0x10000000)#define CPLD_ID (CPLD_BASE + 0x00)#define CPLD_IRQ (CPLD_BASE + 0x24)#define CPLD_0 (CPLD_BASE + 0x90)#define CPLD_1 (CPLD_BASE + 0xA0)#define CPLD_2 (CPLD_BASE + 0xB0)/********************************************************************** * types *//********************************************************************** * program globals *//********************************************************************** * module globals *//********************************************************************** * prototypes */static void sa1111_init();/*********************************************************************//*********************************************************************//*********************************************************************/#if defined(CONFIG_LCD_SUPPORT)__initlist(sa1111_init, INIT_LEVEL_INITIAL_HARDWARE);static void sa1111_init(){ /* switch on clock for sa1111 */ GAFR |= GPIO_32_768kHz; GPDR |= GPIO_32_768kHz; TUCR = TUCR_3_6864MHz; /* Now, set up the PLL and RCLK in the SA-1111: */ SBI_SKCR = SKCR_PLL_BYPASS | SKCR_RDYEN | SKCR_OE_EN; msleep(100); SBI_SKCR = SKCR_PLL_BYPASS | SKCR_RCLKEN | SKCR_RDYEN | SKCR_OE_EN; SerialOutputString( "SA1111 ID: " ); SerialOutputHex( SBI_SKID ); SerialOutputString( "\n" ); /* * SA-1111 Register Access Bus should now be available. Clocks for * any other SA-1111 functional blocks must be enabled separately * using the SKPCR. */ SKPCR |= SKPCR_DCLKEN | SKPCR_PWMCLKEN; /* * If the system is going to use the SA-1111 DMA engines, set up * the memory bus request/grant pins. Also configure the shared * memory controller on the SA-1111 (SA-1111 Developer's Manual, * section 3.2.3) and power up the DMA bus clock: */ GAFR |= (GPIO_MBGNT | GPIO_MBREQ); GPDR |= GPIO_MBGNT; GPDR &= ~GPIO_MBREQ; TUCR |= TUCR_MR; SBI_SMCR = (SMCR_DTIM | SMCR_MBGE | FInsrt(FExtr(MDCNFG, MDCNFG_SA1110_DRAC0), SMCR_DRAC) | ((FExtr(MDCNFG, MDCNFG_SA1110_TDL0)==3) ? SMCR_CLAT : 0));}static void system3_init_hardware(void){ /* select serial driver */ serial_driver = &sa11x0_serial_driver;}__initlist(system3_init_hardware, INIT_LEVEL_DRIVER_SELECTION);/********************************************************************** * Overwrite LCD functions special for this platform */int lcd_power_up( void ){ SET( MEM( CPLD_0 ), 7 ); PB_DDR = 0xFFFFFFFF; SKPEN0 = 1; SKPEN1 = 1; lcd_contrast( 0x95 ); lcd_brightness( 240 ); lcd_backlight_on(); return 0;}int lcd_power_down( void ){ SKPEN0 = 0; SKPEN0 = 0; CLR( MEM( CPLD_0 ), 7 ); return 0;}int lcd_backlight_on( void ){ SET( MEM( CPLD_0 ), 2 ); return 0;}int lcd_backlight_off( void ){ CLR( MEM( CPLD_0 ), 2 ); return 0;}int lcd_contrast( int value ){ SKPWM0 = value; return 0;}int lcd_brightness( int value ){ SKPWM1 = value; return 0;}#endif // defined(CONFIG_LCD_SUPPORT)/********************************************************************** * static functions */#if 1#define SMC_BASE 0x18000000#define BANK_SELECT 14#define LAN91C96_ECOR 0x0#define LAN91C96_ECSR 0x2#define ECOR_RESET 0x80#define ECOR_LEVEL_IRQ 0x40#define ECOR_WR_ATTRIB 0x02#define ECOR_ENABLE 0x01#define ECSR_IOIS8 0x20#define ECSR_PWRDWN 0x04#define ECSR_INT 0x02#define SMC_inb( r ) (*((volatile u8 *)(base+((r)<<2))))static inline unsigned short __SMC_inw(unsigned base, int r){ unsigned char b1, b2; msleep(1); b1 = SMC_inb(r); msleep(1); b2 = SMC_inb(r+1); return (b2 << 8) | b1;}#define SMC_inw(r) __SMC_inw(base, r)#define SMC_outb( d, r ) (*((volatile u8 *)(base+((r)<<2))) = (u8)(d))#define SMC_outw( d, r ) do { \ msleep(1);\ SMC_outb((d), r); \ msleep(1);\ SMC_outb((d)>>8, (r)+1);} while (0)static int smctest( int argc, char *argv[] ){ u32 base = (u32)SMC_BASE; u32 *attr; u16 bank; /* 0x1a020000 */ attr = (u32 *)(((u32)base | (1<<25)) + (0x8000*4)); /* enable the device */ attr[LAN91C96_ECOR] |= ECOR_RESET; msleep(100); /* the device will ignore all writes to the enable bit while reset is * asserted, even if the reset bit is cleared in the same write. Must * clear reset first, then enable the device. */ attr[LAN91C96_ECOR] &= ~ECOR_RESET; attr[LAN91C96_ECOR] |= ECOR_ENABLE; /* force byte mode */ attr[LAN91C96_ECSR] |= ECSR_IOIS8; bank = SMC_inw( BANK_SELECT ); SerialOutputString( "bank " ); SerialOutputHex( bank & 0xffff ); SerialOutputString( "\n" ); SMC_outw( 0, BANK_SELECT ); bank = SMC_inw( BANK_SELECT ); SerialOutputString( "bank " ); SerialOutputHex( bank & 0xffff ); SerialOutputString( "\n" ); return 0;}static char smctesthelp[] = "test smc 91c96 ethernet chip\n";__commandlist(smctest, "smctest", smctesthelp);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -