]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/app/usbcan/ul_usb1.c
Added vendor functions to embedded application, data transferred by usb channel seria...
[lincan.git] / embedded / app / usbcan / ul_usb1.c
index 0b3e388c8176e2df0737a677b3802dc7b7624043..84e16325411fc9ce896de9d490981d3f2387c936 100644 (file)
@@ -186,7 +186,7 @@ int ul_usb1_init_hw_data(struct candevice_t *candev)
        candev->nr_82527_chips=NR_82527;
        candev->nr_sja1000_chips=NR_SJA1000;
        candev->nr_all_chips=NR_82527+NR_SJA1000;
-       //candev->flags |= CANDEV_PROGRAMMABLE_IRQ;
+       candev->flags |= CANDEV_PROGRAMMABLE_IRQ*0;
 
        return 0;
 }
@@ -240,6 +240,9 @@ int ul_usb1_init_chip_data(struct candevice_t *candev, int chipnr)
        candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL |
                                                                sjaOCR_TX0_LH;
 
+       candev->chip[chipnr]->chip_data=(void *)malloc(sizeof(struct ul_usb1_chip_data));
+       if (candev->chip[chipnr]->chip_data==NULL)
+               return -ENOMEM;
        return 0;
 }
 
@@ -295,16 +298,42 @@ int ul_usb1_program_irq(struct candevice_t *candev)
  * Return Value: The function does not return a value
  * File: src/ul_usb1.c
  */
-void ul_usb1_write_register(struct candevice_t *candev,unsigned data, unsigned long address)
+void ul_usb1_write_register(unsigned data, unsigned long address)
 {
-       struct usb_ul_usb1 *dev;
-       int retval;
-       int bytes_transferred;
-       unsigned char buffer[2];
-       buffer[0]=((unsigned char)address & ~CAN_OP_MASK)+CAN_OP_WRITE;
-       buffer[1]=(unsigned char)data;
+       IO1DIR|=0x00FF0000; // Port as output to send data
+       IO1CLR=0x00FF0000; // Clear all data on port
+       // Init
+       SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN);     // Stays high on write
+       SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Stays high on address write
+       SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN); // Sets output buffers to third state
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       //SET_OUT_PIN(IO0,P0_SJA1000_ALE_PIN); // Start command
+
+       // Set memory address
+       IO1SET=__val2mfld(0x00FF0000,address&0xFF); // Shift data to SJA pins and output them
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       //CLR_OUT_PIN(IO0,P0_SJA1000_ALE_PIN); // Makes address active
+       CLR_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+
+       // Setting data
+       CLR_OUT_PIN(IO0,P0_SJA1000_WR_PIN);
+
+       IO1CLR=0x00FF0000;
+       IO1SET=__val2mfld(0x00FF0000,data&0xFF);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Data should be accepted by now
+       SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
 
-       dev = (struct usb_ul_usb1 *)candev->sysdevptr.anydev;
+//     struct usb_ul_usb1 *dev;
+//     int retval;
+//     int bytes_transferred;
+//     unsigned char buffer[2];
+//     buffer[0]=((unsigned char)address & ~CAN_OP_MASK)+CAN_OP_WRITE;
+//     buffer[1]=(unsigned char)data;
+//
+//     dev = (struct usb_ul_usb1 *)candev->sysdevptr.anydev;
 
 //     mutex_lock(&dev->io_mutex);
 //     if (!dev) {             /* disconnect() was called */
@@ -340,16 +369,43 @@ exit:
  * Return Value: The function returns the value stored in @address
  * File: src/ul_usb1.c
  */
-unsigned ul_usb1_read_register(struct candevice_t *candev,unsigned long address)
+unsigned ul_usb1_read_register(unsigned long address)
 {
-       struct usb_ul_usb1 *dev;
-       int retval;
-       int bytes_transferred;
-       unsigned char buffer[2];
-       buffer[0]=((unsigned char)address & ~CAN_OP_MASK)+CAN_OP_READ;
-       buffer[1]=0x00;
-
-       dev = (struct usb_ul_usb1 *)candev->sysdevptr.anydev;
+       unsigned data;
+       IO1DIR|=0x00FF0000; // Port as output to set address
+       IO1CLR=0x00FF0000; // Clear all data
+       // Init
+       SET_OUT_PIN(IO0,P0_SJA1000_WR_PIN); // Stays high on read
+       SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN); // Stays high while entering address
+       SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       //SET_OUT_PIN(IO0,P0_SJA1000_ALE_PIN);
+
+       // Request memory address
+       IO1SET=__val2mfld(0x00FF0000,address&0xFF);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       //CLR_OUT_PIN(IO0,P0_SJA1000_ALE_PIN);
+       CLR_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
+
+       // Get data
+
+       IO1DIR&=~0x00FF0000; // Sets port as input
+       CLR_OUT_PIN(IO0,P0_SJA1000_RD_PIN);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       data=__mfld2val(0x00FF0000,IO1PIN);
+       SET_OUT_PIN(IO0,P0_SJA1000_RD_PIN);
+       SET_OUT_PIN(IO0,P0_SJA1000_CS_PIN);
+       for (slowdown=0;slowdown<SJA1000_SCLK;slowdown++);
+       return data;
+
+//     struct usb_ul_usb1 *dev;
+//     int retval;
+//     int bytes_transferred;
+//     unsigned char buffer[2];
+//     buffer[0]=((unsigned char)address & ~CAN_OP_MASK)+CAN_OP_READ;
+//     buffer[1]=0x00;
+//
+//     dev = (struct usb_ul_usb1 *)candev->sysdevptr.anydev;
 
 //     mutex_lock(&dev->io_mutex);
 //     if (!dev) {             /* disconnect() was called */