Module Name:    src
Committed By:   bouyer
Date:           Fri Apr 21 13:08:55 UTC 2017

Modified Files:
        src/sys/arch/arm/allwinner [bouyer-socketcan]: awin_can.c

Log Message:
can4linux code, and experiments, shows that the CAN clock frequency is
AWIN_REF_FREQ, not AWIN_REF_FREQ / 2 as the A20 doc suggests.
Always set the mbuf len to CAN_MTU, this is what linux does.
Set accept filters and clear errors counters on ifconfig up.

We can now send and receive CAN frames.


To generate a diff of this commit:
cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/arch/arm/allwinner/awin_can.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/allwinner/awin_can.c
diff -u src/sys/arch/arm/allwinner/awin_can.c:1.1.2.4 src/sys/arch/arm/allwinner/awin_can.c:1.1.2.5
--- src/sys/arch/arm/allwinner/awin_can.c:1.1.2.4	Thu Apr 20 17:30:52 2017
+++ src/sys/arch/arm/allwinner/awin_can.c	Fri Apr 21 13:08:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: awin_can.c,v 1.1.2.4 2017/04/20 17:30:52 bouyer Exp $	*/
+/*	$NetBSD: awin_can.c,v 1.1.2.5 2017/04/21 13:08:55 bouyer Exp $	*/
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(1, "$NetBSD: awin_can.c,v 1.1.2.4 2017/04/20 17:30:52 bouyer Exp $");
+__KERNEL_RCSID(1, "$NetBSD: awin_can.c,v 1.1.2.5 2017/04/21 13:08:55 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -168,7 +168,7 @@ awin_can_attach(device_t parent, device_
 	sc->sc_timecaps.cltc_brp_min = 1;
 	sc->sc_timecaps.cltc_brp_max = 64;
 	sc->sc_timecaps.cltc_brp_inc = 1;
-	sc->sc_timecaps.cltc_clock_freq = AWIN_REF_FREQ / 2;
+	sc->sc_timecaps.cltc_clock_freq = AWIN_REF_FREQ;
 	sc->sc_timecaps.cltc_linkmode_caps =
 	    CAN_LINKMODE_3SAMPLES | CAN_LINKMODE_LISTENONLY |
 	    CAN_LINKMODE_LOOPBACK;
@@ -274,13 +274,11 @@ awin_can_rx_intr(struct awin_can_softc *
 		}
 	}
 	awin_can_write(sc, AWIN_CAN_CMD_REG, AWIN_CAN_CMD_REL_RX_BUF);
-	m->m_len = m->m_pkthdr.len =
-	    offsetof(struct can_frame, data[0]) + cf->can_dlc;
+	m->m_len = m->m_pkthdr.len = CAN_MTU;
 	ifp->if_ipackets++;
 	ifp->if_ibytes += m->m_len;
 	m_set_rcvif(m, ifp);
 	bpf_mtap(ifp, m);
-	printf("can_input1\n");
 	can_input(ifp, m);
 }
 
@@ -300,7 +298,6 @@ awin_can_tx_intr(struct awin_can_softc *
 		ifp->if_opackets++;
 		can_mbuf_tag_clean(m);
 		m_set_rcvif(m, ifp);
-		printf("can_input2\n");
 		can_input(ifp, m); /* loopback */
 		sc->sc_m_transmit = NULL;
 		ifp->if_timer = 0;
@@ -503,6 +500,14 @@ awin_can_ifup(struct awin_can_softc * co
 
 	awin_can_write(sc, AWIN_CAN_BUS_TIME_REG, reg);
 
+	/* set filters to accept all frames */
+	awin_can_write(sc, AWIN_CAN_ACPC, 0x00000000);
+	awin_can_write(sc, AWIN_CAN_ACPM, 0xffffffff);
+
+	/* clear errors counter */
+	awin_can_write(sc, AWIN_CAN_REC_REG, 0);
+
+	/* leave reset mode and enable interrupts */
 	awin_can_exit_reset(sc);
 	awin_can_write(sc, AWIN_CAN_INTE_REG,
 	    AWIN_CAN_INT_TX_FLAG | AWIN_CAN_INT_RX_FLAG | AWIN_CAN_INT_ALLERRS);

Reply via email to