]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - embedded/app/usbcan/ul_usb1.c
hw side seems complete,
[lincan.git] / embedded / app / usbcan / ul_usb1.c
index 0b3e388c8176e2df0737a677b3802dc7b7624043..e100f9008b0b236c73bbe7470614355d3a10efd2 100644 (file)
@@ -295,16 +295,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 +366,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 */