X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/e76c475d24baf228af7d068c03c0f4634d45db3e..HEAD:/lincan/src/ns_dev_can.c diff --git a/lincan/src/ns_dev_can.c b/lincan/src/ns_dev_can.c index 0fc15c0..5c69a1e 100644 --- a/lincan/src/ns_dev_can.c +++ b/lincan/src/ns_dev_can.c @@ -1,16 +1,40 @@ -/* ns_dev_can.c - FPGA version of C_CAN ARM device specific code - * Linux CAN-bus device driver. - * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de - * Based on code from Arnaud Westenberg email:arnaud@wanadoo.nl - * and Ake Hedman, eurosource, akhe@eurosource.se - * Rewritten for new CAN queues by Pavel Pisa - OCERA team member - * Ported to FS Forth-Systeme GmbH A9M9750DEVx development boards - * email:nbryan@embebidos.com - * This software is released under the GPL-License. - * Version lincan-0.3 17 Jun 2004 - * This port 19 May 2005 - * - */ +/**************************************************************************/ +/* File: ns_dev_can.c - FPGA version of C_CAN ARM device specific */ +/* Ported to FS Forth-Systeme GmbH A9M9750DEVx development boardscode */ +/* */ +/* LinCAN - (Not only) Linux CAN bus driver */ +/* Copyright (C) 2002-2009 DCE FEE CTU Prague */ +/* Copyright (C) 2002-2009 Pavel Pisa */ +/* Copyright (C) 2004 Sebastian Stolzenberg */ +/* Copyright (C) 2005 Neil Bryan */ +/* Funded by OCERA and FRESCOR IST projects */ +/* Based on CAN driver code by Arnaud Westenberg */ +/* and Ake Hedman, eurosource */ +/* */ +/* LinCAN is free software; you can redistribute it and/or modify it */ +/* under terms of the GNU General Public License as published by the */ +/* Free Software Foundation; either version 2, or (at your option) any */ +/* later version. LinCAN is distributed in the hope that it will be */ +/* useful, but WITHOUT ANY WARRANTY; without even the implied warranty */ +/* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU */ +/* General Public License for more details. You should have received a */ +/* copy of the GNU General Public License along with LinCAN; see file */ +/* COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, */ +/* Cambridge, MA 02139, USA. */ +/* */ +/* To allow use of LinCAN in the compact embedded systems firmware */ +/* and RT-executives (RTEMS for example), main authors agree with next */ +/* special exception: */ +/* */ +/* Including LinCAN header files in a file, instantiating LinCAN generics */ +/* or templates, or linking other files with LinCAN objects to produce */ +/* an application image/executable, does not by itself cause the */ +/* resulting application image/executable to be covered by */ +/* the GNU General Public License. */ +/* This exception does not however invalidate any other reasons */ +/* why the executable file might be covered by the GNU Public License. */ +/* Publication of enhanced or derived LinCAN files is required although. */ +/**************************************************************************/ #include @@ -33,7 +57,7 @@ */ int ns_dev_request_io(struct candevice_t *candev) { - /* Note hard-coded index for the chip number as this + /* Note hard-coded index for the chip number as this * only supports a single instance of the C_CAN controller. */ DEBUGMSG("(c%d)ns_dev_request_io (...)\n", candev->chip[0]->chip_idx); @@ -43,7 +67,7 @@ int ns_dev_request_io(struct candevice_t *candev) (unsigned long)candev->io_addr); } - if (!(candev->dev_base_addr = (long)ioremap(candev->io_addr, IO_RANGE))) { + 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, @@ -76,13 +100,10 @@ int ns_dev_request_io(struct candevice_t *candev) */ int ns_dev_release_io(struct candevice_t *candev) { - u16 tempReg; - int i; - DEBUGMSG("(c%d)ns_dev_release_io (...)\n", candev->chip[0]->chip_idx); /* Release I/O memory mapping */ - iounmap((void *)candev->dev_base_addr); + iounmap(candev->dev_base_addr); /* Release the memory region */ can_release_mem_region(candev->io_addr, IO_RANGE); @@ -148,21 +169,21 @@ int ns_dev_reset(struct candevice_t *candev) */ int ns_dev_init_hw_data(struct candevice_t *candev) { - u32 sys_contVA = 0; + can_ioptr_t sys_contVA = NULL; /* LUCAN : Magic numbers */ - if (!(sys_contVA = (u32) ioremap(NS9750_PERIPHERAL_BASE_ADDRESS, + if (!(sys_contVA = ioremap(NS9750_PERIPHERAL_BASE_ADDRESS, NS9750_PERIPHERAL_MAP_SIZE))) { DEBUGMSG("Failed to map FPGA memory\n"); return -EIO; } else { DEBUGMSG("Writing to NS9750 sys cont\n"); - writel((BUS_WIDTH_16BIT | ACTIVE_LOW_CHIP_SELECT), + can_writel((BUS_WIDTH_16BIT | ACTIVE_LOW_CHIP_SELECT), sys_contVA + NS9750_SYSTEM_CONTROLLER_OFFSET); } /* We have finished with this mapping */ - iounmap((void *)sys_contVA); + iounmap(sys_contVA); candev->nr_82527_chips = 0; candev->nr_sja1000_chips = 0; @@ -206,9 +227,9 @@ int ns_dev_init_chip_data(struct candevice_t *candev, int chipnr) * * The function ns_dev_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 @@ -236,12 +257,12 @@ int ns_dev_init_obj_data(struct canchip_t *chip, int objnr) * Return Value: The function does not return a value * File: src/template.c */ -void ns_dev_write_register(unsigned data, unsigned long address) +void ns_dev_write_register(unsigned data, can_ioptr_t address) { int i; //unsigned long usecs = 1; - writew(data, address); + can_writew(data, address); //udelay( usecs ); for (i = 0; i < 5; i++) ; } @@ -256,14 +277,14 @@ void ns_dev_write_register(unsigned data, unsigned long address) * Return Value: The function returns the value stored in @address * File: src/template.c */ -unsigned ns_dev_read_register(unsigned long address) +unsigned ns_dev_read_register(can_ioptr_t address) { u16 value, i; - value = readw(address); + value = can_readw(address); //udelay( usecs ); for (i = 0; i < 5; i++) ; - value = readw(address); + value = can_readw(address); //udelay( usecs ); for (i = 0; i < 5; i++) ; @@ -274,10 +295,10 @@ unsigned ns_dev_read_register(unsigned long address) * ns_dev_program_irq - program interrupts * @candev: Pointer to candevice/board structure * - * The function ns_dev_program_irq() is used for hardware that uses + * The function ns_dev_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