*
* The function hms30c7202_request_io() is used to reserve the io-memory. If your
* hardware uses a dedicated memory range as hardware control registers you
- * will have to add the code to reserve this memory as well.
+ * will have to add the code to reserve this memory as well.
* %IO_RANGE is the io-memory range that gets reserved, please adjust according
* your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or
* #define IO_RANGE 0x20 for sja1000 chips in basic CAN mode.
CANMSG("hmsc30c7202_can failed to request mem region %lx.\n",
(unsigned long)candev->io_addr );
}
-
+
if (!( candev->dev_base_addr = ioremap( candev->io_addr, IO_RANGE ))) {
DEBUGMSG( "Failed to map IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
(unsigned long)candev->io_addr,
can_release_mem_region(candev->io_addr, IO_RANGE);
return -ENODEV;
} else {
-
+
DEBUGMSG( "Mapped IO-memory: 0x%lx - 0x%lx, mapped to 0x%lx\n",
(unsigned long)candev->io_addr,
(unsigned long)candev->io_addr + IO_RANGE - 1,
(unsigned long)candev->dev_base_addr);
-
+
}
-
+
candev->chip[0]->chip_base_addr=candev->dev_base_addr;
-
+
//pchip->write_register(0, pchip->vbase_addr + CCCR);
//DEBUGMSG("C-CAN Control Register : 0x%.4lx\n",
// (unsigned long)(c_can_read_reg_w( pchip->vbase_addr + CCCR)));
candev->chip[0]->chipspecops->start_chip(candev->chip[0]);
//DEBUGMSG("C-CAN Control Register : 0x%.4lx\n",
// (unsigned long)(c_can_read_reg_w( pchip->vbase_addr + CCCR)));
-
+
//DEBUGMSG("hms30c7202_can request i/o, leaving.\n");
return 0;
}
int hms30c7202_release_io(struct candevice_t *candev)
{
u16 tempReg;
-
+
//disable IRQ generation
tempReg = c_can_read_reg_w(candev->chip[0], CCCR);
c_can_config_irqs(candev->chip[0], 0);
-
+
/* // clear all message objects
for (i=1; i<=15; i++) {
ccscan_write_register(
*/
// power down HMS30c7202 - C_CAN
candev->chip[0]->chipspecops->stop_chip(candev->chip[0]);
-
+
// release I/O memory mapping
iounmap(candev->dev_base_addr);
-
+
// Release the memory region
can_release_mem_region(candev->io_addr, IO_RANGE);
-
+
return 0;
}
int i=0;
int enableTest=0, disableTest=0;
struct canchip_t *pchip = candev->chip[0];
-
+
enableTest = pchip->chipspecops->enable_configuration(pchip);
disableTest = pchip->chipspecops->disable_configuration(pchip);
if( enableTest || disableTest) {
CANMSG("Please check your hardware.\n");
return -ENODEV;
}
-
+
/* Check busoff status */
-
+
while ( (c_can_read_reg_w(pchip, CCSR) & SR_BOFF) && (i<=15)) {
udelay(20000);
i++;
}
else
DEBUGMSG("Chip0 reset status ok.\n");
-
+
//pchip->config_irqs(pchip, CR_MIE | CR_SIE | CR_EIE);
return 0;
}
* Return Value: The function always returns zero
* File: src/template.c
*/
-int hms30c7202_init_hw_data(struct candevice_t *candev)
+int hms30c7202_init_hw_data(struct candevice_t *candev)
/*( struct canchip_t *pchip, u16 chip_nr, u16 startminor, u32 baseaddr, u8 irq )*/
{
// u32 intCntrVAddr = 0;
can_ioptr_t gpioVAddr = 0;
u32 tempReg = 0;
u32 baseaddr=candev->io_addr;
-
+
// if ( (!( intCntrVAddr = ioremap( 0x80024000, 0xCD ) ))
// & (! ( gpioVAddr = ioremap( 0x80023000, 0xAD ) ))) {
// DEBUGMSG("Failed to map Int and GPIO memory\n");
DEBUGMSG("Failed to map GPIO memory\n");
return -EIO;
} else {
-
+
// DEBUGMSG( "Mapped Interrupt Controller IO-memory: 0x%lx - 0x%lx to 0x%lx\n",
// (unsigned long)0X80024000,
// (unsigned long)0X800240CC,
(unsigned long)0X800240AC,
(unsigned long)gpioVAddr);
}
-
+
if (baseaddr == 0x8002f000) {
// tempReg = can_readl(intCntrVAddr);
// DEBUGMSG("Read Interrupt Enable Register : 0x%.4lx\n",(long)tempReg);
// Initialize chip data ( only one chip )
// pcandev->pchip[ 0 ]->powner = pcandev;
/*pchip->ntype = CAN_CHIPTYPE_C_CAN;*/
-
+
candev->nr_82527_chips=0;
candev->nr_sja1000_chips=0;
candev->nr_all_chips=NR_C_CAN;
candev->chip[chipnr]->max_objects = NR_MSGOBJ;
candev->chip[chipnr]->chip_base_addr=candev->io_addr;
-
+
candev->chip[chipnr]->clock = 16000000/2;
-
+
/*candev->chip[chipnr]->int_clk_reg = 0x0;
candev->chip[chipnr]->int_bus_reg = 0x0;
candev->chip[chipnr]->sja_cdr_reg = 0x0;
candev->chip[chipnr]->sja_ocr_reg = 0x0;*/
-
+
return 0;
}
*
* The function hms30c7202_init_obj_data() is used to initialize the hardware
* structure containing information about the different message objects on the
- * CAN chip.
- * The entry @obj_base_addr represents the first memory address of the message
- * object.
+ * CAN chip.
+ * The entry @obj_base_addr represents the first memory address of the message
+ * object.
* Unless the hardware uses a segmented memory map, flags can be set zero.
* Return Value: The function always returns zero
* File: src/template.c
/* It seems, that there is no purpose to setup object base address */
chip->msgobj[objnr]->obj_base_addr=0;
-
+
/*can_msgobj_test_fl(pmsgobj,RX_MODE_EXT);*/
return 0;
}
address = can_ulong2ioptr(((addr & C_CAN_REGOFFS_MASK) << 1) |
(addr & ~C_CAN_REGOFFS_MASK));
-
+
//DEBUGMSG("Trying to write 0x%u16x to address 0x%lx\n",data,address);
-
+
can_writew(data,address);
//udelay( usecs );
for (i=0; i<5; i++);
{
unsigned long addr=can_ioptr2ulong(address);
u16 value, i;
-
+
address = can_ulong2ioptr(((addr & C_CAN_REGOFFS_MASK) << 1) |
(addr & ~C_CAN_REGOFFS_MASK));
//DEBUGMSG("Trying to read from address 0x%lx :",address);
-
+
value = can_readw(address);
//udelay( usecs );
for (i=0;i<5;i++);
value = can_readw(address);
//udelay( usecs );
for (i=0;i<5;i++);
-
+
//DEBUGMSG("0x%u16x\n",value);
return value;
* hms30c7202_program_irq - program interrupts
* @candev: Pointer to candevice/board structure
*
- * The function hms30c7202_program_irq() is used for hardware that uses
+ * The function hms30c7202_program_irq() is used for hardware that uses
* programmable interrupts. If your hardware doesn't use programmable interrupts
- * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and
- * leave this function unedited. Again this function is hardware specific so
+ * you should not set the @candevices_t->flags entry to %CANDEV_PROGRAMMABLE_IRQ and
+ * leave this function unedited. Again this function is hardware specific so
* there's no example code.
* Return value: The function returns zero on success or %-ENODEV on failure
* File: src/template.c