]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/c_can.c
Added attach_to_chip() and release_chip() functions for each chip.
[lincan.git] / lincan / src / c_can.c
index e51181b0233c778678676b27ca6b2e87647f96f6..4c052c312603d2b0bef68cb518564fe444cde143 100644 (file)
@@ -484,18 +484,26 @@ int c_can_pre_read_config(struct canchip_t *pchip, struct msgobj_t *pmsgobj)
 
    spin_lock( &c_can_if1lock );
 
-
    //loading Message Object in IF1
-   if (c_can_if1_busycheck(pmsgobj->hostchip)) return -ENODEV;
+   if (c_can_if1_busycheck(pmsgobj->hostchip))
+       goto error_enodev;
+   
    c_can_write_reg_w(pmsgobj->hostchip, readMaskCM, CCIF1CM);
    c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
    //setting Message Valid Bit to zero
-   if (c_can_if1_busycheck(pmsgobj->hostchip)) return -ENODEV;
+   if (c_can_if1_busycheck(pmsgobj->hostchip))
+       goto error_enodev;
+
    c_can_write_reg_w(pmsgobj->hostchip, 0, CCIF1A2);
    c_can_write_reg_w(pmsgobj->hostchip, writeMaskCM, CCIF1CM);
    c_can_write_reg_w(pmsgobj->hostchip, pmsgobj->object, CCIF1CR);
+
    //Configuring Message-Object
-   if (c_can_if1_busycheck(pmsgobj->hostchip)) return -ENODEV;
+   /* Only access when the C_CAN controller is idle */
+   if (c_can_if1_busycheck(pmsgobj->hostchip))
+       goto error_enodev;
+
    mcreg = c_can_read_reg_w(pmsgobj->hostchip, CCIF1CM);
    c_can_write_reg_w(pmsgobj->hostchip, 
                      ((mcreg & IFXMC_UMASK) | IFXMC_EOB | IFXMC_RXIE), CCIF1DMC);
@@ -524,6 +532,12 @@ int c_can_pre_read_config(struct canchip_t *pchip, struct msgobj_t *pmsgobj)
 #endif
 
    return 0;
+
+error_enodev:
+   CANMSG("Timeout in c_can_if1_busycheck\n");
+   spin_unlock(&c_can_if1lock);
+   return -ENODEV;
+
 }
 
 ///////////////////////////////////////////////////////////////////////
@@ -736,6 +750,29 @@ int c_can_stop_chip(struct canchip_t *pchip)
    return 0;
 }
 
+int c_can_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+int c_can_release_chip(struct canchip_t *chip)
+{
+       int temp;
+
+       temp = c_can_read_reg_w(chip, CCCR);
+
+       /* Disable IRQ generation */
+       c_can_config_irqs(chip, 0);
+
+       temp = c_can_read_reg_w(chip, CCCR);
+
+       /* Power-down C_CAN, except this does nothing in the version 1.2 */
+       c_can_stop_chip(chip);
+
+
+       return 0;
+}
+
 ///////////////////////////////////////////////////////////////////////
 /*
  *Check the TxOK bit of the Status Register and resets it afterwards.
@@ -932,6 +969,8 @@ int c_can_register(struct chipspecops_t *chipspecops)
        chipspecops->remote_request=c_can_remote_request;
        chipspecops->enable_configuration=c_can_enable_configuration;
        chipspecops->disable_configuration=c_can_disable_configuration;
+       chipspecops->attach_to_chip=c_can_attach_to_chip;
+       chipspecops->release_chip=c_can_release_chip;
        chipspecops->set_btregs=c_can_set_btregs;
        chipspecops->start_chip=c_can_start_chip;
        chipspecops->stop_chip=c_can_stop_chip;