#include "../include/can_sysdep.h"
#include "../include/main.h"
#include "../include/oscar.h"
-#include "../include/i82527.h"
-#include "../include/sja1000.h"
+#include "../include/sja1000p.h"
#define IO_RANGE 0x80 // allow both basic CAN and PeliCAN modes for sja1000
int oscar_reset(struct candevice_t *candev)
{
- DEBUGMSG("Cannot issue a hardware reset to the CAN chip.");
- return -ENODEV;
+ int i;
+ struct canchip_t *chip=candev->chip[0];
+ unsigned cdr;
+
+ oscar_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD);
+ udelay(1000);
+
+ cdr=oscar_read_register(chip->chip_base_addr+SJACDR);
+ oscar_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+ oscar_write_register(0, chip->chip_base_addr+SJAIER);
+
+ i=20;
+ oscar_write_register(0, chip->chip_base_addr+SJAMOD);
+ while (oscar_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){
+ if(!i--) return -ENODEV;
+ udelay(1000);
+ oscar_write_register(0, chip->chip_base_addr+SJAMOD);
+ }
+
+ cdr=oscar_read_register(chip->chip_base_addr+SJACDR);
+ oscar_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR);
+
+ oscar_write_register(0, chip->chip_base_addr+SJAIER);
+
+ return 0;
}
int oscar_init_hw_data(struct candevice_t *candev)
int oscar_init_chip_data(struct candevice_t *candev, int chipnr)
{
// i82527_fill_chipspecops(candev->chip[chipnr]);
- sja1000_fill_chipspecops(candev->chip[chipnr]);
- // sja1000p_fill_chipspecops(candev->chip[chipnr]);
+ // sja1000_fill_chipspecops(candev->chip[chipnr]);
+ sja1000p_fill_chipspecops(candev->chip[chipnr]);
- candev->chip[chipnr]->chip_base_addr = candev->io_addr;
+ candev->chip[chipnr]->chip_base_addr = can_ioport2ioptr(candev->io_addr);
candev->chip[chipnr]->clock = 12000000;
candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP; // we use an external tranceiver
candev->chip[chipnr]->sja_ocr_reg = sjaOCR_MODE_NORMAL | sjaOCR_TX0_LH;
return 0;
}
-void oscar_write_register(unsigned data, unsigned long address)
+void oscar_write_register(unsigned data, can_ioptr_t address)
{
- outb(data,address);
+ can_outb(data,address);
}
-unsigned oscar_read_register(unsigned long address)
+unsigned oscar_read_register(can_ioptr_t address)
{
- return inb(address);
+ return can_inb(address);
}
/* !!! Don't change this function !!! */