Merge preliminary rdc-2.6 support (Airlink101 AR525W)
SVN-Revision: 5138
This commit is contained in:
		| @@ -16,6 +16,7 @@ $(eval $(call kernel_template,2.4,ar7,2_4_AR7)) | |||||||
| $(eval $(call kernel_template,2.6,brcm,2_6_BRCM)) | $(eval $(call kernel_template,2.6,brcm,2_6_BRCM)) | ||||||
| $(eval $(call kernel_template,2.6,brcm63xx,2_6_BRCM63XX)) | $(eval $(call kernel_template,2.6,brcm63xx,2_6_BRCM63XX)) | ||||||
| $(eval $(call kernel_template,2.6,rb532,2_6_RB532)) | $(eval $(call kernel_template,2.6,rb532,2_6_RB532)) | ||||||
|  | $(eval $(call kernel_template,2.6,rdc,2_6_RDC)) | ||||||
| $(eval $(call kernel_template,2.6,x86,2_6_X86)) | $(eval $(call kernel_template,2.6,x86,2_6_X86)) | ||||||
| $(eval $(call kernel_template,2.6,uml,2_6_UML)) | $(eval $(call kernel_template,2.6,uml,2_6_UML)) | ||||||
| $(eval $(call kernel_template,2.4,ar531x,2_4_AR531X)) | $(eval $(call kernel_template,2.4,ar531x,2_4_AR531X)) | ||||||
|   | |||||||
| @@ -98,6 +98,16 @@ config LINUX_2_6_RB532 | |||||||
| 	select PCI_SUPPORT | 	select PCI_SUPPORT | ||||||
| 	select USES_JFFS2 | 	select USES_JFFS2 | ||||||
|  |  | ||||||
|  | config LINUX_2_6_RDC | ||||||
|  | 	bool "RDC x86 [2.6]" | ||||||
|  | 	depends BROKEN | ||||||
|  | 	select i386 | ||||||
|  | 	select LINUX_2_6 | ||||||
|  | 	select PCI_SUPPORT | ||||||
|  | 	select USES_JFFS2 | ||||||
|  | 	help | ||||||
|  | 	  Build firmware images for RDC R3203 based routers (e.g. Airlink101 AR525W) | ||||||
|  |  | ||||||
| config LINUX_2_4_AR7 | config LINUX_2_4_AR7 | ||||||
| 	bool "TI AR7 [2.4]" | 	bool "TI AR7 [2.4]" | ||||||
| 	select mipsel | 	select mipsel | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								target/image/rdc/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								target/image/rdc/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | #  | ||||||
|  | # Copyright (C) 2006 OpenWrt.org | ||||||
|  | # | ||||||
|  | # This is free software, licensed under the GNU General Public License v2. | ||||||
|  | # See /LICENSE for more information. | ||||||
|  | # | ||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  | include $(INCLUDE_DIR)/image.mk | ||||||
|  |  | ||||||
|  | define Build/Clean | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Prepare | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Prepare | ||||||
|  |         cat $(KDIR)/vmlinux | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $(KDIR)/vmlinux.lzma | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Build/ar525w | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | $(call Image/Build/ar525w,$(1),$(patsubst jffs2-%,jffs2,$(1))) | ||||||
|  |  | ||||||
|  | $(eval $(call BuildImage)) | ||||||
							
								
								
									
										21
									
								
								target/linux/rdc-2.6/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								target/linux/rdc-2.6/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | #  | ||||||
|  | # Copyright (C) 2006 OpenWrt.org | ||||||
|  | # | ||||||
|  | # This is free software, licensed under the GNU General Public License v2. | ||||||
|  | # See /LICENSE for more information. | ||||||
|  | # | ||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
|  | LINUX_VERSION:=2.6.17 | ||||||
|  | LINUX_RELEASE:=1 | ||||||
|  | LINUX_KERNEL_MD5SUM:=37ddefe96625502161f075b9d907f21e | ||||||
|  |  | ||||||
|  | include ./config | ||||||
|  | include $(INCLUDE_DIR)/kernel.mk | ||||||
|  | include $(INCLUDE_DIR)/kernel-build.mk | ||||||
|  |  | ||||||
|  | $(LINUX_DIR)/.patched: $(LINUX_DIR)/.unpacked | ||||||
|  | 	[ -d ../generic-$(KERNEL)/patches ] && $(PATCH) $(LINUX_DIR) ../generic-$(KERNEL)/patches | ||||||
|  | 	[ -d ./patches ] && $(PATCH) $(LINUX_DIR) ./patches | ||||||
|  | 	@$(CP) config $(LINUX_DIR)/.config | ||||||
|  | 	touch $@ | ||||||
							
								
								
									
										1506
									
								
								target/linux/rdc-2.6/config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1506
									
								
								target/linux/rdc-2.6/config
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										861
									
								
								target/linux/rdc-2.6/patches/000-rdc_fixes.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										861
									
								
								target/linux/rdc-2.6/patches/000-rdc_fixes.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,861 @@ | |||||||
|  | diff -urN linux-2.6.17/arch/i386/Kconfig linux-2.6.17.new/arch/i386/Kconfig | ||||||
|  | --- linux-2.6.17/arch/i386/Kconfig	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/Kconfig	2006-10-07 22:33:09.000000000 +0200 | ||||||
|  | @@ -167,6 +167,14 @@ | ||||||
|  |  	  Only choose this option if you have such a system, otherwise you | ||||||
|  |  	  should say N here. | ||||||
|  |   | ||||||
|  | +config X86_RDC | ||||||
|  | +	bool "Support for RDC 3211 boards" | ||||||
|  | +	help | ||||||
|  | +	  Support for RDC 3211 sustems. Say 'Y' here if ther kernel is  | ||||||
|  | +	  supposed to run on an IA-32 RDC R3211 system. | ||||||
|  | +	  Only choose this option if you have such as system, otherwise you | ||||||
|  | +	  should say N here. | ||||||
|  | + | ||||||
|  |  endchoice | ||||||
|  |   | ||||||
|  |  config ACPI_SRAT | ||||||
|  | diff -urN linux-2.6.17/arch/i386/kernel/time.c linux-2.6.17.new/arch/i386/kernel/time.c | ||||||
|  | --- linux-2.6.17/arch/i386/kernel/time.c	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/kernel/time.c	2006-10-07 22:23:05.000000000 +0200 | ||||||
|  | @@ -479,7 +479,8 @@ | ||||||
|  |  		return; | ||||||
|  |  	} | ||||||
|  |  #endif | ||||||
|  | -	xtime.tv_sec = get_cmos_time(); | ||||||
|  | +	/* RDC board does not have CMOS */ | ||||||
|  | +	xtime.tv_sec = 0; | ||||||
|  |  	xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ); | ||||||
|  |  	set_normalized_timespec(&wall_to_monotonic, | ||||||
|  |  		-xtime.tv_sec, -xtime.tv_nsec); | ||||||
|  | diff -urN linux-2.6.17/arch/i386/mach-rdc/led.c linux-2.6.17.new/arch/i386/mach-rdc/led.c | ||||||
|  | --- linux-2.6.17/arch/i386/mach-rdc/led.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/mach-rdc/led.c	2006-10-07 23:55:59.000000000 +0200 | ||||||
|  | @@ -0,0 +1,743 @@ | ||||||
|  | +/* | ||||||
|  | + * LED interface for WP3200 | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2002, by Allen Hung | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/types.h> | ||||||
|  | +#include <linux/errno.h> | ||||||
|  | +#include <linux/ioport.h> | ||||||
|  | +#include <linux/fcntl.h> | ||||||
|  | +#include <linux/sched.h> | ||||||
|  | +#include <linux/module.h> | ||||||
|  | +#include <linux/proc_fs.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/timer.h> | ||||||
|  | +#include <asm/io.h> | ||||||
|  | +#include <asm/uaccess.h> | ||||||
|  | +#include <asm/system.h>                        | ||||||
|  | +#include <linux/reboot.h> | ||||||
|  | + | ||||||
|  | +#include "led.h" | ||||||
|  | + | ||||||
|  | +#define BUF_LEN		30 | ||||||
|  | + | ||||||
|  | +struct LED_DATA  { | ||||||
|  | +    char sts_buf[BUF_LEN+1]; | ||||||
|  | +    unsigned long sts; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +struct LED_DATA led_data[LED_DEV_NUM]; | ||||||
|  | +// sam  | ||||||
|  | +unsigned long ul_ledstat = 0xffffffff; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +static struct timer_list blink_timer[LED_DEV_NUM]; | ||||||
|  | +// sam 01-30-2004 for watchdog | ||||||
|  | +static struct timer_list watchdog; | ||||||
|  | +// end sam | ||||||
|  | +static char cmd_buf[BUF_LEN+1]; | ||||||
|  | + | ||||||
|  | +//------------------------------------------------------------ | ||||||
|  | +static long atoh(char *p)  | ||||||
|  | +{ | ||||||
|  | +    long v = 0, c; | ||||||
|  | +    while ( (c = *p++) )  { | ||||||
|  | +        if      ( c >= '0' && c <= '9' )  v = (v << 4) + c - '0'; | ||||||
|  | +        else if ( c >= 'a' && c <= 'f' )  v = (v << 4) + c - 'a' + 0xA; | ||||||
|  | +        else if ( c >= 'A' && c <= 'F' )  v = (v << 4) + c - 'A' + 0xA; | ||||||
|  | +        else  break; | ||||||
|  | +    } | ||||||
|  | +    return v; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int reset_flash_default(void *data) | ||||||
|  | +{ | ||||||
|  | +	char *argv[3], *envp[1] = {NULL}; | ||||||
|  | +	int i = 0; | ||||||
|  | +	 | ||||||
|  | +	int reset_default=(int) data; | ||||||
|  | + | ||||||
|  | +	argv[i++] = "/bin/flash"; | ||||||
|  | +    argv[i++] = "default"; | ||||||
|  | +	argv[i] = NULL; | ||||||
|  | +    if(reset_default) | ||||||
|  | +		if (call_usermodehelper(argv[0], argv, envp, 1)) | ||||||
|  | +        	printk("failed to Reset to default\n"); | ||||||
|  | +	machine_restart(0); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +// sam for ps 3205U -- using CSx1 (0xb0e00000) | ||||||
|  | +// bit map as following | ||||||
|  | +// BIT   1      2      3      4      5    | ||||||
|  | +//     POWER  WLEN   PORT1  PORT2  PORT3 | ||||||
|  | +// | ||||||
|  | +// value 0 --> led on | ||||||
|  | +// value 1 --> led off | ||||||
|  | + | ||||||
|  | +#define _ROUTER_ | ||||||
|  | + | ||||||
|  | +#ifdef _ROUTER_ | ||||||
|  | +	#define LED_VAL         0x8000384C    // the data ofset of gpio 0~30 | ||||||
|  | +#else | ||||||
|  | +	#define LED_VAL         0x80003888    // the ofset of gpio 31~58 | ||||||
|  | +#endif | ||||||
|  | +#define GPIO_VAL	0x8000384C    // the offset of gpio 0-30  | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +// sam 1-30-2004 LED status  | ||||||
|  | +// bit map as following | ||||||
|  | +// BIT 4:0  Link status   -->PHY Link ->1 = up, 0 = down | ||||||
|  | +#define LINK_STATUS     (*(unsigned long *)0xb2000014) | ||||||
|  | +#define WATCHDOG_VAL    (*(unsigned long *)0xb20000c0) | ||||||
|  | +#define WATCHDOG_PERIOD 500 // unit ms | ||||||
|  | +#define EXPIRE_TIME     300 // unit 10 ms | ||||||
|  | +#define CLEAR_TIMEER    0xffffa000l  // bit 14:0 -> count up timer, write 0 to clear | ||||||
|  | +#define ENABLE_WATCHDOG 0x80000000l  // bit 31 -> 1 enable , 0 disable watchdog | ||||||
|  | +#define WATCHDOG_SET_TMR_SHIFT 16    // bit 16:30 -> watchdog timer set | ||||||
|  | +// end sam | ||||||
|  | + | ||||||
|  | +  | ||||||
|  | +//------------------------------------------------------------ | ||||||
|  | +static void turn_led(int id, int on) | ||||||
|  | +{ | ||||||
|  | +    unsigned long led_bit = 1 << (id); | ||||||
|  | +    unsigned long led_bit_val; | ||||||
|  | + | ||||||
|  | +    // since we define we have 8 led devices and use gpio 53, 55, 57, 58  | ||||||
|  | +    // which locate at bit21~26, so we  rotate left 20bit   | ||||||
|  | +	 | ||||||
|  | +#ifdef _ROUTER_ 	 | ||||||
|  | +    led_bit_val = led_bit; | ||||||
|  | +#else    | ||||||
|  | +    led_bit_val = led_bit << 20; | ||||||
|  | +#endif	 | ||||||
|  | +	 | ||||||
|  | +    switch ( on ) { | ||||||
|  | +      case 0:   | ||||||
|  | +               	ul_ledstat|=  led_bit_val; | ||||||
|  | +               	outl(LED_VAL, 0xcf8); | ||||||
|  | +               	outl(ul_ledstat, 0xcfc);	 | ||||||
|  | +		break; // LED OFF | ||||||
|  | +      case 1:   | ||||||
|  | +               	ul_ledstat &= ~led_bit_val; | ||||||
|  | +               	outl(LED_VAL, 0xcf8); | ||||||
|  | +               	outl(ul_ledstat, 0xcfc); | ||||||
|  | +		break; // LED ON | ||||||
|  | +      case 2:   | ||||||
|  | +               	ul_ledstat ^=  led_bit_val; | ||||||
|  | +               	outl(LED_VAL, 0xcf8); | ||||||
|  | +               	outl(ul_ledstat, 0xcfc); | ||||||
|  | +		break; // LED inverse | ||||||
|  | +    } | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +static int led_flash[30]={20,10,100,5,5,150,100,5,5,50,20,50,50,20,60,5,20,10,30,10,5,10,50,2,5,5,5,70,10,50};//Erwin | ||||||
|  | +static unsigned int    wlan_counter;    //Erwin | ||||||
|  | +static void blink_wrapper(u_long id) | ||||||
|  | +{ | ||||||
|  | +    u_long sts = led_data[id].sts; | ||||||
|  | + | ||||||
|  | +    if ( (sts & LED_BLINK_CMD) == LED_BLINK_CMD )  { | ||||||
|  | +	unsigned long period = sts & LED_BLINK_PERIOD; | ||||||
|  | +	if(period == 0xffff)		// BLINK random | ||||||
|  | +	{ | ||||||
|  | +		blink_timer[id].expires = jiffies + 3*led_flash[wlan_counter%30]*HZ/1000; | ||||||
|  | +		wlan_counter++; | ||||||
|  | +	} | ||||||
|  | +	else | ||||||
|  | +		blink_timer[id].expires = jiffies + (period * HZ / 1000); | ||||||
|  | +	turn_led(id, 2); | ||||||
|  | +	add_timer(&blink_timer[id]); | ||||||
|  | +    } | ||||||
|  | +    else if ( sts == LED_ON || sts == LED_OFF ) | ||||||
|  | +	turn_led(id, sts==LED_ON ? 1 : 0); | ||||||
|  | +} | ||||||
|  | +//------------------------------------------------------------ | ||||||
|  | +static void get_token_str(char *str, char token[][21], int token_num) | ||||||
|  | +{ | ||||||
|  | +    int t, i; | ||||||
|  | + | ||||||
|  | +    for ( t = 0 ; t < token_num ; t++ )  { | ||||||
|  | +    	memset(token[t], 0, 21); | ||||||
|  | +    	while ( *str == ' ' )  str++; | ||||||
|  | +    	for ( i = 0 ; str[i] ; i++ )  { | ||||||
|  | +    	    if ( str[i] == '\t' || str[i] == ' ' || str[i] == '\n' )  break; | ||||||
|  | +    	    if ( i < 20 )  token[t][i] = str[i]; | ||||||
|  | +    	} | ||||||
|  | +    	str += i; | ||||||
|  | +    } | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +//------------------------------------------------------------ | ||||||
|  | +static void set_led_status_by_str(int id) | ||||||
|  | +{ | ||||||
|  | +    char token[3][21], *p; | ||||||
|  | + | ||||||
|  | +     | ||||||
|  | +    get_token_str(led_data[id].sts_buf, token, 3); | ||||||
|  | +	 | ||||||
|  | +    if ( strcmp(token[0], "LED") )  | ||||||
|  | +	{ | ||||||
|  | +        goto set_led_off; | ||||||
|  | +	} | ||||||
|  | +    if ( !strcmp(token[1], "ON") )   | ||||||
|  | +	{ | ||||||
|  | +		 | ||||||
|  | +    	turn_led(id, 1); | ||||||
|  | +    	led_data[id].sts = LED_ON; | ||||||
|  | +    } | ||||||
|  | +    else if ( !strcmp(token[1], "OFF") )   | ||||||
|  | +	{ | ||||||
|  | +		 | ||||||
|  | +	    goto set_led_off; | ||||||
|  | +    } | ||||||
|  | +    else if ( !strcmp(token[1], "BLINK") )  | ||||||
|  | +	{ | ||||||
|  | +    	unsigned int period = 0; | ||||||
|  | +    	p = token[2]; | ||||||
|  | +    	if ( !strcmp(p, "FAST") ) | ||||||
|  | +    	    period = LED_BLINK_FAST & LED_BLINK_PERIOD; | ||||||
|  | +    	else if ( !strcmp(p, "SLOW") ) | ||||||
|  | +    	    period = LED_BLINK_SLOW & LED_BLINK_PERIOD; | ||||||
|  | +    	else if ( !strcmp(p, "EXTRA_SLOW") ) | ||||||
|  | +    	    period = LED_BLINK_EXTRA_SLOW & LED_BLINK_PERIOD; | ||||||
|  | +    	else if ( !strcmp(p, "RANDOM") ) | ||||||
|  | +    	    period = LED_BLINK_RANDOM & LED_BLINK_PERIOD; | ||||||
|  | +    	else if ( !strcmp(p, "OFF") ) | ||||||
|  | +	    goto set_led_off; | ||||||
|  | +	else if ( *p >= '0' && *p <= '9' )   | ||||||
|  | +	{ | ||||||
|  | +    		while ( *p >= '0' && *p <= '9' ) | ||||||
|  | +    	        period = period * 10 + (*p++) - '0'; | ||||||
|  | +//    		if ( period > 10000 )   | ||||||
|  | +//			period = 10000; | ||||||
|  | +	} | ||||||
|  | +	else | ||||||
|  | +    		period = LED_BLINK & LED_BLINK_PERIOD; | ||||||
|  | +	 | ||||||
|  | +    	if ( period == 0 ) | ||||||
|  | +    	    goto set_led_off; | ||||||
|  | +		 | ||||||
|  | +	sprintf(led_data[id].sts_buf, "LED BLINK %d\n", period); | ||||||
|  | +    	led_data[id].sts = LED_BLINK_CMD + period; | ||||||
|  | +    	turn_led(id, 2); | ||||||
|  | +     // Set timer for next blink | ||||||
|  | +	del_timer(&blink_timer[id]); | ||||||
|  | +        blink_timer[id].function = blink_wrapper; | ||||||
|  | +        blink_timer[id].data = id; | ||||||
|  | +        init_timer(&blink_timer[id]); | ||||||
|  | +         | ||||||
|  | +	blink_timer[id].expires = jiffies + (1000 * HZ / 1000); | ||||||
|  | +         | ||||||
|  | +	add_timer(&blink_timer[id]); | ||||||
|  | +    } | ||||||
|  | +    else | ||||||
|  | +	{ | ||||||
|  | +        goto set_led_off; | ||||||
|  | +	} | ||||||
|  | +    return; | ||||||
|  | +  set_led_off: | ||||||
|  | +    strcpy(led_data[id].sts_buf, "LED OFF\n"); | ||||||
|  | +    led_data[id].sts = LED_OFF; | ||||||
|  | +    turn_led(id, 0); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +//---------------------------------------------------------------------- | ||||||
|  | +static int led_read_proc(char *buf, char **start, off_t fpos, int length, int *eof, void *data) | ||||||
|  | +{ | ||||||
|  | +    int len, dev; | ||||||
|  | + | ||||||
|  | +    for ( len = dev = 0 ; dev < LED_DEV_NUM ; dev++ )  { | ||||||
|  | +    	len += sprintf(buf+len, "%d: %s", dev, led_data[dev].sts_buf); | ||||||
|  | +    } | ||||||
|  | +    len = strlen(buf) - fpos; | ||||||
|  | +    if ( len <= 0 ) { | ||||||
|  | +	*start = buf; | ||||||
|  | +	*eof = 1; | ||||||
|  | +	return 0; | ||||||
|  | +    } | ||||||
|  | +    *start = buf + fpos; | ||||||
|  | +    if ( len <= length )   *eof = 1; | ||||||
|  | +    return len < length ? len : length; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +//---------------------------------------------------------------------- | ||||||
|  | +static int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | ||||||
|  | +{ | ||||||
|  | +    int id = (int)file->private_data; | ||||||
|  | + | ||||||
|  | +    switch ( cmd )  { | ||||||
|  | +      case LED_ON: | ||||||
|  | +    	strcpy(led_data[id].sts_buf, "LED ON\n"); | ||||||
|  | +	set_led_status_by_str(id); | ||||||
|  | +	break; | ||||||
|  | +      case LED_OFF: | ||||||
|  | +    	strcpy(led_data[id].sts_buf, "LED OFF\n"); | ||||||
|  | +	set_led_status_by_str(id); | ||||||
|  | +	break; | ||||||
|  | +      default: | ||||||
|  | +        if ( (cmd & LED_BLINK_CMD) != LED_BLINK_CMD ) | ||||||
|  | +		{ | ||||||
|  | +	    break; | ||||||
|  | +		} | ||||||
|  | +      case LED_BLINK: | ||||||
|  | +      case LED_BLINK_FAST: | ||||||
|  | +      case LED_BLINK_SLOW: | ||||||
|  | +      case LED_BLINK_EXTRA_SLOW: | ||||||
|  | +      case LED_BLINK_RANDOM: | ||||||
|  | +        sprintf(led_data[id].sts_buf, "LED BLINK %d\n", (int)(cmd & LED_BLINK_PERIOD)); | ||||||
|  | +	set_led_status_by_str(id); | ||||||
|  | +	break; | ||||||
|  | +    } | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int led_open(struct inode *inode, struct file *file) | ||||||
|  | +{ | ||||||
|  | +    int led_id = MINOR(inode->i_rdev); | ||||||
|  | +//    unsigned long led_bit = 1 << (led_id); | ||||||
|  | + | ||||||
|  | +    if ( led_id >= LED_DEV_NUM ) | ||||||
|  | +        return -ENODEV; | ||||||
|  | +/* sam 12/02/2003 | ||||||
|  | +    GPIO_SEL_I_O &= ~led_bit;   // 0 to GPIO | ||||||
|  | +    GPIO_O_EN |= (led_bit << 16);   // 0 to Output | ||||||
|  | +*/	 | ||||||
|  | +	 | ||||||
|  | +    file->private_data = (void*)led_id; | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static long led_read(struct file *file, char *buf, size_t count, loff_t *fpos) | ||||||
|  | +{ | ||||||
|  | +    int  rem, len; | ||||||
|  | +    int  id = (int)file->private_data; | ||||||
|  | +    char *p = led_data[id].sts_buf; | ||||||
|  | + | ||||||
|  | +    len = strlen(p); | ||||||
|  | +    rem = len - *fpos; | ||||||
|  | +    if ( rem <= 0 )  { | ||||||
|  | +    	*fpos = len; | ||||||
|  | +    	return 0; | ||||||
|  | +    } | ||||||
|  | +    if ( rem > count )   rem = count; | ||||||
|  | +    memcpy(buf, p+(*fpos), rem); | ||||||
|  | +    *fpos += rem; | ||||||
|  | +    return rem; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static long led_write(struct file *file, char *buf, size_t count, loff_t *fpos) | ||||||
|  | +{ | ||||||
|  | +    int  len; | ||||||
|  | +    int  id = (int)file->private_data; | ||||||
|  | +    char *p = id == REG_MINOR ? cmd_buf : led_data[id].sts_buf; | ||||||
|  | +    memset(p, 0, BUF_LEN); | ||||||
|  | + | ||||||
|  | +    p += *fpos; | ||||||
|  | +    len = 0; | ||||||
|  | + | ||||||
|  | +	 | ||||||
|  | +    while ( count > 0 )   | ||||||
|  | +	{ | ||||||
|  | +		 | ||||||
|  | +    	if ( *fpos < BUF_LEN )   | ||||||
|  | +		{ | ||||||
|  | +    	    int c = *buf++; | ||||||
|  | +            p[len] = c>='a' && c<='z' ? c-'a'+'A' : c; | ||||||
|  | +        } | ||||||
|  | +    	(*fpos)++; | ||||||
|  | +	    len++; | ||||||
|  | +    	count--; | ||||||
|  | +    } | ||||||
|  | +	// sam | ||||||
|  | +    set_led_status_by_str(id); | ||||||
|  | +	(*fpos) = 0; | ||||||
|  | +	// | ||||||
|  | +	 | ||||||
|  | +    return len; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int led_flush(struct file *file) | ||||||
|  | +{ | ||||||
|  | +    int  id = (int)file->private_data; | ||||||
|  | + | ||||||
|  | +    if ( file->f_mode & FMODE_WRITE ) | ||||||
|  | +	{ | ||||||
|  | +    	set_led_status_by_str(id); | ||||||
|  | +	} | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct file_operations led_fops = { | ||||||
|  | +    read:	led_read, | ||||||
|  | +    write:	led_write, | ||||||
|  | +    flush:	led_flush, | ||||||
|  | +    ioctl:	led_ioctl, | ||||||
|  | +    open:	led_open, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +//---------------------------------------------- | ||||||
|  | +static unsigned long *reg_addr; | ||||||
|  | +static int  dump_len; | ||||||
|  | + | ||||||
|  | +static int dump_content(char *buf) | ||||||
|  | +{ | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static long gpio_read(struct file *file, char *buf, size_t count, loff_t *fpos) | ||||||
|  | +{ | ||||||
|  | +    int  rem, len; | ||||||
|  | +    int  id = (int)file->private_data; | ||||||
|  | +    char temp[80*10]; | ||||||
|  | +    unsigned long gpio_regval =0; | ||||||
|  | + | ||||||
|  | +	outl(GPIO_VAL, 0xcf8); | ||||||
|  | +    gpio_regval = inl(0xcfc); | ||||||
|  | +	gpio_regval |= 0x40; | ||||||
|  | +	outl(gpio_regval, 0xcfc);   // each in, need out 1 first | ||||||
|  | +	gpio_regval = inl(0xcfc); | ||||||
|  | +					 | ||||||
|  | +	 | ||||||
|  | +    // sam debug | ||||||
|  | +    //printk(KERN_ERR "gpio_id:%d, gpio_regval:%08X\n", id, gpio_regval); | ||||||
|  | +    //end sam  | ||||||
|  | +     | ||||||
|  | +    if ( id < GPIO_DEV_NUM )  { | ||||||
|  | +        int  gpio_bit = 1 << id; | ||||||
|  | + | ||||||
|  | +        len = sprintf(temp, "%d\n", (gpio_regval & gpio_bit) ? 1 : 0); | ||||||
|  | +    } | ||||||
|  | +    else   // REG device | ||||||
|  | +        len = dump_content(temp); | ||||||
|  | +    rem = len - *fpos; | ||||||
|  | +    if ( rem <= 0 )  { | ||||||
|  | +    	*fpos = len; | ||||||
|  | +    	return 0; | ||||||
|  | +    } | ||||||
|  | +    if ( rem > count )   rem = count; | ||||||
|  | +    memcpy(buf, temp+(*fpos), rem); | ||||||
|  | +    *fpos += rem; | ||||||
|  | +    return rem; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int gpio_flush(struct file *file) | ||||||
|  | +{ | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int gpio_open(struct inode *inode, struct file *file) | ||||||
|  | +{ | ||||||
|  | +    int id = MINOR(inode->i_rdev); | ||||||
|  | +    if ( id >= GPIO_DEV_NUM && id != REG_MINOR ) | ||||||
|  | +        return -ENODEV; | ||||||
|  | +    file->private_data = (void*)id; | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct file_operations gpio_fops = { | ||||||
|  | +    read:	gpio_read, | ||||||
|  | +    open:	gpio_open, | ||||||
|  | +    flush:	gpio_flush, | ||||||
|  | +    write:	led_write, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +// --------------------------------------------- | ||||||
|  | +//  sam 1-30-2004 LAN_STATUS Device | ||||||
|  | + | ||||||
|  | +//static unsigned long *reg_addr; | ||||||
|  | +//static int  dump_len; | ||||||
|  | + | ||||||
|  | +//static int lanSt_content(char *buf) | ||||||
|  | +//{ | ||||||
|  | +//    int  i, j, len; | ||||||
|  | +//    unsigned long *p = (unsigned long *)0xb2000014;  // PHY_ST  | ||||||
|  | +// //    j = dump_len/4 + ((dump_len&3) ? 1 : 0); | ||||||
|  | +//    len = sprintf(buf, "Reg Addr = %08lX,  Value = \n", (unsigned long)p); | ||||||
|  | +// //    for ( i = 0 ; i < j ; i++, p++ ) | ||||||
|  | +//    len += sprintf(buf+len,"%08lX\n", *p); | ||||||
|  | +     | ||||||
|  | +//    return len; | ||||||
|  | +//} | ||||||
|  | + | ||||||
|  | +#define MAC_IOBASE 0xe800 // Eth0 | ||||||
|  | +#define PHY_ADDR   1      // For Eth0 | ||||||
|  | +#define MII_STATUS_ADDR 1 | ||||||
|  | +// where "id" value means which bit of PHY reg 1 we want to check   | ||||||
|  | +static long lanSt_read(struct file *file, char *buf, size_t count, loff_t *fpos) | ||||||
|  | +{ | ||||||
|  | +    int  rem, len; | ||||||
|  | +//  unsigned long *p = (unsigned long *)0xb2000014;  // PHY_ST  | ||||||
|  | +    unsigned short status; | ||||||
|  | +    unsigned int   i = 0; | ||||||
|  | +    int  id = (int)file->private_data; | ||||||
|  | +    char temp[80*10]; | ||||||
|  | +     | ||||||
|  | +    outw(0x2000 + MII_STATUS_ADDR + (PHY_ADDR << 8), MAC_IOBASE + 0x20); | ||||||
|  | +    do{}while( (i++ < 2048) && (inw(MAC_IOBASE+0x20) & 0x2000) ); | ||||||
|  | + | ||||||
|  | +    status = inw(MAC_IOBASE + 0x24); | ||||||
|  | +     | ||||||
|  | +    // sam debug | ||||||
|  | +    //printk(KERN_ERR "PHY REG1 Status:%04x\n", status ); | ||||||
|  | +    // end sam | ||||||
|  | +     | ||||||
|  | +    if ( id < LAN_DEV_NUM )  { | ||||||
|  | +        unsigned long lanSt_bit = 1 << id; | ||||||
|  | +//        len = lanSt_content(temp); | ||||||
|  | +        len = sprintf(temp, "%d\n",(status & lanSt_bit) ? 1 : 0); | ||||||
|  | +    } | ||||||
|  | +    else   // REG device | ||||||
|  | +    { | ||||||
|  | +        len = sprintf(temp, "-1\n"); | ||||||
|  | +    }    | ||||||
|  | +    rem = len - *fpos; | ||||||
|  | +    if ( rem <= 0 )  { | ||||||
|  | +    	*fpos = len; | ||||||
|  | +    	return 0; | ||||||
|  | +    } | ||||||
|  | +    if ( rem > count )   rem = count; | ||||||
|  | +    memcpy(buf, temp+(*fpos), rem); | ||||||
|  | +    *fpos += rem; | ||||||
|  | +    return rem; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int lanSt_flush(struct file *file) | ||||||
|  | +{ | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int lanSt_open(struct inode *inode, struct file *file) | ||||||
|  | +{ | ||||||
|  | +    int id = MINOR(inode->i_rdev); | ||||||
|  | +    if ( id >= LAN_DEV_NUM && id != REG_MINOR ) | ||||||
|  | +        return -ENODEV; | ||||||
|  | +    file->private_data = (void*)id; | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct file_operations lanSt_fops = { | ||||||
|  | +    read:	lanSt_read, | ||||||
|  | +    open:	lanSt_open, | ||||||
|  | +    flush:	lanSt_flush, | ||||||
|  | +    write:	led_write, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +//---------------------------------------------- | ||||||
|  | +static int SwResetPress = 0; | ||||||
|  | +static int SwResetCounter = 0; | ||||||
|  | +static int RebootFlag = 0; | ||||||
|  | +static void watchdog_wrapper(unsigned int period) | ||||||
|  | +{ | ||||||
|  | +    	// { RexHua add for restore default, by press SwReset 5 second, 2 sec to restart | ||||||
|  | +#if 0		//  | ||||||
|  | +	u_long reg; | ||||||
|  | + | ||||||
|  | +   	outl(GPIO_VAL, 0xcf8); | ||||||
|  | +   	reg = inl(0xcfc); | ||||||
|  | +   	reg |= 0x40; | ||||||
|  | +   	outl(reg, 0xcfc);	// each in, need out 1 first | ||||||
|  | +   	reg = inl(0xcfc); | ||||||
|  | + | ||||||
|  | +   	if( (reg & 0x40) == 0) | ||||||
|  | +   	{ | ||||||
|  | +		if(SwResetPress == 0) | ||||||
|  | +		{	 | ||||||
|  | +			SwResetCounter=0; | ||||||
|  | +			strcpy(led_data[15].sts_buf, "LED BLINK 500\n" ); | ||||||
|  | +			set_led_status_by_str(15); | ||||||
|  | +		} | ||||||
|  | +		SwResetPress=1; | ||||||
|  | +		printk("SwReset press!\n"); | ||||||
|  | + | ||||||
|  | +    } | ||||||
|  | +    else | ||||||
|  | +	{ | ||||||
|  | +		if(SwResetPress=1) | ||||||
|  | +		{ | ||||||
|  | +			strcpy(led_data[15].sts_buf, "LED ON\n" ); | ||||||
|  | +               set_led_status_by_str(15); | ||||||
|  | +		} | ||||||
|  | +		 | ||||||
|  | +		SwResetPress=0; | ||||||
|  | +		if(RebootFlag == 1) | ||||||
|  | +			machine_restart(0); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	if(SwResetPress == 1) | ||||||
|  | +  	{ | ||||||
|  | +		if(SwResetCounter > 10) | ||||||
|  | +		{ | ||||||
|  | +			turn_led(15, 0); | ||||||
|  | +//			kernel_thread(reset_flash_default, 1, SIGCHLD); | ||||||
|  | +			reset_flash_default(1); | ||||||
|  | +			turn_led(15, 1); | ||||||
|  | +		} | ||||||
|  | +		else if(SwResetCounter == 3) | ||||||
|  | +		{ | ||||||
|  | +			RebootFlag=1; | ||||||
|  | +			strcpy(led_data[15].sts_buf, "LED BLINK 100\n" ); | ||||||
|  | +			set_led_status_by_str(15); | ||||||
|  | +		} | ||||||
|  | +	}		 | ||||||
|  | + | ||||||
|  | +	SwResetCounter++; | ||||||
|  | +#endif | ||||||
|  | +	 | ||||||
|  | +	// clear timer count | ||||||
|  | +	outl(0x80003844, 0xcf8); | ||||||
|  | +	outl(0x00800080, 0xcfc); // enable watchdog and set the timeout = 1.34s | ||||||
|  | +    //printk(KERN_ERR "wdt\n" ); | ||||||
|  | +	watchdog.expires = jiffies + (period * HZ / 1000); | ||||||
|  | +	add_timer(&watchdog); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +//---------------------------------------------- | ||||||
|  | +static int init_status; | ||||||
|  | + | ||||||
|  | +#define INIT_REGION	        0x01 | ||||||
|  | +#define INIT_LED_REGISTER	0x02 | ||||||
|  | +#define INIT_LED_PROC_READ	0x04 | ||||||
|  | +#define INIT_GPIO_REGISTER	0x08 | ||||||
|  | +// sam 1-30-2004 LAN_STATUS | ||||||
|  | +#define INIT_LAN_STATUS_REGISTER 0x10 | ||||||
|  | +#define INIT_WATCHDOG_REGISTER 0x20 | ||||||
|  | + | ||||||
|  | +static void led_exit(void) | ||||||
|  | +{ | ||||||
|  | +    int id; | ||||||
|  | +    for ( id = 0 ; id < LED_DEV_NUM ; id++ )  { | ||||||
|  | +        del_timer(&blink_timer[id]); | ||||||
|  | +        turn_led(id, 0); | ||||||
|  | +    } | ||||||
|  | +    if ( init_status & INIT_LED_PROC_READ ) | ||||||
|  | +    	remove_proc_entry("driver/led", NULL); | ||||||
|  | +    	 | ||||||
|  | +    if ( init_status & INIT_LED_REGISTER ) | ||||||
|  | +    	unregister_chrdev(LED_MAJOR, "led"); | ||||||
|  | + | ||||||
|  | +    if ( init_status & INIT_GPIO_REGISTER ) | ||||||
|  | +    	unregister_chrdev(GPIO_MAJOR, "gpio"); | ||||||
|  | +    // sam 1-30-2004  | ||||||
|  | +     | ||||||
|  | +    if( init_status & INIT_LAN_STATUS_REGISTER ) | ||||||
|  | +      unregister_chrdev(LAN_STATUS_MAJOR, "lanSt"); | ||||||
|  | +     | ||||||
|  | +    if( init_status & INIT_WATCHDOG_REGISTER) | ||||||
|  | +       del_timer(&watchdog); | ||||||
|  | +     | ||||||
|  | +     | ||||||
|  | +    // end sam | ||||||
|  | + | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init led_init(void) | ||||||
|  | +{ | ||||||
|  | +    int result, id, i, j; | ||||||
|  | +    unsigned long reg; | ||||||
|  | +    init_status = 0; | ||||||
|  | +	 | ||||||
|  | +  //----- register device (LED)------------------------- | ||||||
|  | +   | ||||||
|  | +                                                                                         | ||||||
|  | +    result = register_chrdev(LED_MAJOR, "led", &led_fops); | ||||||
|  | +    if ( result < 0 )   { | ||||||
|  | +    	printk(KERN_ERR "led: can't register char device\n" ); | ||||||
|  | +    	led_exit(); | ||||||
|  | +    	return result; | ||||||
|  | +    } | ||||||
|  | +    init_status |= INIT_LED_REGISTER; | ||||||
|  | +  //----- register device (GPIO)------------------------- | ||||||
|  | +    result = register_chrdev(GPIO_MAJOR, "gpio", &gpio_fops); | ||||||
|  | +    if ( result < 0 )   { | ||||||
|  | +    	printk(KERN_ERR "gpio: can't register char device\n" ); | ||||||
|  | +    	led_exit(); | ||||||
|  | +    	return result; | ||||||
|  | +    } | ||||||
|  | +    init_status |= INIT_GPIO_REGISTER; | ||||||
|  | +     | ||||||
|  | +  // sam 1-30-2004 LAN Status | ||||||
|  | +  // ----- register device (LAN_STATUS)------------------- | ||||||
|  | +   | ||||||
|  | +  //--> sam 5-1802995 | ||||||
|  | +   | ||||||
|  | +    result = register_chrdev(LAN_STATUS_MAJOR, "lanSt", &lanSt_fops); | ||||||
|  | +    if ( result < 0 )   { | ||||||
|  | +    	printk(KERN_ERR "lanSt: can't register char device\n" ); | ||||||
|  | +    	led_exit(); | ||||||
|  | +    	return result; | ||||||
|  | +    } | ||||||
|  | +    init_status |= INIT_LAN_STATUS_REGISTER; | ||||||
|  | +   | ||||||
|  | +  // <-- end sam | ||||||
|  | +     | ||||||
|  | + // -----------init watchdog timer------------------------- | ||||||
|  | +	 //del_timer(&blink_timer[id]); | ||||||
|  | + | ||||||
|  | +    outl(0x80003840, 0xcf8); | ||||||
|  | +    reg = inl(0xcfc); | ||||||
|  | +    reg |= 0x1600;         // ensable SRC bit  | ||||||
|  | +    outl(reg, 0xcfc); | ||||||
|  | +#ifdef _ROUTER_ | ||||||
|  | +    outl(0x80003848, 0xcf8); | ||||||
|  | +    reg = inl(0xcfc); | ||||||
|  | +    reg |= 0x18040; 		// enable GPIO, PowerLED:15, WLAN_LED0:16, SwReset:6  | ||||||
|  | +    outl(reg, 0xcfc); | ||||||
|  | +     | ||||||
|  | +    outl(0x8000384c, 0xcf8); | ||||||
|  | +    reg = inl(0xcfc); | ||||||
|  | +    reg |= 0x40;         	// output SwReset:6 1, Set SwReset as Input  | ||||||
|  | +    outl(reg, 0xcfc); | ||||||
|  | +#endif | ||||||
|  | +    // sam debug | ||||||
|  | +    //reg = inl(0xcfc); | ||||||
|  | +    //printk(KERN_ERR "REG40:%08X\n", reg); | ||||||
|  | +    // end sam | ||||||
|  | +    outl(0x80003844, 0xcf8); | ||||||
|  | +    outl(0x00800080, 0xcfc); // enable watchdog and set the timeout = 1.34s | ||||||
|  | +     | ||||||
|  | +    watchdog.function = watchdog_wrapper; | ||||||
|  | +    watchdog.data = WATCHDOG_PERIOD; | ||||||
|  | +    init_timer(&watchdog); | ||||||
|  | +    watchdog.expires = jiffies + (WATCHDOG_PERIOD * HZ / 1000); | ||||||
|  | +    add_timer(&watchdog); | ||||||
|  | +    init_status |= INIT_WATCHDOG_REGISTER; | ||||||
|  | + | ||||||
|  | + // end sam    | ||||||
|  | + //------ read proc ------------------- | ||||||
|  | +    if ( !create_proc_read_entry("driver/led", 0, 0, led_read_proc, NULL) )  { | ||||||
|  | +	printk(KERN_ERR "led: can't create /proc/driver/led\n"); | ||||||
|  | +    	led_exit(); | ||||||
|  | +    	return -ENOMEM; | ||||||
|  | +    } | ||||||
|  | +    init_status |= INIT_LED_PROC_READ; | ||||||
|  | +  //------------------------------ | ||||||
|  | +//    reg_addr = (unsigned long *)0xB4000000; | ||||||
|  | +//    dump_len = 4; | ||||||
|  | +     | ||||||
|  | +    for ( id = 0 ; id < LED_DEV_NUM ; id++ )  { | ||||||
|  | +    	strcpy(led_data[id].sts_buf, "LED ON\n" ); | ||||||
|  | +    	set_led_status_by_str(id); | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +//    for (i = 0; i < 0xffff; i++) | ||||||
|  | +//	    for (j = 0; j < 0x6000; j++); | ||||||
|  | + | ||||||
|  | +/* sam 5-18-2005 remark | ||||||
|  | +    for ( id = 0 ; id < LED_DEV_NUM ; id++ )  { | ||||||
|  | +        strcpy(led_data[id].sts_buf, "LED ON\n" ); | ||||||
|  | +        set_led_status_by_str(id); | ||||||
|  | +    } | ||||||
|  | +*/     | ||||||
|  | +    printk(KERN_INFO "LED & GPIO & LAN Status Driver LED_VERSION \n"); | ||||||
|  | +    return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +module_init(led_init); | ||||||
|  | +module_exit(led_exit); | ||||||
|  | +EXPORT_NO_SYMBOLS; | ||||||
|  | diff -urN linux-2.6.17/arch/i386/mach-rdc/led.h linux-2.6.17.new/arch/i386/mach-rdc/led.h | ||||||
|  | --- linux-2.6.17/arch/i386/mach-rdc/led.h	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/mach-rdc/led.h	2006-10-07 22:28:32.000000000 +0200 | ||||||
|  | @@ -0,0 +1,32 @@ | ||||||
|  | +#ifndef _LED_H_INCLUDED | ||||||
|  | +#define _LED_H_INCLUDED | ||||||
|  | + | ||||||
|  | +#include <linux/config.h> | ||||||
|  | + | ||||||
|  | +#define LED_VERSION 		"v1.0" | ||||||
|  | +#define LED_MAJOR       	166 | ||||||
|  | +#define LED_DEV_NUM		32  | ||||||
|  | +#define LED_GPIO_START      	1 | ||||||
|  | +#define GPIO_MAJOR       	167 | ||||||
|  | +#define GPIO_DEV_NUM		32 | ||||||
|  | +#define REG_MINOR           	128 | ||||||
|  | +// sam 1-30-2004 for LAN_STATUS | ||||||
|  | +#define LAN_STATUS_MAJOR   	168 | ||||||
|  | +#define LAN_DEV_NUM     	5 | ||||||
|  | +// end sam | ||||||
|  | + | ||||||
|  | +//#define GPIO_IO_BASE        0xB4002480 | ||||||
|  | +//#define GPIO_IO_BASE        ((unsigned long)0xb20000b8) | ||||||
|  | +//#define GPIO_IO_EXTENT		0x40 | ||||||
|  | + | ||||||
|  | +#define LED_ON              0x010000 | ||||||
|  | +#define LED_OFF             0x020000 | ||||||
|  | +#define LED_BLINK_CMD       0x030000 | ||||||
|  | +#define LED_BLINK_PERIOD    0x00FFFF | ||||||
|  | +#define LED_BLINK           (LED_BLINK_CMD|1000) | ||||||
|  | +#define LED_BLINK_FAST      (LED_BLINK_CMD|250) | ||||||
|  | +#define LED_BLINK_SLOW      (LED_BLINK_CMD|500) | ||||||
|  | +#define LED_BLINK_EXTRA_SLOW    (LED_BLINK_CMD|2000) | ||||||
|  | +#define LED_BLINK_RANDOM    (LED_BLINK_CMD|0xffff) | ||||||
|  | + | ||||||
|  | +#endif | ||||||
|  | diff -urN linux-2.6.17/arch/i386/mach-rdc/Makefile linux-2.6.17.new/arch/i386/mach-rdc/Makefile | ||||||
|  | --- linux-2.6.17/arch/i386/mach-rdc/Makefile	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/mach-rdc/Makefile	2006-10-07 22:31:19.000000000 +0200 | ||||||
|  | @@ -0,0 +1,5 @@ | ||||||
|  | +# | ||||||
|  | +# Makefile for the linux kernel. | ||||||
|  | +# | ||||||
|  | + | ||||||
|  | +obj-$(CONFIG_X86_RDC)        := led.o | ||||||
|  | diff -urN linux-2.6.17/arch/i386/Makefile linux-2.6.17.new/arch/i386/Makefile | ||||||
|  | --- linux-2.6.17/arch/i386/Makefile	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/Makefile	2006-10-07 23:56:13.000000000 +0200 | ||||||
|  | @@ -80,6 +80,10 @@ | ||||||
|  |  mflags-$(CONFIG_X86_ES7000)	:= -Iinclude/asm-i386/mach-es7000 | ||||||
|  |  mcore-$(CONFIG_X86_ES7000)	:= mach-default | ||||||
|  |  core-$(CONFIG_X86_ES7000)	:= arch/i386/mach-es7000/ | ||||||
|  | +# RDC subarch support | ||||||
|  | +mflags-$(CONFIG_X86_RDC)	:= -Iinclude/asm-i386/mach-generic | ||||||
|  | +mcore-$(CONFIG_X86_RDC)		:= mach-default | ||||||
|  | +core-$(CONFIG_X86_RDC)		:= arch/i386/mach-rdc/ | ||||||
|  |   | ||||||
|  |  # default subarch .h files | ||||||
|  |  mflags-y += -Iinclude/asm-i386/mach-default | ||||||
|  | diff -urN linux-2.6.17/arch/i386/mm/fault.c linux-2.6.17.new/arch/i386/mm/fault.c | ||||||
|  | --- linux-2.6.17/arch/i386/mm/fault.c	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/arch/i386/mm/fault.c	2006-10-07 22:24:15.000000000 +0200 | ||||||
|  | @@ -551,6 +551,7 @@ | ||||||
|  |  	tsk->thread.cr2 = address; | ||||||
|  |  	tsk->thread.trap_no = 14; | ||||||
|  |  	tsk->thread.error_code = error_code; | ||||||
|  | +	machine_restart(NULL); /* Added for RDC */ | ||||||
|  |  	die("Oops", regs, error_code); | ||||||
|  |  	bust_spinlocks(0); | ||||||
|  |  	do_exit(SIGKILL); | ||||||
|  | @@ -566,6 +567,12 @@ | ||||||
|  |  		down_read(&mm->mmap_sem); | ||||||
|  |  		goto survive; | ||||||
|  |  	} | ||||||
|  | +	/* RDC : Forcing processes to be niced */ | ||||||
|  | +	if (tsk->prio < 0) { | ||||||
|  | +		printk("VM: niced process %s\n", tsk->comm); | ||||||
|  | +		yield(); | ||||||
|  | +		goto survive; | ||||||
|  | +	} | ||||||
|  |  	printk("VM: killing process %s\n", tsk->comm); | ||||||
|  |  	if (error_code & 4) | ||||||
|  |  		do_exit(SIGKILL); | ||||||
							
								
								
									
										271
									
								
								target/linux/rdc-2.6/patches/001-rdc3210_flash_map.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										271
									
								
								target/linux/rdc-2.6/patches/001-rdc3210_flash_map.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,271 @@ | |||||||
|  | diff -urN linux-2.6.17/drivers/mtd/maps/imghdr.h linux-2.6.17.new/drivers/mtd/maps/imghdr.h | ||||||
|  | --- linux-2.6.17/drivers/mtd/maps/imghdr.h	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.17.new/drivers/mtd/maps/imghdr.h	2006-09-24 20:29:20.000000000 +0200 | ||||||
|  | @@ -0,0 +1,25 @@ | ||||||
|  | +#ifndef GT_IMGHDR_H | ||||||
|  | +#define GT_IMGHDR_H | ||||||
|  | + | ||||||
|  | +#define GTIMG_MAGIC		"GMTK" | ||||||
|  | + | ||||||
|  | +/* Product ID */ | ||||||
|  | +#define PID_RTL_AIRGO		1 | ||||||
|  | +#define PID_RTL_RALINK		2 | ||||||
|  | +#define PID_RDC_AIRGO		3 | ||||||
|  | +#define PID_RDC_RALINK		5	/* White Lable */ | ||||||
|  | + | ||||||
|  | +/* Gemtek */ | ||||||
|  | +typedef struct | ||||||
|  | +{ | ||||||
|  | +	UINT8		magic[4];		/* ASICII: GMTK */ | ||||||
|  | +	UINT32		checksum;		/* CRC32 */ | ||||||
|  | +	UINT32		version;		/* x.x.x.x */ | ||||||
|  | +	UINT32		kernelsz;		/* The size of the kernel image */ | ||||||
|  | +	UINT32		imagesz;		/* The length of this image file ( kernel + romfs + this header) */ | ||||||
|  | +	UINT32		pid;			/* Product ID */ | ||||||
|  | +	UINT32		fastcksum;		/* Partial CRC32 on (First(256), medium(256), last(512)) */ | ||||||
|  | +	UINT32		reserved; | ||||||
|  | +}gt_imghdr_t; | ||||||
|  | + | ||||||
|  | +#endif | ||||||
|  | diff -urN linux-2.6.17/drivers/mtd/maps/Kconfig linux-2.6.17.new/drivers/mtd/maps/Kconfig | ||||||
|  | --- linux-2.6.17/drivers/mtd/maps/Kconfig	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/drivers/mtd/maps/Kconfig	2006-09-24 20:28:11.000000000 +0200 | ||||||
|  | @@ -76,6 +76,12 @@ | ||||||
|  |  	  PNC-2000 is the name of Network Camera product from PHOTRON | ||||||
|  |  	  Ltd. in Japan. It uses CFI-compliant flash. | ||||||
|  |   | ||||||
|  | +config MTD_RDC3210 | ||||||
|  | +	tristate "CFI Flash devcie mapped on RDC3210" | ||||||
|  | +	depends on X86 && MTD_CFI && MTD_PARTITIONS | ||||||
|  | +	help | ||||||
|  | +	  RDC-3210 is the flash device we find on Ralink reference board | ||||||
|  | + | ||||||
|  |  config MTD_SC520CDP | ||||||
|  |  	tristate "CFI Flash device mapped on AMD SC520 CDP" | ||||||
|  |  	depends on X86 && MTD_CFI | ||||||
|  | diff -urN linux-2.6.17/drivers/mtd/maps/Makefile linux-2.6.17.new/drivers/mtd/maps/Makefile | ||||||
|  | --- linux-2.6.17/drivers/mtd/maps/Makefile	2006-06-18 03:49:35.000000000 +0200 | ||||||
|  | +++ linux-2.6.17.new/drivers/mtd/maps/Makefile	2006-09-24 20:26:10.000000000 +0200 | ||||||
|  | @@ -28,6 +28,7 @@ | ||||||
|  |  obj-$(CONFIG_MTD_PHYSMAP)	+= physmap.o | ||||||
|  |  obj-$(CONFIG_MTD_PNC2000)	+= pnc2000.o | ||||||
|  |  obj-$(CONFIG_MTD_PCMCIA)	+= pcmciamtd.o | ||||||
|  | +obj-$(CONFIG_MTD_RDC3210)	+= rdc3210.o | ||||||
|  |  obj-$(CONFIG_MTD_RPXLITE)	+= rpxlite.o | ||||||
|  |  obj-$(CONFIG_MTD_TQM8XXL)	+= tqm8xxl.o | ||||||
|  |  obj-$(CONFIG_MTD_SA1100)	+= sa1100-flash.o | ||||||
|  | diff -urN linux-2.6.17/drivers/mtd/maps/rdc3210.c linux-2.6.17.new/drivers/mtd/maps/rdc3210.c | ||||||
|  | --- linux-2.6.17/drivers/mtd/maps/rdc3210.c	1970-01-01 01:00:00.000000000 +0100 | ||||||
|  | +++ linux-2.6.17.new/drivers/mtd/maps/rdc3210.c	2006-09-24 22:55:20.000000000 +0200 | ||||||
|  | @@ -0,0 +1,211 @@ | ||||||
|  | +/******************************************************************* | ||||||
|  | + * Simple Flash mapping for RDC3210                                * | ||||||
|  | + *                                                                 * | ||||||
|  | + *                                                     2005.03.23  * | ||||||
|  | + *                              Dante Su (dante_su@gemtek.com.tw)  * | ||||||
|  | + *                          Copyright (C) 2005 Gemtek Corporation  * | ||||||
|  | + *******************************************************************/ | ||||||
|  | + | ||||||
|  | +#include <linux/module.h> | ||||||
|  | +#include <linux/slab.h> | ||||||
|  | +#include <linux/types.h> | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <asm/io.h> | ||||||
|  | +#include <linux/mtd/mtd.h> | ||||||
|  | +#include <linux/mtd/map.h> | ||||||
|  | +#include <linux/mtd/partitions.h> | ||||||
|  | +#include <linux/config.h> | ||||||
|  | + | ||||||
|  | +#define WINDOW_ADDR             0xFFC00000 | ||||||
|  | +#define WINDOW_SIZE             0x00400000 | ||||||
|  | + | ||||||
|  | +#define BUSWIDTH 2 | ||||||
|  | + | ||||||
|  | +static struct mtd_info *rdc3210_mtd_info; | ||||||
|  | + | ||||||
|  | +__u8  rdc3210_map_read8(struct map_info *map, unsigned long ofs) | ||||||
|  | +{ | ||||||
|  | +        return *(__u8 *)(map->map_priv_1 + ofs); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +__u16 rdc3210_map_read16(struct map_info *map, unsigned long ofs) | ||||||
|  | +{ | ||||||
|  | +        return *(__u16 *)(map->map_priv_1 + ofs); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +__u32 rdc3210_map_read32(struct map_info *map, unsigned long ofs) | ||||||
|  | +{ | ||||||
|  | +        return *(__u32 *)(map->map_priv_1 + ofs); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void rdc3210_map_write8(struct map_info *map, __u8 d, unsigned long adr) | ||||||
|  | +{ | ||||||
|  | +        *(__u8 *)(map->map_priv_1 + adr) = d; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void rdc3210_map_write16(struct map_info *map, __u16 d, unsigned long adr) | ||||||
|  | +{ | ||||||
|  | +        *(__u16 *)(map->map_priv_1 + adr) = d; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void rdc3210_map_write32(struct map_info *map, __u32 d, unsigned long adr) | ||||||
|  | +{ | ||||||
|  | +        *(__u32 *)(map->map_priv_1 + adr) = d; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void rdc3210_map_copy_from(struct map_info *map, void *to, unsigned long from, ssize_t len) | ||||||
|  | +{ | ||||||
|  | +        int     i; | ||||||
|  | +        u16     *dst = (u16 *)(to); | ||||||
|  | +        u16     *src = (u16 *)(map->map_priv_1 + from); | ||||||
|  | + | ||||||
|  | +        for(i = 0; i < (len / 2); ++i) | ||||||
|  | +                dst[i] = src[i]; | ||||||
|  | + | ||||||
|  | +        if(len & 1) | ||||||
|  | +        { | ||||||
|  | +                printk("# WARNNING!!! rdc3210_map_copy_from has odd length\n"); | ||||||
|  | +                //dst[len - 1] = B0(src[i]); | ||||||
|  | +        } | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void rdc3210_map_copy_to(struct map_info *map, void *to, unsigned long from, ssize_t len) | ||||||
|  | +{ | ||||||
|  | +        int     i; | ||||||
|  | +        u16     *dst = (u16 *)(map->map_priv_1 + to); | ||||||
|  | +        u16     *src = (u16 *)(from); | ||||||
|  | + | ||||||
|  | +        for(i = 0; i < (len / 2); ++i) | ||||||
|  | +                dst[i] = src[i]; | ||||||
|  | + | ||||||
|  | +        if(len & 1) | ||||||
|  | +        { | ||||||
|  | +                printk("# WARNNING!!! rdc3210_map_copy_from has odd length\n"); | ||||||
|  | +                //dst[len - 1] = B0(src[i]); | ||||||
|  | +        } | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static struct map_info rdc3210_map =  | ||||||
|  | +{ | ||||||
|  | +        .name = "RDC3210 Flash", | ||||||
|  | +        .size = WINDOW_SIZE, | ||||||
|  | +        .bankwidth = BUSWIDTH, | ||||||
|  | +	.phys = WINDOW_ADDR, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/* Dante: This is the default static mapping, however this is nothing but a hint. (Say dynamic mapping) */ | ||||||
|  | +static struct mtd_partition rdc3210_parts[] = | ||||||
|  | +{ | ||||||
|  | +        { .name = "linux",   .offset = 0,          .size = 0x003C0000 },     /* 3840 KB = (Kernel + ROMFS) = (768 KB + 3072 KB) */ | ||||||
|  | +        { .name = "romfs",   .offset = 0x000C0000, .size = 0x00300000 },     /* 3072 KB */ | ||||||
|  | +        { .name = "nvram",   .offset = 0x003C0000, .size = 0x00010000 },     /*   64 KB */ | ||||||
|  | +        { .name = "factory", .offset = 0x003D0000, .size = 0x00010000 },     /*   64 KB */ | ||||||
|  | +        { .name = "bootldr", .offset = 0x003E0000, .size = 0x00020000 },     /*  128 KB */ | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static int __init rdc3210_mtd_init(void) | ||||||
|  | +{ | ||||||
|  | +        printk(KERN_NOTICE "flash device: 0x%x at 0x%x\n", WINDOW_SIZE, WINDOW_ADDR); | ||||||
|  | + | ||||||
|  | +        rdc3210_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE); | ||||||
|  | + | ||||||
|  | +        if (!rdc3210_map.virt) | ||||||
|  | +        { | ||||||
|  | +                printk("Failed to ioremap\n"); | ||||||
|  | +                return -EIO; | ||||||
|  | +        } | ||||||
|  | + | ||||||
|  | +	simple_map_init(&rdc3210_map); | ||||||
|  | + | ||||||
|  | +        rdc3210_mtd_info = do_map_probe("cfi_probe", &rdc3210_map); | ||||||
|  | +  	/* Dante: This is for fixed map */ | ||||||
|  | +        if (rdc3210_mtd_info) | ||||||
|  | +        { | ||||||
|  | +                rdc3210_mtd_info->owner = THIS_MODULE; | ||||||
|  | +                add_mtd_partitions(rdc3210_mtd_info, rdc3210_parts, sizeof(rdc3210_parts)/sizeof(rdc3210_parts[0])); | ||||||
|  | +                return 0; | ||||||
|  | +        } | ||||||
|  | +	/* Dante: This is for dynamic mapping */ | ||||||
|  | +#if 0 | ||||||
|  | + 	if (rdc3210_mtd_info) | ||||||
|  | +        {       // Dante | ||||||
|  | +                unsigned int    tmp; | ||||||
|  | +                gt_imghdr_t     *hdr; | ||||||
|  | + | ||||||
|  | +                hdr = (gt_imghdr_t *)(rdc3210_map.virt); | ||||||
|  | + | ||||||
|  | +                if(memcmp(hdr->magic, GTIMG_MAGIC, 4)) | ||||||
|  | +                { | ||||||
|  | +                        printk("Invalid MAGIC for Firmware Image!!!\n"); | ||||||
|  | +                        return -EIO; | ||||||
|  | +                } | ||||||
|  | + | ||||||
|  | +                /* 1. Adjust Redboot */ | ||||||
|  | +                tmp = flashdrv_get_size() - rdc3210_parts[4].size; | ||||||
|  | +                rdc3210_parts[4].offset = flashdrv_get_sector_addr(flashdrv_get_sector(tmp)); | ||||||
|  | +                rdc3210_parts[4].size   = flashdrv_get_size() - rdc3210_parts[4].offset; | ||||||
|  | + | ||||||
|  | +                /* 2. Adjust NVRAM */ | ||||||
|  | +                tmp -= rdc3210_parts[3].size; | ||||||
|  | +                rdc3210_parts[3].offset = flashdrv_get_sector_addr(flashdrv_get_sector(tmp)); | ||||||
|  | +                rdc3210_parts[3].size   = rdc3210_parts[4].offset - rdc3210_parts[3].offset; | ||||||
|  | + | ||||||
|  | +                /* 3. Adjust Factory Default */ | ||||||
|  | +                tmp -= rdc3210_parts[2].size; | ||||||
|  | +                rdc3210_parts[2].offset = flashdrv_get_sector_addr(flashdrv_get_sector(tmp)); | ||||||
|  | +                rdc3210_parts[2].size   = rdc3210_parts[3].offset - rdc3210_parts[2].offset; | ||||||
|  | + | ||||||
|  | +                /* 4. Adjust Linux (Kernel + ROMFS) */ | ||||||
|  | +                rdc3210_parts[0].size   = rdc3210_parts[2].offset - rdc3210_parts[0].offset; | ||||||
|  | + | ||||||
|  | +                /* 5. Adjust ROMFS */ | ||||||
|  | +                tmp = hdr->kernelsz + sizeof(gt_imghdr_t); | ||||||
|  | +                rdc3210_parts[1].offset = rdc3210_parts[0].offset + (((tmp / 32) + ((tmp % 32) ? 1 : 0)) * 32); | ||||||
|  | +                rdc3210_parts[1].size   = rdc3210_parts[2].offset - rdc3210_parts[1].offset; | ||||||
|  | + | ||||||
|  | +                /* 1. Adjust Redboot */ | ||||||
|  | +                tmp = flashdrv_get_size() - rdc3210_parts[3].size; | ||||||
|  | +                rdc3210_parts[3].offset = flashdrv_get_sector_addr(flashdrv_get_sector(tmp)); | ||||||
|  | +                rdc3210_parts[3].size   = flashdrv_get_size() - rdc3210_parts[3].offset; | ||||||
|  | + | ||||||
|  | +                /* 2. Adjust NVRAM */ | ||||||
|  | +                tmp -= rdc3210_parts[2].size; | ||||||
|  | +                rdc3210_parts[2].offset = flashdrv_get_sector_addr(flashdrv_get_sector(tmp)); | ||||||
|  | +                rdc3210_parts[2].size   = rdc3210_parts[3].offset - rdc3210_parts[2].offset; | ||||||
|  | + | ||||||
|  | +                /* 4. Adjust Linux (Kernel + ROMFS) */ | ||||||
|  | +                rdc3210_parts[0].size   = rdc3210_parts[2].offset - rdc3210_parts[0].offset; | ||||||
|  | + | ||||||
|  | +                /* 5. Adjust ROMFS */ | ||||||
|  | +                tmp = hdr->kernelsz + sizeof(gt_imghdr_t); | ||||||
|  | +                rdc3210_parts[1].offset = rdc3210_parts[0].offset + (((tmp / 32) + ((tmp % 32) ? 1 : 0)) * 32); | ||||||
|  | +                rdc3210_parts[1].size   = rdc3210_parts[2].offset - rdc3210_parts[1].offset; | ||||||
|  | +                 | ||||||
|  | +		rdc3210_mtd_info->owner = THIS_MODULE; | ||||||
|  | +                add_mtd_partitions(rdc3210_mtd_info, rdc3210_parts, sizeof(rdc3210_parts)/sizeof(rdc3210_parts[0])); | ||||||
|  | +                return 0; | ||||||
|  | +        } | ||||||
|  | +#endif | ||||||
|  | +        iounmap((void *)rdc3210_map.virt); | ||||||
|  | +        return -ENXIO; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void  __exit rdc3210_mtd_exit(void) | ||||||
|  | +{ | ||||||
|  | +        if (rdc3210_mtd_info) | ||||||
|  | +        { | ||||||
|  | +                del_mtd_partitions(rdc3210_mtd_info); | ||||||
|  | +                map_destroy(rdc3210_mtd_info); | ||||||
|  | +        } | ||||||
|  | + | ||||||
|  | +        if (rdc3210_map.virt) | ||||||
|  | +        { | ||||||
|  | +                iounmap(rdc3210_map.virt); | ||||||
|  | +                rdc3210_map.virt = 0; | ||||||
|  | +        } | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +module_init(rdc3210_mtd_init); | ||||||
|  | +module_exit(rdc3210_mtd_exit); | ||||||
|  | +MODULE_LICENSE("GPL"); | ||||||
|  | + | ||||||
							
								
								
									
										1018
									
								
								target/linux/rdc-2.6/patches/002-r6040_ethernet.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1018
									
								
								target/linux/rdc-2.6/patches/002-r6040_ethernet.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user
	 Florian Fainelli
					Florian Fainelli