Hi, I want connect a mcp2510/2515 can-controller with my mini2440 board. I am using Pengutronics BSP with version OSELAS.BSP-Pengutronix-Mini2440-2011.11.0/. Is there a patch for this task or some hints? I have read the following web pages yet, but with little success. http://cor-net.org/2009/09/can-interface-for-the-mini2440-dev-board/ http://pastebin.com/D6RFdXd6 Friendly regards, Markus
mini2440: Use Can mcp2510 with Pengutronix BSP
Hello, I've made tests with some kernel patches (see attachement), but I cannot start the interface. # ip link set can0 type can bitrate 250000 # ifconfigi can0 up No such irq type 15 setting trigger mode 15 for irq 61 failed (0xc00131c4) mcp251x spi0.0: failed to acquire irq 61 ifconfig: SIOCSIFFLAGS: Operation not permitted Who has got a good idea? Kernel log: user.info kernel: s3c24xx-nand s3c2440-nand: clock idle support enabled user.debug kernel: s3c2410-spi s3c2410-spi.0: bitbang at c38cb8f0 user.warn kernel: s3c24xx_spi_gpiocfg_bus0_gpe11_12_13: enabled user.debug kernel: s3c2410-spi s3c2410-spi.0: registered master spi0 user.debug kernel: spi spi0.0: pre-scaler=12 (wanted 2000000, got 1947115) user.debug kernel: spi spi0.0: setup mode 0, 8 bits/w, 2000000 Hz max --> 0 user.debug kernel: s3c2410-spi s3c2410-spi.0: registered child spi0.0 user.info kernel: CAN device driver interface user.err kernel: MINI2440: Loading MCP251x setup user.debug kernel: mcp251x spi0.0: setup mode 0, 8 bits/w, 2000000 Hz max --> 0 user.debug kernel: mcp251x spi0.0: CANSTAT 0x80 CANCTRL 0x07 user.info kernel: mcp251x spi0.0: probed ... user.info kernel: can: controller area network core (rev 20090105 abi 8) user.info kernel: NET: Registered protocol family 29 user.info kernel: can: raw protocol (rev 20090105) root@mithralog01:~ cat /sys/kernel/debug/gpio GPIOs 0-23, GPIOA: GPIOs 32-47, GPIOB: gpio-34 (s3c24xx_uda134x ) out lo gpio-35 (s3c24xx_uda134x ) out hi gpio-36 (s3c24xx_uda134x ) out hi gpio-37 (led1 ) out hi gpio-38 (led2 ) out hi gpio-39 (led3 ) out hi gpio-40 (led4 ) out hi GPIOs 64-79, GPIOC: gpio-69 (udc pullup ) out lo GPIOs 96-111, GPIOD: GPIOs 128-143, GPIOE: gpio-133 (s3c2440-sdi ) out hi gpio-134 (s3c2440-sdi ) in hi gpio-135 (s3c2440-sdi ) in hi gpio-136 (s3c2440-sdi ) in hi gpio-137 (s3c2440-sdi ) in hi gpio-138 (s3c2440-sdi ) in hi GPIOs 160-167, GPIOF: GPIOs 192-207, GPIOG: gpio-192 (Button 1 ) in hi gpio-194 (s3c2410-spi.0 ) out hi gpio-195 (Button 2 ) in hi gpio-196 (backlight ) out lo gpio-197 (Button 3 ) in hi gpio-198 (Power ) in hi gpio-199 (Button 5 ) in hi gpio-200 (s3cmci detect ) in lo gpio-203 (Button 6 ) in hi GPIOs 224-234, GPIOH: gpio-232 (s3cmci wp ) in lo GPIOs 256-271, GPIOJ: cat /proc/interrupts CPU0 24: 0 s3c s3c2410-rtc tick 30: 1313282 s3c S3C2410 Timer Tick 32: 0 s3c s3c2410-lcd 37: 2268 s3c s3c-mci 38: 14 s3c s3c2410-spi 41: 1 s3c s3c2410_udc 42: 0 s3c ohci_hcd:usb1 43: 0 s3c s3c2440-i2c 46: 0 s3c s3c2410-rtc alarm 51: 60 s3c-ext eth0 52: 0 s3c-ext Button 1 55: 0 s3c-ext Button 2 57: 0 s3c-ext Button 3 58: 0 s3c-ext Power 59: 0 s3c-ext Button 5 60: 1 s3c-ext s3c-mci 63: 0 s3c-ext Button 6 70: 151 s3c-uart0 s3c2440-uart 71: 802 s3c-uart0 s3c2440-uart 79: 0 s3c-adc s3c2410_ts_pen 80: 0 s3c-adc s3c24xx-adc 83: 0 - s3c2410-wdt Err: 0
"No such irq type 15" After a look into the mcp251x.c driver code, this driver requests the IRQ with the option IRQF_TRIGGER_FALLING if you do not specify the correct IRQ level/edge in the ".irq_flags" member. Seems the Samsung world does not know "IRQF_TRIGGER_FALLING". Search for a corresponding "IRQ_TYPE_EDGE_*" symbol.
Hello Juergen, thank you for your reply! It seems that the platform-struct "mcp251x_info" is not correctly transmitted to the mcp251x-driver. Jan 23 08:17:44 mithralog01 user.debug kernel: mcp251x spi0.0: mcp251x_open: irq_flags: -1887347719 oscillator_frequency: -1096950842 I made following changes: in mcp251x.c --------------------- static int mcp251x_open(struct net_device *net) { struct mcp251x_priv *priv = netdev_priv(net); struct spi_device *spi = priv->spi; struct mcp251x_platform_data *pdata = spi->dev.platform_data; int ret; dev_dbg(&spi->dev, "%s: irq_flags: %d oscillator_frequency: %d\n", __FUNCTION__, pdata->irq_flags, pdata->oscillator_frequency); in mach-mini2440.c ----------------------- static struct mcp251x_platform_data mcp251x_info __initdata = { .oscillator_frequency = 16000000, .board_specific_setup = &mcp251x_setup, .irq_flags = 2,//IRQF_TRIGGER_FALLING, .power_enable = NULL, .transceiver_enable = NULL, }; After ifconfig can0 up I got a kernel oops: Unable to handle kernel paging request at virtual address bd345674 pgd = c3b58000 [bd345674] *pgd=00000000 Internal error: Oops: 80000005 [#1] PREEMPT Modules linked in: s3c2410_udc CPU: 0 Not tainted (3.1.1-ptx-2011.11.0 #49) pc : [<bd345674>] lr : [<c022e3a4>] psr: a0000013 sp : c3b6be98 ip : 60000013 fp : c3b6bf10 r10: 00000000 r9 : c38b2bf0 r8 : c383ef00 r7 : c03f74b8 r6 : c38b2b60 r5 : c383ee00 r4 : c38b2800 r3 : bd345674 r2 : 00000000 r1 : 00000000 r0 : 00000001 Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user Control: c000717f Table: 33b58000 DAC: 00000015 Process ifconfig (pid: 613, stack limit = 0xc3b6a270) Stack: (0xc3b6be98 to 0xc3b6c000) be80: 8f815bf9 be9ddbc6 bea0: c38b2800 c0358ad4 00040080 00000001 c383ef00 00000000 c383ef0c c02bf2e0 bec0: c02bf238 c38b2800 000000c1 c02bf508 00008914 c38b2800 00040080 00000001 bee0: c38b2800 c02bf5fc 00008914 00000000 00000001 c0301d0c beb5eac8 00000001 bf00: 306e6163 00000000 00000000 00000000 000000c1 00000001 0006a9ee 400a204c bf20: 000000c1 00000001 0006a9ee 400a204c 306e6163 00008914 beb5eac8 00008914 bf40: 00000003 c00091a8 c3b6a000 00000000 00000000 c02acc1c beb5eac8 00000003 bf60: 00008914 c0096b6c 00000000 00000002 00070f5f 00070f5f beb5eac8 c3ad6f00 bf80: beb5eac8 c0096bd4 00000003 00000000 beb5eac8 00070f5f 00000004 beb5eac8 bfa0: 00000036 c0009000 00070f5f 00000004 00000003 00008914 beb5eac8 00070f5f bfc0: 00070f5f 00000004 beb5eac8 00000036 0006b208 00000000 400b3000 00000000 bfe0: beb5edd7 beb5eaa0 0000df20 401c686c 20000010 00000003 00000000 00000000 Function entered at [<c022e3a4>] from [<c02bf2e0>] Function entered at [<c02bf2e0>] from [<c02bf508>] Function entered at [<c02bf508>] from [<c02bf5fc>] Function entered at [<c02bf5fc>] from [<c0301d0c>] Function entered at [<c0301d0c>] from [<c02acc1c>] Function entered at [<c02acc1c>] from [<c0096b6c>] Function entered at [<c0096b6c>] from [<c0096bd4>] Function entered at [<c0096bd4>] from [<c0009000>] Code: bad PC value ---[ end trace c67783fbbfd88146 ]--- Jan 23 08:17:44 mithralog01 user.debug kernel: mcp251x spi0.0: mcp251x_open: irq_flags: -1887347719 oscillator_frequency: -1096950842 Jan 23 08:17:44 mithralog01 user.alert kernel: Unable to handle kernel paging request at virtual address bd345674 Jan 23 08:17:44 mithralog01 user.alert kernel: pgd = c3b58000 Jan 23 08:17:44 mithralog01 user.alert kernel: [bd345674] *pgd=00000000 Jan 23 08:17:44 mithralog01 user.emerg kernel: Internal error: Oops: 80000005 [#1] PREEMPT Jan 23 08:17:44 mithralog01 user.warn kernel: Modules linked in: s3c2410_udc Jan 23 08:17:44 mithralog01 user.warn kernel: CPU: 0 Not tainted (3.1.1-ptx-2011.11.0 #49) Jan 23 08:17:44 mithralog01 user.warn kernel: pc : [<bd345674>] lr : [<c022e3a4>] psr: a0000013 Jan 23 08:17:44 mithralog01 user.warn kernel: sp : c3b6be98 ip : 60000013 fp : c3b6bf10 Jan 23 08:17:44 mithralog01 user.warn kernel: r10: 00000000 r9 : c38b2bf0 r8 : c383ef00 Jan 23 08:17:44 mithralog01 user.warn kernel: r7 : c03f74b8 r6 : c38b2b60 r5 : c383ee00 r4 : c38b2800 Jan 23 08:17:44 mithralog01 user.warn kernel: r3 : bd345674 r2 : 00000000 r1 : 00000000 r0 : 00000001 Jan 23 08:17:44 mithralog01 user.warn kernel: Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user Jan 23 08:17:44 mithralog01 user.warn kernel: Control: c000717f Table: 33b58000 DAC: 00000015 Jan 23 08:17:44 mithralog01 user.emerg kernel: Process ifconfig (pid: 613, stack limit = 0xc3b6a270) Jan 23 08:17:44 mithralog01 user.emerg kernel: Stack: (0xc3b6be98 to 0xc3b6c000) Jan 23 08:17:44 mithralog01 user.emerg kernel: be80: 8f815bf9 be9ddbc6 Jan 23 08:17:44 mithralog01 user.emerg kernel: bea0: c38b2800 c0358ad4 00040080 00000001 c383ef00 00000000 c383ef0c c02bf2e0 Jan 23 08:17:44 mithralog01 user.emerg kernel: bec0: c02bf238 c38b2800 000000c1 c02bf508 00008914 c38b2800 00040080 00000001 Jan 23 08:17:44 mithralog01 user.emerg kernel: bee0: c38b2800 c02bf5fc 00008914 00000000 00000001 c0301d0c beb5eac8 00000001 Jan 23 08:17:44 mithralog01 user.emerg kernel: bf00: 306e6163 00000000 00000000 00000000 000000c1 00000001 0006a9ee 400a204c Jan 23 08:17:44 mithralog01 user.emerg kernel: bf20: 000000c1 00000001 0006a9ee 400a204c 306e6163 00008914 beb5eac8 00008914 Jan 23 08:17:44 mithralog01 user.emerg kernel: bf40: 00000003 c00091a8 c3b6a000 00000000 00000000 c02acc1c beb5eac8 00000003 Jan 23 08:17:44 mithralog01 user.emerg kernel: bf60: 00008914 c0096b6c 00000000 00000002 00070f5f 00070f5f beb5eac8 c3ad6f00 Jan 23 08:17:44 mithralog01 user.emerg kernel: bf80: beb5eac8 c0096bd4 00000003 00000000 beb5eac8 00070f5f 00000004 beb5eac8 Jan 23 08:17:44 mithralog01 user.emerg kernel: bfa0: 00000036 c0009000 00070f5f 00000004 00000003 00008914 beb5eac8 00070f5f Jan 23 08:17:44 mithralog01 user.emerg kernel: bfc0: 00070f5f 00000004 beb5eac8 00000036 0006b208 00000000 400b3000 00000000 Jan 23 08:17:44 mithralog01 user.emerg kernel: bfe0: beb5edd7 beb5eaa0 0000df20 401c686c 20000010 00000003 00000000 00000000 Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c022e3a4>] from [<c02bf2e0>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c02bf2e0>] from [<c02bf508>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c02bf508>] from [<c02bf5fc>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c02bf5fc>] from [<c0301d0c>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c0301d0c>] from [<c02acc1c>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c02acc1c>] from [<c0096b6c>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c0096b6c>] from [<c0096bd4>] Jan 23 08:17:44 mithralog01 user.warn kernel: Function entered at [<c0096bd4>] from [<c0009000>] Jan 23 08:17:44 mithralog01 user.emerg kernel: Code: bad PC value Jan 23 08:17:44 mithralog01 user.warn kernel: ---[ end trace c67783fbbfd88146 ]---
Try the same with the 2012.12.0 release of my BSP and its Linux-3.7 kernel. If you face the same error, you should send a message to the maintainer of this driver how to fix it in mainline.
Hi Juergen, I added some code to the mcp251x-driver to check if the problem is caused by the wrong platform_data. Now I can do a "ifconfig can0 up" and send and receive via cansend/candump with a baudrate up to 1Mbit. "ifconfig can0 down" causes a segmentation fault and I have to restart the system. So I will change to BSP 2012.12.0. Best regards, Markus static void mcp251x_open_clean(struct net_device *net) { struct mcp251x_priv *priv = netdev_priv(net); struct spi_device *spi = priv->spi; struct mcp251x_platform_data *pdata = spi->dev.platform_data; + //TEST + struct mcp251x_platform_data pdataTmp; + memset(&pdataTmp, 0, sizeof(pdataTmp)); + pdataTmp.oscillator_frequency = 16000000; + pdataTmp.irq_flags = IRQF_TRIGGER_FALLING; + pdata = &pdataTmp; + //TEST free_irq(spi->irq, priv); static int mcp251x_open(struct net_device *net) { struct mcp251x_priv *priv = netdev_priv(net); struct spi_device *spi = priv->spi; struct mcp251x_platform_data *pdata = spi->dev.platform_data; int ret; + //TEST + struct mcp251x_platform_data pdataTmp; + memset(&pdataTmp, 0, sizeof(pdataTmp)); + pdataTmp.oscillator_frequency = 16000000; + pdataTmp.irq_flags = IRQF_TRIGGER_FALLING; + pdata = &pdataTmp; + //TEST
I tried the same with the 2012.12.0 release of my BSP and its Linux-3.7 kernel and the problem remains. The platform_struct is not transmitted correctly to the driver's open function. If I define a local platform_data struct inside the open function, the driver works as ecpected, but this is not the right way. I have sent a mail to the maintainer and hope that he has got a solution. Best regards, Markus
Keep an eye on the "__initdata" attribute. Some register functions will copy the structur's content, some other not. Remove it as a test case.
Thank you Juergen, that was the right hint! +static struct mcp251x_platform_data mcp251x_info = { + .oscillator_frequency = 16000000, + .board_specific_setup = &mcp251x_setup, + .irq_flags = IRQF_TRIGGER_FALLING|IRQF_ONESHOT, + .power_enable = NULL, + .transceiver_enable = NULL, +}; Now the can driver works without bad workarounds. I have made a patch for 2012.12.0 release of the BSP and Linux-3.7. If somebody uses the mcp2515-Chip, he has to change the modalias in the spi_board_info struct: static struct spi_board_info mini2440_spi_devs[] __initdata = { { .modalias = "mcp2510", .platform_data = &mcp251x_info, .irq = IRQ_EINT17, // GPG9 (Interrupt 61) .chip_select = 0, .max_speed_hz = 2*1000*1000, .bus_num = 0, .mode = SPI_MODE_0, }, }; Best regards, Markus