From: ppisa Date: Sun, 23 Nov 2008 21:54:52 +0000 (+0000) Subject: The old "pikronisa" card support renamed to "gensja1000mm". X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/commitdiff_plain/99ed90d6d898c39a78a78fb65c9df21716f5f6c6 The old "pikronisa" card support renamed to "gensja1000mm". The "gensja1000mm" can be used with cards which provide directly mapped SJA1000 chip access. The parameter clockfreq=24000 is required for "pikronisa" cards. The clocks default frequency is set to 16 MHz. Signed-off-by: ppisa --- diff --git a/lincan/README b/lincan/README index faf2677..d05c780 100644 --- a/lincan/README +++ b/lincan/README @@ -252,7 +252,8 @@ The hw argument can be one of: - m437, for the M436 PC/104 card by SECO - bfadcan for sja1000 CAN embedded card made by BFAD GmbH - gensja1000io for many sja1000 I/O mapped cards (PCAN-PC/104 for example). -- pikronisa for ISA memory mapped sja1000 CAN card made by PiKRON Ltd. +- gensja1000mm for ISA memory mapped sja1000 CAN cards + (for pikronisa card used by PiKRON Ltd. the clockfreq=24000 has to be specified) - pimx1 for MX1_DIS1 extension board for PiMX1 ARM based BCC - msmcan for MICROSPACE IO space indexed i82527 - unican for Unicontrols PCAN card diff --git a/lincan/include/gensja1000mm.h b/lincan/include/gensja1000mm.h new file mode 100644 index 0000000..cfa7dbe --- /dev/null +++ b/lincan/include/gensja1000mm.h @@ -0,0 +1,22 @@ +/* gensja1000mm.h + * Header file for the Linux CAN-bus driver. + * Written by Arnaud Westenberg email:arnaud@wanadoo.nl + * Added by Pavel Pisa pisa@cmp.felk.cvut.cz + * email:pisa@cmp.felk.cvut.cz + * This software is released under the GPL-License. + * Version lincan-0.3 17 Jun 2004 + * + * Generic support for SJA1000 memory mapped CAN cards + * memory mapped SJA1000 controller + */ + +int gensja1000mm_request_io(struct candevice_t *candev); +int gensja1000mm_release_io(struct candevice_t *candev); +int gensja1000mm_reset(struct candevice_t *candev); +int gensja1000mm_init_hw_data(struct candevice_t *candev); +int gensja1000mm_init_chip_data(struct candevice_t *candev, int chipnr); +int gensja1000mm_init_obj_data(struct canchip_t *chip, int objnr); +int gensja1000mm_program_irq(struct candevice_t *candev); +void gensja1000mm_write_register(unsigned data, can_ioptr_t address); +unsigned gensja1000mm_read_register(can_ioptr_t address); + diff --git a/lincan/include/pikronisa.h b/lincan/include/pikronisa.h deleted file mode 100644 index 292c46e..0000000 --- a/lincan/include/pikronisa.h +++ /dev/null @@ -1,22 +0,0 @@ -/* pikronisa.h - * Header file for the Linux CAN-bus driver. - * Written by Arnaud Westenberg email:arnaud@wanadoo.nl - * Added by Pavel Pisa pisa@cmp.felk.cvut.cz - * email:pisa@cmp.felk.cvut.cz - * This software is released under the GPL-License. - * Version lincan-0.3 17 Jun 2004 - * - * Support for PiKRON Ltd ISA CAN card using - * memory mapped SJA1000 controller - */ - -int pikronisa_request_io(struct candevice_t *candev); -int pikronisa_release_io(struct candevice_t *candev); -int pikronisa_reset(struct candevice_t *candev); -int pikronisa_init_hw_data(struct candevice_t *candev); -int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr); -int pikronisa_init_obj_data(struct canchip_t *chip, int objnr); -int pikronisa_program_irq(struct candevice_t *candev); -void pikronisa_write_register(unsigned data, can_ioptr_t address); -unsigned pikronisa_read_register(can_ioptr_t address); - diff --git a/lincan/src/Makefile.omk b/lincan/src/Makefile.omk index 2d80d9a..8d191f5 100644 --- a/lincan/src/Makefile.omk +++ b/lincan/src/Makefile.omk @@ -1,5 +1,5 @@ lincan_cards_NAMES = pip pccan smartcan nsi cc_can104 ems_cpcpci \ - pc_i03 pcm3680 aim104 m437 pcccan ssv bfadcan gensja1000io pikronisa eb8245 \ + pc_i03 pcm3680 aim104 m437 pcccan ssv bfadcan gensja1000io gensja1000mm eb8245 \ kv_pcican msmcan oscar adlink7841 pcan_pci esdpci200 unican virtual template lincan_morecards_NAMES = hms30c7202_can ns_dev_can ipci165 pimx1 tscan1 ts7kv nsi_canpci sh7760 diff --git a/lincan/src/Makefile.std b/lincan/src/Makefile.std index 2087c6c..037766c 100644 --- a/lincan/src/Makefile.std +++ b/lincan/src/Makefile.std @@ -63,13 +63,13 @@ endif SUPPORTED_CARDS = pip pccan smartcan nsi cc_can104 \ pc_i03 pcm3680 aim104 m437 pcccan ssv \ - bfadcan pikronisa kv_pcican msmcan virtual template \ + bfadcan gensja1000mm gensja1000io kv_pcican msmcan virtual template \ unican unican_cl2 ems_cpcpci adlink7841 oscar \ pcan_pci esdpci200 # hms30c7202_can c_can c_can_irq tscan1 # pcan_dongle -#SUPPORTED_CARDS = pcm3680 bfadcan pikronisa template +#SUPPORTED_CARDS = pcm3680 bfadcan template #SUPPORTED_CARDS = virtual diff --git a/lincan/src/boardlist.c b/lincan/src/boardlist.c index d7cf342..608595f 100644 --- a/lincan/src/boardlist.c +++ b/lincan/src/boardlist.c @@ -29,7 +29,7 @@ extern int aim104_register(struct hwspecops_t *hwspecops); extern int pcccan_register(struct hwspecops_t *hwspecops); extern int ssv_register(struct hwspecops_t *hwspecops); extern int bfadcan_register(struct hwspecops_t *hwspecops); -extern int pikronisa_register(struct hwspecops_t *hwspecops); +extern int gensja1000mm_register(struct hwspecops_t *hwspecops); extern int gensja1000io_register(struct hwspecops_t *hwspecops); extern int pimx1_register(struct hwspecops_t *hwspecops); extern int msmcan_register(struct hwspecops_t *hwspecops); @@ -111,8 +111,8 @@ const struct boardtype_t can_boardtypes[]={ #ifdef CONFIG_OC_LINCAN_CARD_bfadcan {"bfadcan", bfadcan_register, 1}, #endif - #ifdef CONFIG_OC_LINCAN_CARD_pikronisa - {"pikronisa", pikronisa_register, 1}, + #ifdef CONFIG_OC_LINCAN_CARD_gensja1000mm + {"gensja1000mm", gensja1000mm_register, 1}, #endif #ifdef CONFIG_OC_LINCAN_CARD_gensja1000io {"gensja1000io", gensja1000io_register, 1}, diff --git a/lincan/src/gensja1000io.c b/lincan/src/gensja1000io.c index 8dcf9fb..6d994ed 100644 --- a/lincan/src/gensja1000io.c +++ b/lincan/src/gensja1000io.c @@ -172,7 +172,7 @@ int gensja1000io_init_chip_data(struct candevice_t *candev, int chipnr) candev->chip[chipnr]->chip_base_addr=can_ioport2ioptr(candev->io_addr); if(candev->chip[chipnr]->clock<=0) - candev->chip[chipnr]->clock = 16000000; + candev->chip[chipnr]->clock = 16000000; candev->chip[chipnr]->int_clk_reg = 0x0; candev->chip[chipnr]->int_bus_reg = 0x0; candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF; diff --git a/lincan/src/pikronisa.c b/lincan/src/gensja1000mm.c similarity index 68% rename from lincan/src/pikronisa.c rename to lincan/src/gensja1000mm.c index 2a4fd22..100a267 100644 --- a/lincan/src/pikronisa.c +++ b/lincan/src/gensja1000mm.c @@ -1,4 +1,4 @@ -/* pikronisa.c +/* gensja1000mm.c * Linux CAN-bus device driver. * Written by Arnaud Westenberg email:arnaud@wanadoo.nl * Rewritten for new CAN queues by Pavel Pisa - OCERA team member @@ -10,7 +10,7 @@ #include "../include/can.h" #include "../include/can_sysdep.h" #include "../include/main.h" -#include "../include/pikronisa.h" +#include "../include/gensja1000mm.h" #include "../include/sja1000p.h" /* @@ -21,24 +21,24 @@ #define IO_RANGE 0x100 /** - * pikronisa_request_io: - reserve io or memory range for can board + * gensja1000mm_request_io: - reserve io or memory range for can board * @candev: pointer to candevice/board which asks for io. Field @io_addr * of @candev is used in most cases to define start of the range * - * The function pikronisa_request_io() is used to reserve the io-memory. If your + * The function gensja1000mm_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. * %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. * Return Value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_request_io(struct candevice_t *candev) +int gensja1000mm_request_io(struct candevice_t *candev) { can_ioptr_t remap_addr; - if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - pikronisa")) { + if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME)) { CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr); return -ENODEV; } @@ -54,18 +54,18 @@ int pikronisa_request_io(struct candevice_t *candev) } /** - * pikronisa_elease_io - free reserved io memory range + * gensja1000mm_elease_io - free reserved io memory range * @candev: pointer to candevice/board which releases io * - * The function pikronisa_release_io() is used to free reserved io-memory. + * The function gensja1000mm_release_io() is used to free reserved io-memory. * In case you have reserved more io memory, don't forget to free it here. * IO_RANGE is the io-memory range that gets released, 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. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_release_io(struct candevice_t *candev) +int gensja1000mm_release_io(struct candevice_t *candev) { /* release I/O memory mapping */ iounmap(candev->dev_base_addr); @@ -75,41 +75,41 @@ int pikronisa_release_io(struct candevice_t *candev) } /** - * pikronisa_reset - hardware reset routine + * gensja1000mm_reset - hardware reset routine * @candev: Pointer to candevice/board structure * - * The function pikronisa_reset() is used to give a hardware reset. This is + * The function gensja1000mm_reset() is used to give a hardware reset. This is * rather hardware specific so I haven't included example code. Don't forget to * check the reset status of the chip before returning. * Return Value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_reset(struct candevice_t *candev) +int gensja1000mm_reset(struct candevice_t *candev) { int i; struct canchip_t *chip=candev->chip[0]; unsigned cdr; - pikronisa_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD); + gensja1000mm_write_register(sjaMOD_RM, chip->chip_base_addr+SJAMOD); udelay(1000); - cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR); - pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); + cdr=gensja1000mm_read_register(chip->chip_base_addr+SJACDR); + gensja1000mm_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); - pikronisa_write_register(0, chip->chip_base_addr+SJAIER); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAIER); i=20; - pikronisa_write_register(0, chip->chip_base_addr+SJAMOD); - while (pikronisa_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){ + gensja1000mm_write_register(0, chip->chip_base_addr+SJAMOD); + while (gensja1000mm_read_register(chip->chip_base_addr+SJAMOD)&sjaMOD_RM){ if(!i--) return -ENODEV; udelay(1000); - pikronisa_write_register(0, chip->chip_base_addr+SJAMOD); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAMOD); } - cdr=pikronisa_read_register(chip->chip_base_addr+SJACDR); - pikronisa_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); + cdr=gensja1000mm_read_register(chip->chip_base_addr+SJACDR); + gensja1000mm_write_register(cdr|sjaCDR_PELICAN, chip->chip_base_addr+SJACDR); - pikronisa_write_register(0, chip->chip_base_addr+SJAIER); + gensja1000mm_write_register(0, chip->chip_base_addr+SJAIER); return 0; } @@ -119,10 +119,10 @@ int pikronisa_reset(struct candevice_t *candev) #define NR_SJA1000 1 /** - * pikronisa_init_hw_data - Initialize hardware cards + * gensja1000mm_init_hw_data - Initialize hardware cards * @candev: Pointer to candevice/board structure * - * The function pikronisa_init_hw_data() is used to initialize the hardware + * The function gensja1000mm_init_hw_data() is used to initialize the hardware * structure containing information about the installed CAN-board. * %RESET_ADDR represents the io-address of the hardware reset register. * %NR_82527 represents the number of intel 82527 chips on the board. @@ -130,9 +130,9 @@ int pikronisa_reset(struct candevice_t *candev) * The flags entry can currently only be %CANDEV_PROGRAMMABLE_IRQ to indicate that * the hardware uses programmable interrupts. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_hw_data(struct candevice_t *candev) +int gensja1000mm_init_hw_data(struct candevice_t *candev) { candev->res_addr=RESET_ADDR; candev->nr_82527_chips=0; @@ -144,11 +144,11 @@ int pikronisa_init_hw_data(struct candevice_t *candev) } /** - * pikronisa_init_chip_data - Initialize chips + * gensja1000mm_init_chip_data - Initialize chips * @candev: Pointer to candevice/board structure * @chipnr: Number of the CAN chip on the hardware card * - * The function pikronisa_init_chip_data() is used to initialize the hardware + * The function gensja1000mm_init_chip_data() is used to initialize the hardware * structure containing information about the CAN chips. * %CHIP_TYPE represents the type of CAN chip. %CHIP_TYPE can be "i82527" or * "sja1000". @@ -173,15 +173,16 @@ int pikronisa_init_hw_data(struct candevice_t *candev) * register. Options defined in the %i82527.h file: * %iCPU_CEN, %iCPU_MUX, %iCPU_SLP, %iCPU_PWD, %iCPU_DMC, %iCPU_DSC, %iCPU_RST. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) +int gensja1000mm_init_chip_data(struct candevice_t *candev, int chipnr) { /*sja1000_fill_chipspecops(candev->chip[chipnr]);*/ sja1000p_fill_chipspecops(candev->chip[chipnr]); candev->chip[chipnr]->chip_base_addr=candev->dev_base_addr; - candev->chip[chipnr]->clock = 24000000; + if(candev->chip[chipnr]->clock<=0) + candev->chip[chipnr]->clock = 16000000; candev->chip[chipnr]->int_clk_reg = 0x0; candev->chip[chipnr]->int_bus_reg = 0x0; candev->chip[chipnr]->sja_cdr_reg = sjaCDR_CBP | sjaCDR_CLK_OFF; @@ -191,11 +192,11 @@ int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) } /** - * pikronisa_init_obj_data - Initialize message buffers + * gensja1000mm_init_obj_data - Initialize message buffers * @chip: Pointer to chip specific structure * @objnr: Number of the message buffer * - * The function pikronisa_init_obj_data() is used to initialize the hardware + * The function gensja1000mm_init_obj_data() is used to initialize the hardware * structure containing information about the different message objects on the * CAN chip. In case of the sja1000 there's only one message object but on the * i82527 chip there are 15. @@ -205,75 +206,75 @@ int pikronisa_init_chip_data(struct candevice_t *candev, int chipnr) * base address. * Unless the hardware uses a segmented memory map, flags can be set zero. * Return Value: The function always returns zero - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_init_obj_data(struct canchip_t *chip, int objnr) +int gensja1000mm_init_obj_data(struct canchip_t *chip, int objnr) { chip->msgobj[objnr]->obj_base_addr=chip->chip_base_addr; return 0; } /** - * pikronisa_program_irq - program interrupts + * gensja1000mm_program_irq - program interrupts * @candev: Pointer to candevice/board structure * - * The function pikronisa_program_irq() is used for hardware that uses + * The function gensja1000mm_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 * there's no example code. * Return value: The function returns zero on success or %-ENODEV on failure - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -int pikronisa_program_irq(struct candevice_t *candev) +int gensja1000mm_program_irq(struct candevice_t *candev) { return 0; } /** - * pikronisa_write_register - Low level write register routine + * gensja1000mm_write_register - Low level write register routine * @data: data to be written * @address: memory address to write to * - * The function pikronisa_write_register() is used to write to hardware registers + * The function gensja1000mm_write_register() is used to write to hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific write process. * Return Value: The function does not return a value - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -void pikronisa_write_register(unsigned data, can_ioptr_t address) +void gensja1000mm_write_register(unsigned data, can_ioptr_t address) { - /*DEBUGMSG("pikronisa_write_register: addr=0x%lx data=0x%x", + /*DEBUGMSG("gensja1000mm_write_register: addr=0x%lx data=0x%x", address,data);*/ can_writeb(data,address); } /** - * pikronisa_read_register - Low level read register routine + * gensja1000mm_read_register - Low level read register routine * @address: memory address to read from * - * The function pikronisa_read_register() is used to read from hardware registers + * The function gensja1000mm_read_register() is used to read from hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific read process. * Return Value: The function returns the value stored in @address - * File: src/pikronisa.c + * File: src/gensja1000mm.c */ -unsigned pikronisa_read_register(can_ioptr_t address) +unsigned gensja1000mm_read_register(can_ioptr_t address) { return can_readb(address); } /* !!! Don't change this function !!! */ -int pikronisa_register(struct hwspecops_t *hwspecops) +int gensja1000mm_register(struct hwspecops_t *hwspecops) { - hwspecops->request_io = pikronisa_request_io; - hwspecops->release_io = pikronisa_release_io; - hwspecops->reset = pikronisa_reset; - hwspecops->init_hw_data = pikronisa_init_hw_data; - hwspecops->init_chip_data = pikronisa_init_chip_data; - hwspecops->init_obj_data = pikronisa_init_obj_data; - hwspecops->write_register = pikronisa_write_register; - hwspecops->read_register = pikronisa_read_register; - hwspecops->program_irq = pikronisa_program_irq; + hwspecops->request_io = gensja1000mm_request_io; + hwspecops->release_io = gensja1000mm_release_io; + hwspecops->reset = gensja1000mm_reset; + hwspecops->init_hw_data = gensja1000mm_init_hw_data; + hwspecops->init_chip_data = gensja1000mm_init_chip_data; + hwspecops->init_obj_data = gensja1000mm_init_obj_data; + hwspecops->write_register = gensja1000mm_write_register; + hwspecops->read_register = gensja1000mm_read_register; + hwspecops->program_irq = gensja1000mm_program_irq; return 0; }