4 Commits

Author SHA1 Message Date
Matt Jenkins
ecdf678dac dual sramc 2014-08-27 21:45:25 +01:00
Matt Jenkins
d859d3b71d Imported dual sramc driver
This driver allows you to run two SRAMC devices side-by-side as two
separate rdisk devices.
2014-05-10 21:40:23 +01:00
Matt Jenkins
3409198544 Include new rdisk 2014-05-10 14:05:35 +01:00
Matt Jenkins
d6a6d80d6e Fixed parsing of partition data
The previous method of parsing the prepartition data didn't work right
when you had more than one device.  The new version first finds the
device entry and then parses the partitions from that point on.
2014-04-29 17:31:37 +01:00
5 changed files with 839 additions and 759 deletions

View File

@@ -69,10 +69,14 @@ const struct diskentry disks[] = {
{sd_preinit, sdinit, sddeinit, sdopen, sdsize, card_read, card_write, 1, RD_DEFAULT}, {sd_preinit, sdinit, sddeinit, sdopen, sdsize, card_read, card_write, 1, RD_DEFAULT},
#endif #endif
#ifdef SRAMC_ENABLED #ifdef SRAMC0_ENABLED
{sramc_init, no_init, no_deinit, sramc_open, sramc_size, sramc_read, sramc_write, 0, RD_PREPART}, {sramc_init, no_init, no_deinit, sramc_open, sramc_size, sramc_read, sramc_write, 0, RD_PREPART},
#endif #endif
#ifdef SRAMC1_ENABLED
{sramc_init, no_init, no_deinit, sramc_open, sramc_size, sramc_read, sramc_write, 1, RD_PREPART},
#endif
#ifdef SDRAMP_ENABLED #ifdef SDRAMP_ENABLED
{sdramp_preinit, no_init, no_deinit, sdramp_open, sdramp_size, sdramp_read, sdramp_write, 0, RD_PREPART}, {sdramp_preinit, no_init, no_deinit, sdramp_open, sdramp_size, sdramp_read, sdramp_write, 0, RD_PREPART},
#endif #endif
@@ -576,100 +580,116 @@ struct buf *prepartition_device(char *devname)
int pnum = 0; int pnum = 0;
int start = 2; int start = 2;
char dev[9]; char dev[9];
char size[9]; int size;
char type[5]; int devsize = 0;
int pos = 0; char *ptdata = NULL;
p = prepartition_schema+1; char *ppstart = prepartition_schema;
q = p;
while (*ppstart == '(') {
ppstart++;
}
printf("PP Schema: %s\n",prepartition_schema); printf("PP Schema: %s\n",prepartition_schema);
printf("Attempting partition of %s...\n", devname);
// Let's get the devname into the "dev" variable and append a ":" on the end of it.
q = dev;
for (p=devname; *p; p++) {
*q = *p;
q++;
devsize++;
}
*q++ = ':';
*q = 0;
devsize++;
printf("%%DBG-PPT: Device Name: %s (%d chars)\n", dev, devsize);
// Now we want to scan the string to find the device name. It has to either
// be at the start of the string or be prefixed by a ' '
for (p = ppstart; *(p+devsize); p++) {
if (strncmp(p, dev, devsize) == 0) {
printf("%%DBG-PPT: Device found.\n");
ptdata = p + devsize;
break;
}
}
if (ptdata == NULL) {
printf("%%DBG-PPT: Device not in partition schema\n");
return NULL;
}
// We must have a pointer to the start of the partition data in ptdata now.
// Now to scan through it and get the data into the structures.
printf("%%DBG-PPT: We now like this bit: %s\n", ptdata);
bp = getnewbuf(); bp = getnewbuf();
if(!bp) if(!bp) {
{ printf("%%DBG-PPT: Unable to allocate buffer!\n");
return NULL; return NULL;
} }
mbr = (struct mbr *)bp->b_addr; mbr = (struct mbr *)bp->b_addr;
while(*p) // Ok, let's scan through the data one character at a time until we hit either a
{ // space or a close-bracket (indicating the end of the data).
while(*q && *q != ' ')
q++;
if(*q == ' ')
{
*q = 0;
q++;
}
pos = 0; p = ptdata;
while((*p) && (*p != ':')) pnum = 0;
{ while ((*p != ' ') && (*p != ')')) {
dev[pos++] = *p; // First let's look to see if we have a valid partition type - it's 2 characters
dev[pos] = 0; // followed by an '@'.
p++;
}
if((*p) == ':') printf("%%DBG-PPT: Looking at: %s\n", p);
{
p++;
} else {
printf("Device Format Error (%c)\n",*p);
brelse(bp);
return NULL;
}
while((*p) && (*p != ' ')) // Active swap space
{ if (strncmp(p, "sa@", 3) == 0) {
pos = 0; mbr->partitions[pnum].type=RDISK_SWAP;
while((*p) && (*p != '@')) mbr->partitions[pnum].status = 0x80;
{ } else
type[pos++] = *p;
type[pos] = 0;
p++;
}
if((*p) == '@') // Inactive swap space
{ if (strncmp(p, "sw@", 3) == 0) {
p++; mbr->partitions[pnum].type=RDISK_SWAP;
} else { } else
printf("Type Format Error\n");
brelse(bp);
return NULL;
}
pos = 0; // General UFS filesystem
while((*p) && (*p != ',') && (*p != ' ') && (*p != ')')) if (strncmp(p, "fs@", 3) == 0) {
{ mbr->partitions[pnum].type=RDISK_FS;
size[pos++] = *p; } else {
size[pos] = 0; printf("%%DBG-PPT: Error parsing partition data: %s\n", p);
p++; brelse(bp);
} return NULL;
}
printf("Found partition on %s of type %s and size %s\n", p+=3;
dev,type,size);
if(!strcmp(dev,devname)) size = 0;
{ while ((*p >= '0') && (*p <= '9')) {
if(!strcmp("sw",type)) size *= 10;
mbr->partitions[pnum].type=RDISK_SWAP; size += *p - '0';
if(!strcmp("sa",type)) p++;
{ }
mbr->partitions[pnum].type=RDISK_SWAP;
mbr->partitions[pnum].status = 0x80;
}
if(!strcmp("fs",type))
mbr->partitions[pnum].type=RDISK_FS;
mbr->partitions[pnum].lbastart = start; mbr->partitions[pnum].lbastart = start;
mbr->partitions[pnum].lbalength = atoi(size)<<1; mbr->partitions[pnum].lbalength = size << 1;
start += mbr->partitions[pnum].lbalength;
pnum++; printf("%%DBG-PPT: Added partition %d type %d size %d at offset %d\n",
} pnum,
p++; mbr->partitions[pnum].type,
} mbr->partitions[pnum].lbalength,
} mbr->partitions[pnum].lbastart
);
start += (size << 1);
pnum++;
if (*p == ',') {
p++;
}
}
if(pnum > 0) if(pnum > 0)
{ {

View File

@@ -2,6 +2,7 @@ always
file rd_sramc.o file rd_sramc.o
require rdisk require rdisk
define SRAMC_ENABLED YES define SRAMC_ENABLED YES
define SRAMC%0_ENABLED YES
end always end always
option data option data

View File

@@ -6,7 +6,7 @@ S = ../../../tools/configsys/../../sys/kernel
vpath %.c $(M):$(S) vpath %.c $(M):$(S)
vpath %.S $(M):$(S) vpath %.S $(M):$(S)
KERNOBJ += _startup.o adc.o clock.o cons.o devsw.o exception.o glcd.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o oc.o rd_sd.o rdisk.o signal.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o usb_device.o usb_function_cdc.o usb_uart.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o KERNOBJ += _startup.o adc.o clock.o cons.o devsw.o exception.o gpio.o init_main.o init_sysent.o kern_clock.o kern_descrip.o kern_exec.o kern_exit.o kern_fork.o kern_mman.o kern_proc.o kern_prot.o kern_prot2.o kern_resource.o kern_sig.o kern_sig2.o kern_subr.o kern_synch.o kern_sysctl.o kern_time.o machdep.o mem.o oc.o rd_sd.o rd_sramc.o rdisk.o signal.o spi.o spi_bus.o subr_prf.o subr_rmap.o swap.o sys_generic.o sys_inode.o sys_pipe.o sys_process.o syscalls.o sysctl.o tty.o tty_subr.o tty_tty.o uart.o ufs_alloc.o ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o ufs_mount.o ufs_namei.o ufs_subr.o ufs_syscalls.o ufs_syscalls2.o vers.o vfs_vnops.o vm_sched.o vm_swap.o vm_swp.o
EXTRA_TARGETS = bootloader EXTRA_TARGETS = bootloader
DEFS += -DADC_ENABLED=YES DEFS += -DADC_ENABLED=YES
@@ -16,11 +16,11 @@ DEFS += -DBL_CRYSTAL=8
DEFS += -DBL_LED_PIN=5 DEFS += -DBL_LED_PIN=5
DEFS += -DBL_LED_PORT=TRISE DEFS += -DBL_LED_PORT=TRISE
DEFS += -DBUS_DIV=1 DEFS += -DBUS_DIV=1
DEFS += -DBUS_KHZ=80000 DEFS += -DBUS_KHZ=120000
DEFS += -DCONSOLE_DEVICE=ttyUSB0 DEFS += -DCONSOLE_DEVICE=tty1
DEFS += -DCPU_IDIV=2 DEFS += -DCPU_IDIV=1
DEFS += -DCPU_KHZ=80000 DEFS += -DCPU_KHZ=120000
DEFS += -DCPU_MUL=20 DEFS += -DCPU_MUL=15
DEFS += -DCPU_ODIV=1 DEFS += -DCPU_ODIV=1
DEFS += -DCRYSTAL=8 DEFS += -DCRYSTAL=8
DEFS += -DDC0_DEBUG=DEVCFG0_DEBUG_DISABLED DEFS += -DDC0_DEBUG=DEVCFG0_DEBUG_DISABLED
@@ -35,8 +35,8 @@ DEFS += -DDC1_POSCMOD=DEVCFG1_POSCMOD_HS
DEFS += -DDC1_SOSC=0 DEFS += -DDC1_SOSC=0
DEFS += -DDC1_WDTEN=0 DEFS += -DDC1_WDTEN=0
DEFS += -DDC1_WDTPS=DEVCFG1_WDTPS_1 DEFS += -DDC1_WDTPS=DEVCFG1_WDTPS_1
DEFS += -DDC2_PLLIDIV=DEVCFG2_FPLLIDIV_2 DEFS += -DDC2_PLLIDIV=DEVCFG2_FPLLIDIV_1
DEFS += -DDC2_PLLMUL=DEVCFG2_FPLLMUL_20 DEFS += -DDC2_PLLMUL=DEVCFG2_FPLLMUL_15
DEFS += -DDC2_PLLODIV=DEVCFG2_FPLLODIV_1 DEFS += -DDC2_PLLODIV=DEVCFG2_FPLLODIV_1
DEFS += -DDC2_UPLL=0 DEFS += -DDC2_UPLL=0
DEFS += -DDC2_UPLLIDIV=DEVCFG2_UPLLIDIV_2 DEFS += -DDC2_UPLLIDIV=DEVCFG2_UPLLIDIV_2
@@ -48,7 +48,6 @@ DEFS += -DDC3_USBID=DEVCFG3_FUSBIDIO
DEFS += -DDC3_USERID=0xffff DEFS += -DDC3_USERID=0xffff
DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO DEFS += -DDC3_VBUSON=DEVCFG3_FVBUSONIO
DEFS += -DFLASH_JUMP=0x9d000000 DEFS += -DFLASH_JUMP=0x9d000000
DEFS += -DGLCD_ENABLED=YES
DEFS += -DGPIO_ENABLED=YES DEFS += -DGPIO_ENABLED=YES
DEFS += -DHID_FEATURE_REPORT_BYTES=2 DEFS += -DHID_FEATURE_REPORT_BYTES=2
DEFS += -DHID_INPUT_REPORT_BYTES=2 DEFS += -DHID_INPUT_REPORT_BYTES=2
@@ -56,24 +55,36 @@ DEFS += -DHID_INT_IN_EP_SIZE=64
DEFS += -DHID_INT_OUT_EP_SIZE=64 DEFS += -DHID_INT_OUT_EP_SIZE=64
DEFS += -DHID_OUTPUT_REPORT_BYTES=2 DEFS += -DHID_OUTPUT_REPORT_BYTES=2
DEFS += -DHID_RPT01_SIZE=29 DEFS += -DHID_RPT01_SIZE=29
DEFS += -DHZ=1000
DEFS += -DKERNEL DEFS += -DKERNEL
DEFS += -DLED_KERNEL_PIN=5 DEFS += -DLED_KERNEL_PIN=5
DEFS += -DLED_KERNEL_PORT=TRISE DEFS += -DLED_KERNEL_PORT=TRISE
DEFS += -DNBUF=8
DEFS += -DNMOUNT=3
DEFS += -DNPROC=25
DEFS += -DOC_ENABLED=YES DEFS += -DOC_ENABLED=YES
DEFS += -DPARTITION="sramc0:sa@2048,fs@6140"
DEFS += -DPIC32MX7 DEFS += -DPIC32MX7
DEFS += -DSD0_CS_PIN=9 DEFS += -DSD0_CS_PIN=9
DEFS += -DSD0_CS_PORT=TRISG DEFS += -DSD0_CS_PORT=TRISG
DEFS += -DSD0_MHZ=20
DEFS += -DSD0_PORT=2 DEFS += -DSD0_PORT=2
DEFS += -DUARTUSB_ENABLED=YES DEFS += -DSPI_ENABLED=YES
DEFS += -DSRAMC0_ENABLED=YES
DEFS += -DSRAMC_ENABLED=YES
DEFS += -DUART1_BAUD=115200
DEFS += -DUART1_ENABLED=YES
DEFS += -DUART2_BAUD=115200
DEFS += -DUART2_ENABLED=YES
DEFS += -DUCB_METER DEFS += -DUCB_METER
DEFS += -DUSB_EP0_BUFF_SIZE=8 DEFS += -DUSB_EP0_BUFF_SIZE=8
DEFS += -DUSB_MAX_EP_NUMBER=3 DEFS += -DUSB_MAX_EP_NUMBER=1
DEFS += -DUSB_NUM_STRING_DESCRIPTORS=3 DEFS += -DUSB_NUM_STRING_DESCRIPTORS=3
LDSCRIPT = ../../../tools/configsys/../../sys/pic32/cfg/bootloader.ld LDSCRIPT = ../../../tools/configsys/../../sys/pic32/cfg/bootloader.ld
CONFIG = FUBARINO CONFIG = FUBARINO-UART2CONS-UART1-SRAMC
CONFIGPATH = ../../../tools/configsys CONFIGPATH = ../../../tools/configsys
include ../../../tools/configsys/../../sys/pic32/kernel-post.mk include ../../../tools/configsys/../../sys/pic32/kernel-post.mk

View File

@@ -3,6 +3,7 @@
* *
* This version is for 8MB RAMDISK v.1.1 and compatible * This version is for 8MB RAMDISK v.1.1 and compatible
* Pito 7.4.2014 - PIC32MX PMP bus version * Pito 7.4.2014 - PIC32MX PMP bus version
* Pito 28.4.2014 - Mod for 2 Units
* Under by retrobsd.org used Licence * Under by retrobsd.org used Licence
* No warranties of any kind * No warranties of any kind
* *
@@ -29,23 +30,29 @@
int sw_dkn = -1; /* Statistics slot number */ int sw_dkn = -1; /* Statistics slot number */
// Ramdisk v.1.1. wiring // 8MB Ramdisk v.1.1. wiring
// PMP RAMDISK // PMP RAMDISK
// =================== // ===================
// PMD<D0-D7> D0-D7 // PMD<D0-D7> D0-D7
// PMRD /RD // PMRD /RD
// PMWR /WR // PMWR /WR
// PMA<0> /DATA // PMA<0> /DATA
// PMA<1> 0-Unit0
// PMA<10> 0-Unit1
//#define NDATA (1<<0)
//#define UNIT0 (1<<1)
//#define UNIT1 (1<<10)
// RD and WR pulses duration settings // RD and WR pulses duration settings
// Minimal recommended settings, increase them when unstable // Minimal recommended settings, increase them when unstable
// No warranties of any kind // No warranties of any kind
// for 120MHz clock, 70ns PSRAM, Ramdisk v.1.1. // for 120MHz clock, 70ns PSRAM, 8MB Ramdisk v.1.1.
#define ADR_PULSE 1 #define ADR_PULSE 1
#define WR_PULSE 5 #define WR_PULSE 5
#define RD_PULSE 11 #define RD_PULSE 11
// for 80MHz clock, 70ns PSRAM, Ramdisk v.1.1. // for 80MHz clock, 70ns PSRAM, 8MB Ramdisk v.1.1.
//#define ADR_PULSE 1 //#define ADR_PULSE 1
//#define WR_PULSE 3 //#define WR_PULSE 3
//#define RD_PULSE 8 //#define RD_PULSE 8
@@ -61,35 +68,31 @@ int sw_dkn = -1; /* Statistics slot number */
//#define RD_PULSE 4 //#define RD_PULSE 4
typedef union { typedef union {
unsigned value; unsigned int value;
struct { struct {
unsigned nib1: 4; // lowest nibble unsigned nib1: 4; // lowest nibble
unsigned nib2: 4; unsigned nib2: 4;
unsigned nib3: 4; unsigned nib3: 4;
unsigned nib4: 4; unsigned nib4: 4;
unsigned nib5: 4; unsigned nib5: 4;
unsigned nib6: 4; unsigned nib6: 4;
unsigned nib7: 4; unsigned nib7: 4;
unsigned nib8: 4; // highest nibble unsigned nib8: 4; // highest nibble
}; };
} nybbles ; } nybbles;
/* /*
* Load the 24 bit address to Ramdisk. * Load the 24 bit address to Ramdisk.
* *
*/ */
inline static void inline static void dev_load_address (unsigned int addr)
dev_load_address (addr)
unsigned addr;
{ {
nybbles temp; nybbles temp;
temp.value = addr; temp.value = addr;
while(PMMODE & 0x8000); // Poll - if busy, wait while(PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 1; // set ADR mode (1) to write the Address
PMMODE = 0b10<<8 | (ADR_PULSE<<2); // full ADR speed PMMODE = 0b10<<8 | (ADR_PULSE<<2); // full ADR speed
PMDIN = temp.nib6; /* write 4 bits */ PMDIN = temp.nib6; /* write 4 bits */
@@ -108,7 +111,6 @@ dev_load_address (addr)
while(PMMODE & 0x8000); // Poll - if busy, wait while(PMMODE & 0x8000); // Poll - if busy, wait
PMDIN = temp.nib1; /* write 4 bits */ PMDIN = temp.nib1; /* write 4 bits */
} }
/* /*
@@ -117,64 +119,82 @@ dev_load_address (addr)
*/ */
int sramc_size ( int unit ) int sramc_size ( int unit )
{ {
return 8192; // 4096 for 4MB ramdisk int srsize;
switch (unit) {
case 0: srsize = 8192; break;
case 1: srsize = 8192; break;
}
return srsize;
} }
/* /*
* Read a block of data. * Read a block of data.
*/ */
inline int sramc_read (int unit, unsigned int blockno, char *data, unsigned int nbytes) inline int sramc_read (int unit, unsigned int blockno, register char *data, register unsigned int nbytes)
{ {
int i;
//DEBUG9("sramc%d: read block %u, length %u bytes, addr %p\n", //printf("sramc%d: rd blockno %u, nbytes %u, addr %p\n", unit, blockno, nbytes, data);
// major(dev), blockno, nbytes, data);
dev_load_address (blockno * DEV_BSIZE);
/* Read data. */
while(PMMODE & 0x8000); // Poll - if busy, wait while(PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 0; // set DATA mode (0) switch (unit) {
// set Unit address and ADDRESS mode (1)
case 0: PMADDR = 0b10000000001; break;
case 1: PMADDR = 0b00000000011; break;
}
dev_load_address (blockno * DEV_BSIZE);
while(PMMODE & 0x8000); // Poll - if busy, wait
PMMODE = 0b10<<8 | (RD_PULSE<<2); // read slowly PMMODE = 0b10<<8 | (RD_PULSE<<2); // read slowly
PMADDR = PMADDR & 0b10000000010; // set DATA mode
PMDIN; // Read the PMDIN to clear previous data and latch new data PMDIN; // Read the PMDIN to clear previous data and latch new data
for (i=0; i<nbytes; i++) { while (nbytes--) {
while(PMMODE & 0x8000); // Poll - if busy, wait before reading while(PMMODE & 0x8000); // Poll - if busy, wait before reading
*data++ = PMDIN; /* read a byte of data */ *data++ = PMDIN; /* read a byte of data */
} }
while(PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 0b10000000011; // deselect
return 1; return 1;
} }
/* /*
* Write a block of data. * Write a block of data.
*/ */
inline int sramc_write (int unit, unsigned int blockno, char *data, unsigned int nbytes) inline int sramc_write (int unit, unsigned int blockno, register char *data, register unsigned int nbytes)
{ {
unsigned i;
//DEBUG9("sramc%d: write block %u, length %u bytes, addr %p\n", //printf("sramc%d: wr blockno %u, nbytes %u , addr %p\n", unit, blockno, nbytes, data);
// major(dev), blockno, nbytes, data);
while(PMMODE & 0x8000); // Poll - if busy, wait
switch (unit) {
// set Unit address and ADDRESS mode (1)
case 0: PMADDR = 0b10000000001; break;
case 1: PMADDR = 0b00000000011; break;
}
dev_load_address (blockno * DEV_BSIZE); dev_load_address (blockno * DEV_BSIZE);
/* Write data. */
while (PMMODE & 0x8000); // Poll - if busy, wait while (PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 0; // set DATA mode (0)
PMMODE = 0b10<<8 | (WR_PULSE<<2); // faster with write PMMODE = 0b10<<8 | (WR_PULSE<<2); // faster with write
for (i=0; i<nbytes; i++) { PMADDR = PMADDR & 0b10000000010; // set DATA mode
while(PMMODE & 0x8000); // Poll - if busy, wait
PMDIN = (*data++); /* write a byte of data */
}
while(nbytes--) {
while(PMMODE & 0x8000); // Poll - if busy, wait
PMDIN = (*data++); /* write a byte of data*/
}
while(PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 0b10000000011; // deselect
return 1; return 1;
} }
@@ -184,6 +204,8 @@ inline int sramc_write (int unit, unsigned int blockno, char *data, unsigned int
*/ */
void sramc_init (int unit) void sramc_init (int unit)
{ {
// printf("ramdisk%d: init\n",unit);
struct buf *bp; struct buf *bp;
// Initialize PMP hardware // Initialize PMP hardware
@@ -196,31 +218,50 @@ void sramc_init (int unit)
// MODE WAITB WAITM WAITE // MODE WAITB WAITM WAITE
PMMODE = 0b10<<8 | 0 | (14<<2) | 0 ; // Mode2 Master 8bit PMMODE = 0b10<<8 | 0 | (14<<2) | 0 ; // Mode2 Master 8bit
PMAEN = 1; // PMA<0>, use A0 only PMAEN = 0b10000000011; // PMA<>, use A10,A1,A0
PMADDR = 0; // start with DATA mode PMADDR = 0b10000000010; // start with DATA mode
PMCONSET = 1<<15; // PMP enabled PMCONSET = 1<<15; // PMP enabled
asm volatile ("nop"); asm volatile ("nop");
// make a couple of dummy reads - it refreshes the cpld internals a little bit :) // make a couple of dummy reads - it refreshes the cpld internals a little bit :)
while(PMMODE & 0x8000); // Poll - if busy, wait before reading switch (unit) {
PMDIN; /* read a byte of data */
while(PMMODE & 0x8000); // Poll - if busy, wait before reading
PMDIN; /* read a byte of data */
PMADDR = 1; // go with with ADDRESS mode now case 0: PMADDR = 0b10000000000; // start with DATA mode
while(PMMODE & 0x8000); // Poll - if busy, wait before reading
PMDIN; /* read a byte of data */
while(PMMODE & 0x8000); // Poll - if busy, wait before reading
PMDIN; /* read a byte of data */
bp = prepartition_device("sramc0");
DEBUG3("sramc%d: init done\n",unit); if(bp) {
bp = prepartition_device("sramc0");
if(bp)
{
sramc_write(0, 0, bp->b_addr, 512); sramc_write(0, 0, bp->b_addr, 512);
brelse(bp); brelse(bp);
} }
// printf("sramc%d: init done\n",unit);
break;
return;
case 1: PMADDR = 0b00000000010; // start with DATA mode
while(PMMODE & 0x8000); // Poll - if busy, wait before reading
PMDIN; /* read a byte of data */
while(PMMODE & 0x8000); // Poll - if busy, wait before reading
PMDIN; /* read a byte of data */
bp = prepartition_device("sramc1");
if(bp) {
sramc_write(1, 0, bp->b_addr, 512);
brelse(bp);
}
// printf("sramc%d: init done\n",unit);
break;
}
while(PMMODE & 0x8000); // Poll - if busy, wait
PMADDR = 0b10000000011; // go with with ADDRESS mode
} }
/* /*
@@ -228,6 +269,6 @@ void sramc_init (int unit)
*/ */
int sramc_open (int unit) int sramc_open (int unit)
{ {
DEBUG3("sramc%d: open\n",unit); // printf("sramc%d: open done\n",unit);
return 0; return 0;
} }

View File

@@ -44,12 +44,16 @@ int spi_open(unsigned int bus, unsigned int *tris, unsigned int pin)
case 2: case 2:
spi_devices[dno].bus = (struct spireg *)&SPI2CON; spi_devices[dno].bus = (struct spireg *)&SPI2CON;
break; break;
#ifdef SPI3CON
case 3: case 3:
spi_devices[dno].bus = (struct spireg *)&SPI3CON; spi_devices[dno].bus = (struct spireg *)&SPI3CON;
break; break;
#endif
#ifdef SPI4CON
case 4: case 4:
spi_devices[dno].bus = (struct spireg *)&SPI4CON; spi_devices[dno].bus = (struct spireg *)&SPI4CON;
break; break;
#endif
default: default:
return -1; return -1;
} }
@@ -624,11 +628,14 @@ char *spi_name(int dno)
if(spi_devices[dno].bus == (struct spireg *)&SPI2CON) if(spi_devices[dno].bus == (struct spireg *)&SPI2CON)
return "SPI2"; return "SPI2";
#ifdef SPI3CON
if(spi_devices[dno].bus == (struct spireg *)&SPI3CON) if(spi_devices[dno].bus == (struct spireg *)&SPI3CON)
return "SPI3"; return "SPI3";
#endif
#ifdef SPI4CON
if(spi_devices[dno].bus == (struct spireg *)&SPI4CON) if(spi_devices[dno].bus == (struct spireg *)&SPI4CON)
return "SPI4"; return "SPI4";
#endif
return "SPI?"; return "SPI?";
} }