准備工具:
1、內核3.14.65,u-boot、文件系統
2、boneblack開發板
3、串口線、電源線,測試線,測試夾
一、配置內核支持CAN通訊
[*] Networking support ->
<*|M> CAN bus subsystem support ->
<*|M> Raw CAN Protocol (raw access with CAN-ID filtering)
<*|M> Broadcast Manager CAN Protocol (with content filtering)
<*|M> CAN Gateway/Router (with netlink configuration)
CAN Device Drivers ->
<*|M> Platform CAN drivers with Netlink support
[*] CAN bit-timing calculation
<*|M> Bosch C_CAN/D_CAN devices ->
<M> Generic Platform Bus based C_CAN/D_CAN driver
can通訊的內核配置我選擇的是直接加載,並不是以模塊化的方式將can模塊加載進內核的。
配置完之后編譯內核。
二 配置內核的設備樹文件,使其支持CAN0,也可以根據自己的硬件選擇不同的引腳配置。
在am335x-bone-common.dtsi的文件下的am33xx_pinmux節點下添加can0的引腳配置
dcan0_pins_default: dcan0_pins_default { pinctrl-single,pins = < 0x178 (PIN_OUTPUT | MUX_MODE2) /* uart1_ctsn.d_can0_tx */ 0x17c (PIN_INPUT_PULLDOWN | MUX_MODE2) /* uart1_rtsn.d_can0_rx */ >;
我選擇Boneblack上的uart1_ctsn作為can0的發送引腳,uart1_rtsn作為can0的接收引腳
然后在am335x-bone-common.dtsi文件的最下面添加can0的節點
&dcan0 { status = "okay"; /* 這里要為okay,如果是disable的話當系統啟動起來之后利用命令ifconfig -a或ipaddr會看不到can0的 */ pinctrl-names = "default"; pinctrl-0 = <&dcan0_pins_default>; };
修改之后保存,然后編譯設備樹。
三、將生成的內核,和設備樹下載到Boneblack開發板中,如何下載前面有介紹。
啟動開發板,啟動log如下:
U-Boot SPL 2016.03 (Oct 19 2017 - 13:39:57) preloader_console_init() >>spl:SDRAM_init() >>spl:board_init_r() MAIN_OSC: 24Mhz DPLL_Mpu_Freq: 300MHz DPLL_Core_Freq: 100MHz DPLL_Per_Freq_usb_phy_clk: 960MHz DPLL_Per_Freq_PRU_ICSS_Uart_moduclk: 192MHz DPLL_Per_Freq_MMC_moduclk: 96MHz DPLL_Per_Freq_SPI_moduclk: 48MHz DPLL_Per_Freq_UART_moduclk: 48MHz DPLL_Per_Freq_I2C_moduclk: 48MHz This is sure,only I think /arch/arm/cpu/armv7/omap-common/save_omap_boot_params /arch/arm/cpu/armv7/omap-common/gpmc_init /arch/arm/cpu/armv7/omap-common/i2c_init /arch/arm/cpu/armv7/omap-common/arch_misc_init() /arch/arm/cpu/armv7/omap-common/hw_watchdog_init() /arch/arm/cpu/armv7/omap-common/am33xx_spl_board_init() Trying to boot from MMC MMC->xxxx/drivers/mmc/mmc.c2 reading args spl_load_image_fat_os: error reading image args, err - -1 reading u-boot.img reading u-boot.img U-Boot 2016.03 (Oct 19 2017 - 13:39:57 +0800) U-Boot code: 80800000 -> 808DA324 BSS_END: -> 80926BBC Watchdog enabled I2C: ready DRAM: 512 MiB NAND: 0 MiB nand_init->xxxx/drivers/mtd/nand/nand.c MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1 MMC->xxxx/drivers/mmc/mmc.c1 MMC->xxxx/drivers/mmc/mmc.c2 xxxx/common/env_common.c *** Error - No Valid Environment Area found *** Warning - bad CRC, using default environment xxxx/common/env_common.c Net: xxx/board/ti/am335x/board_eth_init--->,6be7 xxx/board/ti/am335x/board_eth_init--->,5fab5ef4 <ethaddr> not set. Validating first E-fuse MAC Here at xxx/drivers/net/cpsw.c phy_reg---> 3000 phy_reg---> 7809 phy_reg---> 7 phy_reg---> c0f1 phy_reg---> 1e1 phy_reg---> 1 phy_reg---> 0 phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> ffff phy_reg---> 0 phy_reg---> 40 phy_reg---> 2 phy_reg---> e0 phy_reg---> ffff phy_reg---> 0 phy_reg---> 0 phy_reg---> 0 phy_reg---> 0 phy_reg---> ffff phy_reg---> ffff phy_reg---> 0 phy_reg---> 0 phy_reg---> 0 phy_reg---> 90 phy_reg---> 0 phy_reg---> 40 End xxx/Board/Ti/Am335x/Board.c:---->Ethernet_init maria: ----> 40070106 maria: ----> 410000ff maria: ----> 1 maria: ----> 0 maria: ----> 0 maria: ----> 0 maria: ----> 1 maria: ----> 0 maria: ----> 0 maria: ----> 0 maria: ----> 23e00040 maria: ----> 0 maria: ----> 0 maria: ----> 0 xxx/Board/Ti/Am335x/Board.c:---->Ethernet_init cpsw, usb_ether NET: -> xxxx/net/eth_legacy.c Press SPACE to abort autoboot in 5 seconds ## Error: "envboot" not defined lcd reset Card did not respond to voltage select! Card did not respond to voltage select! Card did not respond to voltage select! switch to partitions #0, OK mmc1(part 0) is current device Scanning mmc 1:1... switch to partitions #0, OK mmc1(part 0) is current device SD/MMC found on device 1 reading boot.scr ** Unable to read file boot.scr ** reading uEnv.txt 194 bytes read in 3 ms (62.5 KiB/s) Loaded environment from uEnv.txt Importing environment from mmc ... Running uenvcmd ... reading uImage 4447520 bytes read in 256 ms (16.6 MiB/s) reading am335x-boneblack.dtb 29320 bytes read in 8 ms (3.5 MiB/s) ## Booting kernel from Legacy Image at 82000000 ... Image Name: Linux-3.14.65 Created: 2018-03-07 10:00:42 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 4447456 Bytes = 4.2 MiB Load Address: 80008000 Entry Point: 80008000 Verifying Checksum ... OK ## Flattened Device Tree blob at 83000000 Booting using the fdt blob at 0x83000000 Loading Kernel Image ... OK Loading Device Tree to 8fff5000, end 8ffff287 ... OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.14.65 (zyr@ubuntu) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #15 SMP Wed Mar 7 17:59:54 CST 2018 [ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine model: TI AM335x BeagleBone [ 0.000000] cma: CMA: reserved 16 MiB at 9e800000 [ 0.000000] Memory policy: Data cache writeback [ 0.000000] CPU: All CPU(s) started in SVC mode. [ 0.000000] AM335X ES2.1 (sgx neon ) [ 0.000000] PERCPU: Embedded 9 pages/cpu @dfad5000 s13184 r8192 d15488 u36864 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 129792 [ 0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/mmcblk0p2 rootwait [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) [ 0.000000] Memory: 487504K/523264K available (5840K kernel code, 665K rwdata, 2252K rodata, 376K init, 5528K bss, 35760K reserved, 0K highmem) [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xe0800000 - 0xff000000 ( 488 MB) [ 0.000000] lowmem : 0xc0000000 - 0xe0000000 ( 512 MB) [ 0.000000] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) [ 0.000000] modules : 0xbf000000 - 0xbfe00000 ( 14 MB) [ 0.000000] .text : 0xc0008000 - 0xc07ef538 (8094 kB) [ 0.000000] .init : 0xc07f0000 - 0xc084e380 ( 377 kB) [ 0.000000] .data : 0xc0850000 - 0xc08f66f0 ( 666 kB) [ 0.000000] .bss : 0xc08f66f0 - 0xc0e5c760 (5529 kB) [ 0.000000] Hierarchical RCU implementation. [ 0.000000] RCU restricting CPUs from NR_CPUS=2 to nr_cpu_ids=1. [ 0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1 [ 0.000000] NR_IRQS:16 nr_irqs:16 16 [ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts [ 0.000000] Total of 128 interrupts on 1 active controller [ 0.000000] OMAP clockevent source: timer2 at 24000000 Hz [ 0.000011] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956969942ns [ 0.000054] OMAP clocksource: timer1 at 24000000 Hz [ 0.000817] Console: colour dummy device 80x30 [ 0.000870] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar [ 0.000879] ... MAX_LOCKDEP_SUBCLASSES: 8 [ 0.000887] ... MAX_LOCK_DEPTH: 48 [ 0.000894] ... MAX_LOCKDEP_KEYS: 8191 [ 0.000901] ... CLASSHASH_SIZE: 4096 [ 0.000908] ... MAX_LOCKDEP_ENTRIES: 16384 [ 0.000915] ... MAX_LOCKDEP_CHAINS: 32768 [ 0.000922] ... CHAINHASH_SIZE: 16384 [ 0.000929] memory used by lock dependency info: 3695 kB [ 0.000937] per task-struct memory footprint: 1152 bytes [ 0.000981] Calibrating delay loop... 996.14 BogoMIPS (lpj=4980736) [ 0.079212] pid_max: default: 32768 minimum: 301 [ 0.079561] Security Framework initialized [ 0.079673] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.079686] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes) [ 0.097314] CPU: Testing write buffer coherency: ok [ 0.098550] CPU0: thread -1, cpu 0, socket -1, mpidr 0 [ 0.098618] Setting up static identity map for 0x80589728 - 0x80589798 [ 0.101696] Brought up 1 CPUs [ 0.101716] SMP: Total of 1 processors activated (996.14 BogoMIPS). [ 0.101725] CPU: All CPU(s) started in SVC mode. [ 0.104396] devtmpfs: initialized [ 0.114023] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3 [ 0.147246] omap_hwmod: tptc0 using broken dt data from edma [ 0.147599] omap_hwmod: tptc1 using broken dt data from edma [ 0.147940] omap_hwmod: tptc2 using broken dt data from edma [ 0.155419] omap_hwmod: debugss: _wait_target_disable failed [ 0.214523] pinctrl core: initialized pinctrl subsystem [ 0.218479] regulator-dummy: no parameters [ 0.221997] NET: Registered protocol family 16 [ 0.227066] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.244733] platform 49000000.edma: alias fck already exists [ 0.244771] platform 49000000.edma: alias fck already exists [ 0.244791] platform 49000000.edma: alias fck already exists [ 0.248902] OMAP GPIO hardware version 0.1 [ 0.263090] platform 481cc000.d_can: alias fck already exists [ 0.276209] No ATAGs? [ 0.276233] hw-breakpoint: debug architecture 0x4 unsupported. [ 0.337682] bio: create slab <bio-0> at 0 [ 0.376739] edma-dma-engine edma-dma-engine.0: TI EDMA DMA engine driver [ 0.378748] vmmcsd_fixed: 3300 mV [ 0.386634] SCSI subsystem initialized [ 0.388876] usbcore: registered new interface driver usbfs [ 0.389483] usbcore: registered new interface driver hub [ 0.390255] usbcore: registered new device driver usb [ 0.393015] omap_i2c 44e0b000.i2c: could not find pctldev for node /pinmux@44e10800/pinmux_i2c0_pins, deferring probe [ 0.393061] platform 44e0b000.i2c: Driver omap_i2c requests probe deferral [ 0.400884] Switched to clocksource timer1 [ 0.554499] NET: Registered protocol family 2 [ 0.556485] TCP established hash table entries: 4096 (order: 2, 16384 bytes) [ 0.556668] TCP bind hash table entries: 4096 (order: 5, 147456 bytes) [ 0.558032] TCP: Hash tables configured (established 4096 bind 4096) [ 0.558191] TCP: reno registered [ 0.558216] UDP hash table entries: 256 (order: 2, 20480 bytes) [ 0.558408] UDP-Lite hash table entries: 256 (order: 2, 20480 bytes) [ 0.559365] NET: Registered protocol family 1 [ 0.560715] RPC: Registered named UNIX socket transport module. [ 0.561225] RPC: Registered udp transport module. [ 0.561239] RPC: Registered tcp transport module. [ 0.561249] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 0.562421] hw perfevents: enabled with ARMv7 Cortex-A8 PMU driver, 5 counters available [ 0.569877] futex hash table entries: 256 (order: 2, 16384 bytes) [ 0.718162] VFS: Disk quotas dquot_6.5.2 [ 0.718360] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes) [ 0.720305] NFS: Registering the id_resolver key type [ 0.720663] Key type id_resolver registered [ 0.720682] Key type id_legacy registered [ 0.721147] jffs2: version 2.2. (NAND) (SUMMARY) © 2001-2006 Red Hat, Inc. [ 0.721595] msgmni has been set to 984 [ 0.724558] io scheduler noop registered [ 0.724580] io scheduler deadline registered [ 0.724637] io scheduler cfq registered (default) [ 0.727518] pinctrl-single 44e10800.pinmux: 142 pins at pa f9e10800 size 568 [ 0.734508] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled [ 0.742089] omap_uart 44e09000.serial: no wakeirq for uart0 [ 0.743346] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 88, base_baud = 3000000) is a OMAP UART0 [ 1.406745] console [ttyO0] enabled [ 1.415576] omap_rng 48310000.rng: OMAP Random Number Generator ver. 20 [ 1.424997] [drm] Initialized drm 1.1.0 20060810 [ 1.459283] brd: module loaded [ 1.480634] loop: module loaded [ 1.490200] mtdoops: mtd device (mtddev=name/number) must be supplied [ 1.502074] vcan: Virtual CAN interface driver [ 1.506739] CAN device driver interface [ 1.514879] c_can_platform 481cc000.d_can: c_can_platform device registered (regs=fa1cc000, irq=68) [ 1.528370] usbcore: registered new interface driver asix [ 1.534839] usbcore: registered new interface driver ax88179_178a [ 1.541734] usbcore: registered new interface driver cdc_ether [ 1.548248] usbcore: registered new interface driver smsc95xx [ 1.554951] usbcore: registered new interface driver net1080 [ 1.561350] usbcore: registered new interface driver cdc_subset [ 1.567904] usbcore: registered new interface driver zaurus [ 1.574429] usbcore: registered new interface driver cdc_ncm [ 1.582422] usbcore: registered new interface driver cdc_wdm [ 1.588799] usbcore: registered new interface driver usb-storage [ 1.595802] usbcore: registered new interface driver usbtest [ 1.605474] mousedev: PS/2 mouse device common for all mice [ 1.616897] omap_rtc 44e3e000.rtc: rtc core: registered 44e3e000.rtc as rtc0 [ 1.625795] i2c /dev entries driver [ 1.629823] Driver for 1-wire Dallas network protocol. [ 1.640500] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec [ 1.652349] 48060000.mmc supply vmmc_aux not found, using dummy regulator [ 1.701827] 481d8000.mmc supply vmmc_aux not found, using dummy regulator [ 1.763545] usbcore: registered new interface driver usbhid [ 1.769376] usbhid: USB HID core driver [ 1.778960] oprofile: using arm/armv7 [ 1.783604] TCP: cubic registered [ 1.787077] Initializing XFRM netlink socket [ 1.791757] NET: Registered protocol family 17 [ 1.796480] NET: Registered protocol family 15 [ 1.801326] can: controller area network core (rev 20120528 abi 9) [ 1.807934] NET: Registered protocol family 29 [ 1.812825] can: raw protocol (rev 20120528) [ 1.817364] can: broadcast manager protocol (rev 20120528 t) [ 1.823345] can: netlink gateway (rev 20130117) max_hops=1 [ 1.829411] Key type dns_resolver registered [ 1.836526] ThumbEE CPU extension supported. [ 1.841217] Registering SWP/SWPB emulation handler [ 1.851007] regulator-dummy: disabling [ 1.856231] slave hdmi.6: could not get i2c [ 1.861179] platform hdmi.6: Driver slave requests probe deferral [ 1.867702] mmc1: BKOPS_EN bit is not set [ 1.873326] platform 4830e000.lcdc: Driver tilcdc requests probe deferral [ 1.889725] mmc1: new high speed MMC card at address 0001 [ 1.901557] mmcblk0: mmc1:0001 P1XXXX 3.60 GiB [ 1.907269] mmcblk0boot0: mmc1:0001 P1XXXX partition 1 16.0 MiB [ 1.914572] DCDC1: at 1500 mV [ 1.918019] mmcblk0boot1: mmc1:0001 P1XXXX partition 2 16.0 MiB [ 1.930456] mmcblk0: p1 p2 [ 1.936355] vdd_mpu: 925 <--> 1325 mV at 1325 mV [ 1.947265] vdd_core: 925 <--> 1150 mV at 1125 mV [ 1.954052] mmcblk0boot1: unknown partition table [ 1.962997] LDO1: at 1800 mV [ 1.967575] mmcblk0boot0: unknown partition table [ 1.975804] LDO2: at 3300 mV [ 1.981973] LDO3: 1800 mV [ 1.986787] LDO4: at 3300 mV [ 1.992033] tps65217 0-0024: TPS65217 ID 0xe version 1.2 [ 1.997673] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz [ 2.134211] tilcdc 4830e000.lcdc: found TDA19988 [ 2.141196] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013). [ 2.148118] [drm] No driver support for vblank timestamp query. [ 2.155218] tilcdc 4830e000.lcdc: No connectors reported connected with modes [ 2.162777] [drm] Cannot find any crtc or sizes - going 1024x768 [ 2.183488] Console: switching to colour frame buffer device 128x48 [ 2.195393] tilcdc 4830e000.lcdc: fb0: frame buffer device [ 2.201258] tilcdc 4830e000.lcdc: registered panic notifier [ 2.207150] [drm] Initialized tilcdc 1.0.0 20121205 on minor 0 [ 2.280799] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6 [ 2.287187] davinci_mdio 4a101000.mdio: detected phy mask fffffffe [ 2.296447] libphy: 4a101000.mdio: probed [ 2.300661] davinci_mdio 4a101000.mdio: phy[0]: device 4a101000.mdio:00, driver SMSC LAN8710/LAN8720 [ 2.311980] Detected MACID = f4:5e:ab:5f:e7:6b [ 2.321178] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:01 UTC (946684801) [ 2.356287] EXT3-fs (mmcblk0p2): recovery required on readonly filesystem [ 2.363582] EXT3-fs (mmcblk0p2): write access will be enabled during recovery [ 2.707789] kjournald starting. Commit interval 5 seconds [ 2.719324] EXT3-fs (mmcblk0p2): recovery complete [ 2.724420] EXT3-fs (mmcblk0p2): mounted filesystem with ordered data mode [ 2.731774] VFS: Mounted root (ext3 filesystem) readonly on device 179:2. [ 2.742040] devtmpfs: mounted [ 2.745722] Freeing unused kernel memory: 376K (c07f0000 - c084e000) INIT: version 2.88 booting Starting udev [ 3.331908] udev[705]: starting version 164 [ 7.904301] random: nonblocking pool is initialized Starting Bootlog daemon: bootlogd: cannot allocate pseudo tty: No such file or directory bootlogd. [ 8.828499] EXT3-fs (mmcblk0p2): using internal journal Configuring network interfaces... [ 9.599426] net eth0: initializing cpsw version 1.12 (0) [ 9.681574] net eth0: phy found : id is : 0x7c0f1 [ 9.686639] libphy: PHY 4a101000.mdio:01 not found [ 9.691691] net eth0: phy 4a101000.mdio:01 not found on slave 1 done. Mon Feb 17 19:03:00 UTC 2014 INIT: Entering runlevel: 5 Starting syslogd/klogd: done Stopping Bootlog daemon: bootlogd. _____ _____ _ _ | _ |___ ___ ___ ___ | _ |___ ___ |_|___ ___| |_ | | _| .'| . | . | | __| _| . | | | -_| _| _| |__|__|_| |__,|_ |___| |__| |_| |___|_| |___|___|_| |___| |___| Arago Project http://arago-project.org zyr-am335x ttyO0 Arago 2013.05 zyr-am335x ttyO0 zyr-am335x login:
四、為了方便can的測試需要使用的iproute2-2.6.39和canutils與libsocketcan-0.0.10
A 配置ip命令
下載iproute2-2.6.39鏈接地址:
解壓iproute2-2.6.39進入目錄:
方法一:修改Makefile文件
在31行 改為 CC = arm-linux-gnueabihf-gcc
在39行 改為 SUBDIRS=lib ip 以為我們只要ip命令所以之編譯ip即可。
修改之后make,將在ip目錄里生成的ip可執行文件copy 到Boneblack開發板的文件系統/bin或者/sbin中。前提是將板子上的已經有的ip給重命名掉,比如改為ip- busybox(原先的ip命令是busybox生成的不能控制can)。
可以參考網站:http://emb.hqyj.com/Column/Column596.htm
方法二:修改Makefile文件
- DESTDIR=/usr/ + #DESTDIR=/usr/ ROOTDIR=$(DESTDIR) LIBDIR=/usr/lib/
# Path to db_185.h include - DBM_INCLUDE:=$(ROOTDIR)/usr/include + #DBM_INCLUDE:=$(ROOTDIR)/usr/include
- CC = gcc + #CC = gcc
保存退出。
然后在iproute2-2.6.39加入以下配置腳本build.sh
#!/bin/sh
# create by myir tom 2015-01-28 # put this file under the ip source root dir FILESYS_PATH=/home/zyr/Source_code/CAN_Utilities/iproute2-2.6.39/Filesystem #TOOL_CHAIN_PATH=/home/zyr/Source_code/CAN_Utilities/iproute2-2.6.39/tool_chain cp misc/Makefile{,.orig} sed '/^TARGETS/s@arpd@@g' misc/Makefile.orig > misc/Makefile export GNUEABI=arm-linux-gnueabi export CC=$GNUEABI-gcc export LD=$GNUEABI-ld export NM=$GNUEABI-nm export AR=$GNUEABI-ar export RANLIB=$GNUEABI-ranlib export CXX=$GNUEABI-c++ export PREFIX=$FILESYS_PATH/usr export CROSS_COMPILE_PREFIX=$PREFIX export PATH=$TOOL_CHAIN_PATH/bin:$PATH export DBM_INCLUDE=/usr/include export INCLUDES=/usr/include export DESTDIR=$PREFIX/ #echo $PREFIX #echo $PATH #echo $DESTDIR ./configure --host=arm-linux-gnueabi --prefix=$PREFIX --enable-debug
運行配置腳本是:sh build.sh
編譯文件:make
將在ip目錄里生成的ip可執行文件copy 到Boneblack開發板的文件系統/bin或者/sbin中。前提是將板子上的已經有的ip給重命名掉,比如改為ip-busybox(原先的ip命令是busybox生成的不能控制can)。
可以參考網站:http://processors.wiki.ti.com/index.php/AM335X_DCAN_Driver_Guide#CAN_Utilities
這樣配置IP的命令已經做好了。
B、配置can-utils (參考網址:http://processors.wiki.ti.com/index.php/Linux_Core_DCAN_User%27s_Guide)
1、下載canutils 4.0.6 https://public.pengutronix.de/software/socket-can/canutils/v4.0/
2、配置編譯canutils需要庫文件libsocketcan-0.0.10 https://public.pengutronix.de/software/libsocketcan/
3、解壓canutils和libsocketcan-0.0.10
進入libsocketcan-0.0.10目錄添加build.sh配置腳本:
#!/bin/sh
#libsocketcan cross compilation
#Environment variables
#Make sure that TOOL CHAIN path (TOOL_CHAIN_PATH) and target file system (INSTALL_PATH) paths are exported along with #these variables. Example INSTALL_PATH is PWD/install (present working directory is LIBSOCKETCAN_PATH). #Note, create "install" directory under LIBSOCKETCAN_PATH export GNUEABI=arm-linux-gnueabi export CC=$GNUEABI-gcc export LD=$GNUEABI-ld export NM=$GNUEABI-nm export AR=$GNUEABI-ar export RANLIB=$GNUEABI-ranlib export CXX=$GNUEABI-c++ export INSTALL_PATH=$PWD/install export PREFIX=$INSTALL_PATH/ export CROSS_COMPILE_PREFIX=$PREFIX export PATH=/usr/arm-linux-gnueabi/bin:$PATH #好像這個變量也可以不要 ./configure --host=arm-linux-gnueabi --prefix=$PREFIX --enable-debug make make install
運行腳本sh build.sh 會在libsocketcan-0.0.10目錄下生成install文件夾,里邊有生成的對應的庫。將生成的install里的lib文件復制到BoneBlack的文件系統中的lib中,並將 install中的頭文件復制到can-utils目錄中的include中。
4、進入canutils目錄,在此目錄添加build.sh腳本
#!/bin/sh
LIBSOCKETCAN_PATH=/home/zyr/Source_code/CAN_Utilities/libsocketcan-0.0.10 export GNUEABI=arm-linux-gnueabi export CC=$GNUEABI-gcc export LD=$GNUEABI-ld export NM=$GNUEABI-nm export AR=$GNUEABI-ar export RANLIB=$GNUEABI-ranlib export CXX=$GNUEABI-c++ export PREFIX=$PWD/usrzhu export CROSS_COMPILE_PREFIX=$PREFIX export PATH=/usr/arm-linux-gnueabi/bin:$PATH export LIBSOCKETCAN_INSTALL_DIR=$LIBSOCKETCAN_PATH/install export PKG_CONFIG_PATH=$LIBSOCKETCAN_PATH/config export LD_LIBRARY_PATH=${LIBDIR}:${LD_LIBRARY_PATH} export LD_RAN_PATH=${LIBDIR}:${LD_RAN_PATH} export LDFLAGS="-Wl,--rpath -Wl,$LIBSOCKETCAN_INSTALL_DIR/lib" export INCLUDES="-I$LIBSOCKETCAN_INSTALL_DIR/include" ./configure --host=arm-linux-gnueabi --prefix=$PREFIX make make install
運行腳本會在該目錄下生成usrzhu文件夾,里邊對應的目錄里有canconfig、candump、cansend、canecho、cansequence等可知執行文件,並將其復制到對應的開發板的文件系統的目錄中。
或者參考這個網站:http://emb.hqyj.com/Column/Column596.htm
https://www.cnblogs.com/chenfulin5/p/6797756.html
問題:1、根據以上的步驟都可以生成canconfig、candump、cansend、canecho、cansequence但是都不能在Bonblack開發板是運行,運行./canconfig就會報no such file或者no command find。沒辦法了,不知道為什么編譯好的可執行文件不能運行的,用的編譯器就是交叉編譯器理論上生成的可執行文件可以在arm上跑的呀,網上翻資料有可能是連接庫的問題,於是寫了個簡單的1+1程序,用arm-linux-gnueabi交叉編譯,將生成的可執行文件下載到開發板中,可以運行。於是就在pc上查看1+1程序是怎么鏈接的。
zyr@ubuntu:~/Source_code/text/gcc-test$ readelf -l test
Elf file type is EXEC (Executable file) Entry point 0x831d There are 9 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x000418 0x00008418 0x00008418 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00120 0x00120 R E 0x4 INTERP 0x000154 0x00008154 0x00008154 0x00019 0x00019 R 0x1 [Requesting program interpreter: /lib/ld-linux-armhf.so.3] LOAD 0x000000 0x00008000 0x00008000 0x00424 0x00424 R E 0x8000 LOAD 0x000f0c 0x00010f0c 0x00010f0c 0x0011c 0x00120 RW 0x8000 DYNAMIC 0x000f18 0x00010f18 0x00010f18 0x000e8 0x000e8 RW 0x4 NOTE 0x000170 0x00008170 0x00008170 0x00044 0x00044 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 GNU_RELRO 0x000f0c 0x00010f0c 0x00010f0c 0x000f4 0x000f4 R 0x1 Section to Segment mapping: Segment Sections... 00 .ARM.exidx 01 02 .interp 03 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame 04 .init_array .fini_array .jcr .dynamic .got .data .bss 05 .dynamic 06 .note.ABI-tag .note.gnu.build-id 07 08 .init_array .fini_array .jcr .dynamic zyr@ubuntu:~/Source_code/text/gcc-test$
得知這個可執行文件是連接在/lib/ld-linux-armhf.so.3這里的。
2、網上資料搜索得知識動態庫的鏈接不正確。所以利用命令查看cansend的鏈接庫(在PC上查看之前生成的cansend的鏈接目標):
readelf -l cansend
zyr@ubuntu:~/Source_code/CAN_Utilities/canutils-4.0.6/usrzhu/bin$ ls
candump canecho cansend cansequence
zyr@ubuntu:~/Source_code/CAN_Utilities/canutils-4.0.6/usrzhu/bin$ readelf -l cansend Elf file type is EXEC (Executable file) Entry point 0x8a99 There are 9 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align EXIDX 0x000fc4 0x00008fc4 0x00008fc4 0x00008 0x00008 R 0x4 PHDR 0x000034 0x00008034 0x00008034 0x00120 0x00120 R E 0x4 INTERP 0x000154 0x00008154 0x00008154 0x00013 0x00013 R 0x1 [Requesting program interpreter: /lib/ld-linux.so.3] LOAD 0x000000 0x00008000 0x00008000 0x00fd0 0x00fd0 R E 0x8000 LOAD 0x001efc 0x00011efc 0x00011efc 0x0016c 0x00184 RW 0x8000 DYNAMIC 0x001f08 0x00011f08 0x00011f08 0x000f8 0x000f8 RW 0x4 NOTE 0x000168 0x00008168 0x00008168 0x00044 0x00044 R 0x4 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4 GNU_RELRO 0x001efc 0x00011efc 0x00011efc 0x00104 0x00104 R 0x1 Section to Segment mapping: Segment Sections... 00 .ARM.exidx 01 02 .interp 03 .interp .note.ABI-tag .note.gnu.build-id .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.exidx .eh_frame 04 .init_array .fini_array .jcr .dynamic .got .data .bss 05 .dynamic 06 .note.ABI-tag .note.gnu.build-id 07 08 .init_array .fini_array .jcr .dynamic zyr@ubuntu:~/Source_code/CAN_Utilities/canutils-4.0.6/usrzhu/bin$
得知cansend鏈接在了lib/ld-linux.so.3這個文件。但是查看BoneBlack的文件系統的/lib中並沒有ld-linux.so.3這個文件。沒有的話怎么辦呢,做一個吧。抱着試一試的態度做了一個這樣的鏈接:
ln -s ld-linux.so.3 ld-linux-armhf.so.3
將ld-linux.so.3復制到開發板的lib目錄下。
然后將新的文件系統下載到BoneBlack中,沒想到竟然成功了。但是canconfig這個命令依然不能運行,沒辦法,好像要鏈接到libsockecan-0.0.10生成的庫中的。我就沒有再搞了,因為ip命令完全可以代替canconfig的。
五、配置can0
1、查看ip版本 ip -V
iroot@zyr-am335x:~# ip -V
ip utility, iproute2-ss110629
2、配置can0的波特率為125000hz並使其進入loopback模式
首先關閉can0,然后在配置波特率
root@zyr-am335x:~# ip link set can0 down root@zyr-am335x:~# ip link set can0 type can bitrate 125000 loopback 0n Error: argument of "loopback" must be "on" or "off" root@zyr-am335x:~# ip link set can0 type can bitrate 125000 loopback on root@zyr-am335x:~#
3、查看can0的狀態 有三種方式可以查看
root@zyr-am335x:~# ip -d -s link show can0 2: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN qlen 10 link/can can <LOOPBACK> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 0 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 0 0 0 0 0 0 root@zyr-am335x:~# ip -details link show can0 2: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN qlen 10 link/can can <LOOPBACK> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 root@zyr-am335x:~# cat /proc/net/can/stats 0 transmitted frames (TXF) 0 received frames (RXF) 0 matched frames (RXMF) 0 % total match ratio (RXMR) 0 frames/s total tx rate (TXR) 0 frames/s total rx rate (RXR) 0 % current match ratio (CRXMR) 0 frames/s current tx rate (CTXR) 0 frames/s current rx rate (CRXR) 0 % max match ratio (MRXMR) 0 frames/s max tx rate (MTXR) 0 frames/s max rx rate (MRXR) 0 current receive list entries (CRCV) 0 maximum receive list entries (MRCV) root@zyr-am335x:~#
從以上知道can0 在loopback模式,can0stopped,波特率125000hz,接收0發送0.
4、開啟can0
root@zyr-am335x:~# ip link set can0 up [ 6316.441829] c_can_platform 481cc000.d_can can0: setting BTR=1c0b BRPE=0000 root@zyr-am335x:~# ip -d -s link show can0 2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN qlen 10 link/can can <LOOPBACK> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 0 0 0 0 0 0 TX: bytes packets errors dropped carrier collsns 0 0 0 0 0 0 root@zyr-am335x:~#
5、在loopback模式發送數據然后在接收
root@zyr-am335x:~# cansend can0 -i 0xAA 0x55 0x55 0x55 0x55 interface = can0, family = 29, type = 3, proto = 1 root@zyr-am335x:~# candump can0 interface = can0, family = 29, type = 3, proto = 1 root@zyr-am335x:~# ip -d -s link show can0 2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UNKNOWN qlen 10 link/can can <LOOPBACK> state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 re-started bus-errors arbit-lost error-warn error-pass bus-off 0 0 0 0 0 0 RX: bytes packets errors dropped overrun mcast 4 1 0 0 0 0 TX: bytes packets errors dropped carrier collsns 4 1 0 0 0 0 root@zyr-am335x:~# cat /proc/net/can/stats 1 transmitted frames (TXF) 2 received frames (RXF) 0 matched frames (RXMF) 0 % total match ratio (RXMR) 0 frames/s total tx rate (TXR) 0 frames/s total rx rate (RXR) 0 % current match ratio (CRXMR) 0 frames/s current tx rate (CTXR) 0 frames/s current rx rate (CRXR) 0 % max match ratio (MRXMR) 1 frames/s max tx rate (MTXR) 2 frames/s max rx rate (MRXR) 0 current receive list entries (CRCV) 1 maximum receive list entries (MRCV) root@zyr-am335x:~#
發現控制台並沒接收到數據,但是查看can0的狀態可以得知我們發送了也接收到了。同時用示波器可以看到d_can0_tx腳的波形。可參考can總線的幀格式來看示波器的波形。根據波形可以分析出ID為0xAA,中間的數據正好是0x55 0x55 0x55 0x55.這就說明我們的can0的內核驅動是正確的。
6、修改can0的工作模式trile-sampling
root@zyr-am335x:~# ip link set can0 down root@zyr-am335x:~# ip -details link show can0 2: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN qlen 10 link/can can <LOOPBACK> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 root@zyr-am335x:~# ip link set can0 type can bitrate 125000 loopback off root@zyr-am335x:~# ip -details link show can0 2: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN qlen 10 link/can can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 root@zyr-am335x:~# ip link set can0 type can bitrate 125000 trile-sampling on can: what is "trile-sampling"? Usage: ip link set DEVICE type can [ bitrate BITRATE [ sample-point SAMPLE-POINT] ] | [ tq TQ prop-seg PROP_SEG phase-seg1 PHASE-SEG1 phase-seg2 PHASE-SEG2 [ sjw SJW ] ] [ loopback { on | off } ] [ listen-only { on | off } ] [ triple-sampling { on | off } ] [ one-shot { on | off } ] [ berr-reporting { on | off } ] [ restart-ms TIME-MS ] [ restart ] Where: BITRATE := { 1..1000000 } SAMPLE-POINT := { 0.000..0.999 } TQ := { NUMBER } PROP-SEG := { 1..8 } PHASE-SEG1 := { 1..8 } PHASE-SEG2 := { 1..8 } SJW := { 1..4 } RESTART-MS := { 0 | NUMBER } root@zyr-am335x:~# ip link set can0 type can bitrate 125000 triple-sampling on root@zyr-am335x:~# ip -details link show can0 2: can0: <NOARP,ECHO> mtu 16 qdisc pfifo_fast state DOWN qlen 10 link/can can <TRIPLE-SAMPLING> state STOPPED (berr-counter tx 0 rx 0) restart-ms 0 bitrate 125000 sample-point 0.875 tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1 c_can: tseg1 2..16 tseg2 1..8 sjw 1..4 brp 1..1024 brp-inc 1 clock 24000000 root@zyr-am335x:~#
7、通過can0的triple-sampling模式發送數據
a、以標准ID 0x80 發送數據 0x55 0x55 0x55 0x55 0xaa 0xaa 0xaa 0xaa
發送方:
root@zyr-am335x:~# ip link set can0 type can bitrate 125000 triple-sampling on root@zyr-am335x:~# ip link set can0 up [ 3747.621957] c_can_platform 481cc000.d_can can0: setting BTR=1c0b BRPE=0000 root@zyr-am335x:~# cansend can0 -i 0x80 0x55 0x55 0x55 0x55 0xaa 0xaa 0xaa 0xaa interface = can0, family = 29, type = 3, proto = 1 root@zyr-am335x:~# cansend can0 -i 0x80 0x55 0x55 0x55 0x55 0xaa 0xaa 0xaa 0xaa --loop=10 interface = can0, family = 29, type = 3, proto = 1 root@zyr-am335x:~#
接收方:
root@zyr-am335x:~# candump can0 interface = can0, family = 29, type = 3, proto = 1 <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa <0x080> [8] 55 55 55 55 aa aa aa aa
b、以擴展ID方式發送數據
發送方:
root@zyr-am335x:~# cansend can0 -i 0x800 0x55 0x55 0x55 0x55 0xaa 0xaa 0xaa 0xaa -e --loop=10 interface = can0, family = 29, type = 3, proto = 1 root@zyr-am335x:~#
接收方:
root@zyr-am335x:~# candump can0 interface = can0, family = 29, type = 3, proto = 1 <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa <0x00000800> [8] 55 55 55 55 aa aa aa aa
六:硬件電路的連接:

