]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - common/cmd_fdc.c
driver/serial: delete at91rm9200_usart
[karo-tx-uboot.git] / common / cmd_fdc.c
index 3b8f80b64da2049b9e0ba8f94491a8d7c42482e8..cdb050c255980577d460b4e2da15c5b30e804a2f 100644 (file)
 #define FALSE           0
 #endif
 
-
 /*#if defined(CONFIG_CMD_DATE) */
 /*#include <rtc.h> */
 /*#endif */
 
-#if defined(CONFIG_CMD_FDC) || defined(CONFIG_CMD_FDOS)
-
-
 typedef struct {
-       int                                             flags;          /* connected drives ect */
-       unsigned long blnr;                     /* Logical block nr */
-       uchar                                   drive;          /* drive no */
-       uchar                                   cmdlen;         /* cmd length */
-       uchar                                   cmd[16];        /* cmd desc */
-       uchar                                   dma;                    /* if > 0 dma enabled */
-       uchar                                   result[11];/* status information */
-       uchar                                   resultlen; /* lenght of result */
+       int             flags;          /* connected drives ect */
+       unsigned long   blnr;           /* Logical block nr */
+       uchar           drive;          /* drive no */
+       uchar           cmdlen;         /* cmd length */
+       uchar           cmd[16];        /* cmd desc */
+       uchar           dma;            /* if > 0 dma enabled */
+       uchar           result[11];     /* status information */
+       uchar           resultlen;      /* lenght of result */
 } FDC_COMMAND_STRUCT;
+
 /* flags: only the lower 8bit used:
  * bit 0 if set drive 0 is present
  * bit 1 if set drive 1 is present
@@ -75,31 +72,30 @@ typedef struct {
  * bit 7 if set disk in drive 4 is inserted
  */
 
-
 /* cmd indexes */
-#define COMMAND                0
-#define DRIVE                  1
+#define COMMAND                        0
+#define DRIVE                  1
 #define CONFIG0                        1
-#define SPEC_HUTSRT    1
-#define TRACK                  2
+#define SPEC_HUTSRT            1
+#define TRACK                  2
 #define CONFIG1                        2
 #define SPEC_HLT               2
-#define HEAD                           3
+#define HEAD                   3
 #define CONFIG2                        3
-#define SECTOR                         4
-#define SECTOR_SIZE    5
-#define LAST_TRACK     6
-#define GAP                                    7
-#define DTL                                    8
+#define SECTOR                 4
+#define SECTOR_SIZE            5
+#define LAST_TRACK             6
+#define GAP                    7
+#define DTL                    8
 /* result indexes */
-#define STATUS_0                                               0
-#define STATUS_PCN                                     1
-#define STATUS_1                                               1
-#define STATUS_2                                               2
-#define STATUS_TRACK                           3
-#define STATUS_HEAD                                    4
-#define STATUS_SECT                                    5
-#define STATUS_SECT_SIZE               6
+#define STATUS_0               0
+#define STATUS_PCN             1
+#define STATUS_1               1
+#define STATUS_2               2
+#define STATUS_TRACK           3
+#define STATUS_HEAD            4
+#define STATUS_SECT            5
+#define STATUS_SECT_SIZE       6
 
 
 /* Register addresses */
@@ -114,34 +110,34 @@ typedef struct {
 #define FDC_DIR                FDC_BASE + 6    /* Digital Input Register */
 #define FDC_CCR                FDC_BASE + 7    /* Configuration Control */
 /* Commands */
-#define FDC_CMD_SENSE_INT              0x08
-#define FDC_CMD_CONFIGURE              0x13
-#define FDC_CMD_SPECIFY                                0x03
-#define FDC_CMD_RECALIBRATE    0x07
-#define FDC_CMD_READ                                   0x06
-#define FDC_CMD_READ_TRACK             0x02
-#define FDC_CMD_READ_ID                                0x0A
-#define FDC_CMD_DUMP_REG                       0x0E
-#define FDC_CMD_SEEK                                   0x0F
-
-#define FDC_CMD_SENSE_INT_LEN          0x01
-#define FDC_CMD_CONFIGURE_LEN          0x04
-#define FDC_CMD_SPECIFY_LEN                            0x03
-#define FDC_CMD_RECALIBRATE_LEN        0x02
-#define FDC_CMD_READ_LEN                                       0x09
-#define FDC_CMD_READ_TRACK_LEN         0x09
-#define FDC_CMD_READ_ID_LEN                            0x02
-#define FDC_CMD_DUMP_REG_LEN                   0x01
-#define FDC_CMD_SEEK_LEN                                       0x03
-
-#define FDC_FIFO_THR                   0x0C
-#define FDC_FIFO_DIS                   0x00
+#define FDC_CMD_SENSE_INT      0x08
+#define FDC_CMD_CONFIGURE      0x13
+#define FDC_CMD_SPECIFY                0x03
+#define FDC_CMD_RECALIBRATE    0x07
+#define FDC_CMD_READ           0x06
+#define FDC_CMD_READ_TRACK     0x02
+#define FDC_CMD_READ_ID                0x0A
+#define FDC_CMD_DUMP_REG       0x0E
+#define FDC_CMD_SEEK           0x0F
+
+#define FDC_CMD_SENSE_INT_LEN  0x01
+#define FDC_CMD_CONFIGURE_LEN  0x04
+#define FDC_CMD_SPECIFY_LEN    0x03
+#define FDC_CMD_RECALIBRATE_LEN        0x02
+#define FDC_CMD_READ_LEN       0x09
+#define FDC_CMD_READ_TRACK_LEN 0x09
+#define FDC_CMD_READ_ID_LEN    0x02
+#define FDC_CMD_DUMP_REG_LEN   0x01
+#define FDC_CMD_SEEK_LEN       0x03
+
+#define FDC_FIFO_THR           0x0C
+#define FDC_FIFO_DIS           0x00
 #define FDC_IMPLIED_SEEK       0x01
-#define FDC_POLL_DIS                   0x00
-#define FDC_PRE_TRK                            0x00
-#define FDC_CONFIGURE                  FDC_FIFO_THR | (FDC_POLL_DIS<<4) | (FDC_FIFO_DIS<<5) | (FDC_IMPLIED_SEEK << 6)
-#define FDC_MFM_MODE                   0x01 /* MFM enable */
-#define FDC_SKIP_MODE                  0x00 /* skip enable */
+#define FDC_POLL_DIS           0x00
+#define FDC_PRE_TRK            0x00
+#define FDC_CONFIGURE          FDC_FIFO_THR | (FDC_POLL_DIS<<4) | (FDC_FIFO_DIS<<5) | (FDC_IMPLIED_SEEK << 6)
+#define FDC_MFM_MODE           0x01 /* MFM enable */
+#define FDC_SKIP_MODE          0x00 /* skip enable */
 
 #define FDC_TIME_OUT 100000 /* time out */
 #define        FDC_RW_RETRIES          3 /* read write retries */
@@ -150,18 +146,18 @@ typedef struct {
 
 /* Disk structure */
 typedef struct  {
-       unsigned int size;                      /* nr of sectors total */
-       unsigned int sect;                      /* sectors per track */
-       unsigned int head;                      /* nr of heads */
-       unsigned int track;                     /* nr of tracks */
-       unsigned int stretch;           /* !=0 means double track steps */
-       unsigned char   gap;                    /* gap1 size */
-       unsigned char   rate;                   /* data rate. |= 0x40 for perpendicular */
-       unsigned char   spec1;          /* stepping rate, head unload time */
-       unsigned char   fmt_gap;        /* gap2 size */
-       unsigned char hlt;                      /* head load time */
-       unsigned char sect_code; /* Sector Size code */
-       const char      * name;                 /* used only for predefined formats */
+       unsigned int size;      /* nr of sectors total */
+       unsigned int sect;      /* sectors per track */
+       unsigned int head;      /* nr of heads */
+       unsigned int track;     /* nr of tracks */
+       unsigned int stretch;   /* !=0 means double track steps */
+       unsigned char   gap;    /* gap1 size */
+       unsigned char   rate;   /* data rate. |= 0x40 for perpendicular */
+       unsigned char   spec1;  /* stepping rate, head unload time */
+       unsigned char   fmt_gap;/* gap2 size */
+       unsigned char hlt;      /* head load time */
+       unsigned char sect_code;/* Sector Size code */
+       const char      * name; /* used only for predefined formats */
 } FD_GEO_STRUCT;
 
 
@@ -174,42 +170,17 @@ const static FD_GEO_STRUCT floppy_type[2] = {
 static FDC_COMMAND_STRUCT cmd; /* global command struct */
 
 /* If the boot drive number is undefined, we assume it's drive 0             */
-#ifndef CFG_FDC_DRIVE_NUMBER
-#define CFG_FDC_DRIVE_NUMBER 0
+#ifndef CONFIG_SYS_FDC_DRIVE_NUMBER
+#define CONFIG_SYS_FDC_DRIVE_NUMBER 0
 #endif
 
 /* Hardware access */
-#ifndef CFG_ISA_IO_STRIDE
-#define CFG_ISA_IO_STRIDE 1
+#ifndef CONFIG_SYS_ISA_IO_STRIDE
+#define CONFIG_SYS_ISA_IO_STRIDE 1
 #endif
 
-#ifndef CFG_ISA_IO_OFFSET
-#define CFG_ISA_IO_OFFSET 0
-#endif
-
-
-#ifdef CONFIG_AMIGAONEG3SE
-unsigned char INT6_Status;
-
-void fdc_interrupt(void)
-{
-    INT6_Status = 0x80;
-}
-
-/* waits for an interrupt (polling) */
-int wait_for_fdc_int(void)
-{
-       unsigned long timeout;
-       timeout = FDC_TIME_OUT;
-       while(((volatile)INT6_Status & 0x80) == 0) {
-               timeout--;
-               udelay(10);
-               if(timeout == 0) /* timeout occured */
-                       return FALSE;
-       }
-       INT6_Status = 0;
-       return TRUE;
-}
+#ifndef CONFIG_SYS_ISA_IO_OFFSET
+#define CONFIG_SYS_ISA_IO_OFFSET 0
 #endif
 
 /* Supporting Functions */
@@ -217,9 +188,9 @@ int wait_for_fdc_int(void)
 unsigned char read_fdc_reg(unsigned int addr)
 {
        volatile unsigned char *val =
-               (volatile unsigned char *)(CFG_ISA_IO_BASE_ADDRESS +
-                                          (addr * CFG_ISA_IO_STRIDE) +
-                                          CFG_ISA_IO_OFFSET);
+               (volatile unsigned char *)(CONFIG_SYS_ISA_IO_BASE_ADDRESS +
+                                          (addr * CONFIG_SYS_ISA_IO_STRIDE) +
+                                          CONFIG_SYS_ISA_IO_OFFSET);
 
        return val [0];
 }
@@ -228,13 +199,12 @@ unsigned char read_fdc_reg(unsigned int addr)
 void write_fdc_reg(unsigned int addr, unsigned char val)
 {
        volatile unsigned char *tmp =
-               (volatile unsigned char *)(CFG_ISA_IO_BASE_ADDRESS +
-                                          (addr * CFG_ISA_IO_STRIDE) +
-                                          CFG_ISA_IO_OFFSET);
+               (volatile unsigned char *)(CONFIG_SYS_ISA_IO_BASE_ADDRESS +
+                                          (addr * CONFIG_SYS_ISA_IO_STRIDE) +
+                                          CONFIG_SYS_ISA_IO_OFFSET);
        tmp[0]=val;
 }
 
-#ifndef CONFIG_AMIGAONEG3SE
 /* waits for an interrupt (polling) */
 int wait_for_fdc_int(void)
 {
@@ -249,8 +219,6 @@ int wait_for_fdc_int(void)
        return TRUE;
 }
 
-#endif
-
 /* reads a byte from the FIFO of the FDC and checks direction and RQM bit
    of the MSR. returns -1 if timeout, or byte if ok */
 int read_fdc_byte(void)
@@ -342,7 +310,7 @@ int fdc_issue_cmd(FDC_COMMAND_STRUCT *pCMD,FD_GEO_STRUCT *pFG)
                case FDC_CMD_CONFIGURE:
                        pCMD->cmd[CONFIG0]=0;
                        pCMD->cmd[CONFIG1]=FDC_CONFIGURE; /* FIFO Threshold, Poll, Enable FIFO */
-                       pCMD->cmd[CONFIG2]=FDC_PRE_TRK;         /* Precompensation Track */
+                       pCMD->cmd[CONFIG2]=FDC_PRE_TRK; /* Precompensation Track */
                        pCMD->cmdlen=FDC_CMD_CONFIGURE_LEN;
                        pCMD->resultlen=0;  /* no result */
                        break;
@@ -442,7 +410,6 @@ int fdc_seek(FDC_COMMAND_STRUCT *pCMD,FD_GEO_STRUCT *pFG)
        return(fdc_issue_cmd(pCMD,pFG));
 }
 
-#ifndef CONFIG_AMIGAONEG3SE
 /* terminates current command, by not servicing the FIFO
  * waits for interrupt and fills in the result bytes */
 int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
@@ -456,27 +423,6 @@ int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
        }
        return TRUE;
 }
-#endif
-#ifdef CONFIG_AMIGAONEG3SE
-int fdc_terminate(FDC_COMMAND_STRUCT *pCMD)
-{
-       int i;
-       for(i=0;i<100;i++)
-               udelay(500); /* wait 500usec for fifo overrun */
-       while((INT6_Status&0x80)==0x00); /* wait as long as no int has occured */
-       for(i=0;i<7;i++) {
-               pCMD->result[i]=(unsigned char)read_fdc_byte();
-       }
-       INT6_Status = 0;
-       return TRUE;
-}
-
-#endif
-
-#ifdef CONFIG_AMIGAONEG3SE
-#define disable_interrupts() 0
-#define enable_interrupts() (void)0
-#endif
 
 /* reads data from FDC, seek commands are issued automatic */
 int fdc_read_data(unsigned char *buffer, unsigned long blocks,FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
@@ -514,7 +460,7 @@ int fdc_read_data(unsigned char *buffer, unsigned long blocks,FDC_COMMAND_STRUCT
        if(readblk>blocks) /* is end within 1st track */
                readblk=blocks; /* yes, correct it */
        PRINTF("we read %ld blocks start %ld\n",readblk,pCMD->blnr);
-       bufferw=&buffer[0]; /* setup working buffer */
+       bufferw = &buffer[0]; /* setup working buffer */
        do {
 retryrw:
                len=sect_size * readblk;
@@ -568,7 +514,7 @@ retryrw:
                 * we need to get the results */
                fdc_terminate(pCMD);
                offset+=(sect_size*readblk); /* set up buffer pointer */
-               bufferw=&buffer[offset];
+               bufferw = &buffer[offset];
                pCMD->blnr+=readblk; /* update current block nr */
                blocks-=readblk; /* update blocks */
                if(blocks==0)
@@ -597,11 +543,6 @@ retrycal:
        return TRUE;
 }
 
-#ifdef CONFIG_AMIGAONEG3SE
-#undef disable_interrupts()
-#undef enable_interrupts()
-#endif
-
 /* Scan all drives and check if drive is present and disk is inserted */
 int fdc_check_drive(FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
 {
@@ -651,12 +592,7 @@ int fdc_setup(int drive, FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
 {
        int i;
 
-#ifdef CONFIG_AMIGAONEG3SE
-       irq_install_handler(6, (interrupt_handler_t *)fdc_interrupt, NULL);
-       i8259_unmask_irq(6);
-#endif
-
-#ifdef CFG_FDC_HW_INIT
+#ifdef CONFIG_SYS_FDC_HW_INIT
        fdc_hw_init ();
 #endif
        /* first, we reset the FDC via the DOR */
@@ -707,7 +643,6 @@ int fdc_setup(int drive, FDC_COMMAND_STRUCT *pCMD, FD_GEO_STRUCT *pFG)
 
        return TRUE;
 }
-#endif
 
 #if defined(CONFIG_CMD_FDOS)
 
@@ -778,7 +713,7 @@ int fdc_fdos_read (void *buffer, int len)
 /****************************************************************************
  * main routine do_fdcboot
  */
-int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        FD_GEO_STRUCT *pFG = (FD_GEO_STRUCT *)floppy_type;
        FDC_COMMAND_STRUCT *pCMD = &cmd;
@@ -788,23 +723,25 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        int i,nrofblk;
        char *ep;
        int rcode = 0;
+#if defined(CONFIG_FIT)
+       const void *fit_hdr = NULL;
+#endif
 
        switch (argc) {
        case 1:
-               addr = CFG_LOAD_ADDR;
-               boot_drive=CFG_FDC_DRIVE_NUMBER;
+               addr = CONFIG_SYS_LOAD_ADDR;
+               boot_drive=CONFIG_SYS_FDC_DRIVE_NUMBER;
                break;
        case 2:
                addr = simple_strtoul(argv[1], NULL, 16);
-               boot_drive=CFG_FDC_DRIVE_NUMBER;
+               boot_drive=CONFIG_SYS_FDC_DRIVE_NUMBER;
                break;
        case 3:
                addr = simple_strtoul(argv[1], NULL, 16);
                boot_drive=simple_strtoul(argv[2], NULL, 10);
                break;
        default:
-               printf ("Usage:\n%s\n", cmdtp->usage);
-               return 1;
+               return cmd_usage(cmdtp);
        }
        /* setup FDC and scan for drives  */
        if(fdc_setup(boot_drive,pCMD,pFG)==FALSE) {
@@ -835,14 +772,27 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
                        printf("result%d: 0x%02X\n",i,pCMD->result[i]);
                return 1;
        }
-       hdr = (image_header_t *)addr;
-       if (!image_get_magic (hdr)) {
-               printf ("Bad Magic Number\n");
+
+       switch (genimg_get_format ((void *)addr)) {
+       case IMAGE_FORMAT_LEGACY:
+               hdr = (image_header_t *)addr;
+               image_print_contents (hdr);
+
+               imsize = image_get_image_size (hdr);
+               break;
+#if defined(CONFIG_FIT)
+       case IMAGE_FORMAT_FIT:
+               fit_hdr = (const void *)addr;
+               puts ("Fit image detected...\n");
+
+               imsize = fit_get_size (fit_hdr);
+               break;
+#endif
+       default:
+               puts ("** Unknown image type\n");
                return 1;
        }
-       print_image_hdr (hdr);
 
-       imsize= image_get_image_size (hdr);
        nrofblk=imsize/512;
        if((imsize%512)>0)
                nrofblk++;
@@ -858,39 +808,39 @@ int do_fdcboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        printf("OK %ld Bytes loaded.\n",imsize);
 
        flush_cache (addr, imsize);
-       /* Loading ok, update default load address */
-
-       load_addr = addr;
-       if(image_check_type (hdr, IH_TYPE_KERNEL)) {
-               /* Check if we should attempt an auto-start */
-               if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
-                       char *local_args[2];
-                       extern int do_bootm (cmd_tbl_t *, int, int, char *[]);
-
-                       local_args[0] = argv[0];
-                       local_args[1] = NULL;
 
-                       printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);
-
-                       do_bootm (cmdtp, 0, 1, local_args);
-                       rcode ++;
+#if defined(CONFIG_FIT)
+       /* This cannot be done earlier, we need complete FIT image in RAM first */
+       if (genimg_get_format ((void *)addr) == IMAGE_FORMAT_FIT) {
+               if (!fit_check_format (fit_hdr)) {
+                       puts ("** Bad FIT image format\n");
+                       return 1;
                }
+               fit_print_contents (fit_hdr);
        }
-       return rcode;
-}
-
-
 #endif
 
+       /* Loading ok, update default load address */
+       load_addr = addr;
 
-/***************************************************/
+       /* Check if we should attempt an auto-start */
+       if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {
+               char *local_args[2];
 
+               local_args[0] = argv[0];
+               local_args[1] = NULL;
 
-#if defined(CONFIG_CMD_FDC)
+               printf ("Automatic boot of image at addr 0x%08lX ...\n", addr);
+
+               do_bootm (cmdtp, 0, 1, local_args);
+               rcode ++;
+       }
+       return rcode;
+}
 
 U_BOOT_CMD(
        fdcboot,        3,      1,      do_fdcboot,
-       "fdcboot - boot from floppy device\n",
-       "loadAddr drive\n"
+       "boot from floppy device",
+       "loadAddr drive"
 );
 #endif