Beaglebone Serial Ports Progress

Iain Young iain at
Fri Feb 15 11:20:43 UTC 2013

Hi Folks,

After waiting for deliveries, and a few false starts, I have made
-some- progress on adding support for the Beaglebone's serial ports
(UARTS1-5) to FreeBSD

First thing I did was add the pinmux stuff, having worked out exactly
what I needed to add to the DTS, and recompile. This seems to have
worked out well, and on a reboot I see:

setting internal 28 for uart1_rxd
setting internal 0 for uart1_txd

This is good. kernel comes up,curiously though, I don't see lines
output for the RTS and CTS lines (which I do set to the correct mode,
yet I do for UART3 CTS and UART4 CTS, which I added as a test.

I then proceeded to add  the uart1 device itself to the DTS, and
added the following:

  	uart1: serial at 48022000 {
                         compatible = "ns16550";
                         reg = <0x48022000 0x1000>;
                         reg-shift = <2>;
                         interrupts = < 73 >;
                         interrupt-parent = <&AINTC>;
                         clock-frequency = < 48000000 >;

This caused the kernel to dump me in db (debugger I guess). I figured
out that 't' gave me a trace, and it looked like it was in the middle
of probing for UARTS. (This is about as much knowledge I have about the
kernel debugger)

I tried changing 0x1000 for 0x2000, as it seems the next reg is also
reserved for UART1. No more luck. So, thinking I needed to add it as an
alias (as UART0 is), I added that, but it still dumped me at the
debugger on boot.

The only other thing is reg-shift. I must confess, I am a bit blind
here. Not knowing what it actually did I left it as with UART0. I'm
hoping it essentially includes the next register up for UART1, as
while that's listed as "Reserved" in the memory map [Yes, I consulted
SPRUH73G :)] , it seems to be reserved for UART1, but I am just
guessing (Yes, I know, not good practice when kernel hacking...)

I've attached the latest version of my patch, the output from the
kernel until it blows up, as well as the trace. Patch is based on

Anyone able to point me in the right direction ? I can't be too far
away, and I can then add UART2-5, and submit an actual working patch!

All the Best


-------------- next part --------------
A non-text attachment was scrubbed...
Name: beaglebone.uart1.patch
Type: text/x-patch
Size: 652 bytes
Desc: not available
URL: <>
-------------- next part --------------
FreeBSD/armv6 U-Boot loader, Revision 1.2
(root at fci386.localdomain, Sat Feb  2 23:58:42 PST 2013)
DRAM:	 256MB

Device: disk
/boot/kernel/kernel data=0x3f2ab8+0x21e28 syms=[0x4+0x8a5f0+0x4+0x6abc6]
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel]...               
fdt_start: 0x005C8A90
Kernel entry at 0x80200100...
Kernel args: (null)
KDB: debugger backends: ddb
KDB: current backend: ddb
Copyright (c) 1992-2013 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
	The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 10.0-CURRENT #7 r246610M: Fri Feb 15 10:46:57 UTC 2013
    root at beaglebone:/usr/obj/usr/src/sys/BEAGLEBONE arm
gcc version 4.2.1 20070831 patched [FreeBSD]
CPU: Cortex A8-r3 rev 2 (Cortex-A core)
 Supported features: ARM_ISA THUMB2 JAZELLE THUMBEE ARMv4 Security_Ext
 WB disabled EABT branch prediction enabled
LoUU:2 LoC:2 LoUIS:1 
Cache level 1: 
 32KB/64B 4-way data cache WT WB Read-Alloc
 32KB/64B 4-way instruction cache Read-Alloc
Cache level 2: 
 256KB/64B 8-way unified cache WT WB Read-Alloc Write-Alloc
real memory  = 268435456 (256 MB)
avail memory = 255156224 (243 MB)
Texas Instruments AM3358 Processor, Revision ES1.0
random device not loaded; using insecure entropy
simplebus0: <Flattened device tree simple bus> on fdtbus0
aintc0: <TI AINTC Interrupt Controller> mem 0xcf160000-0xcf160fff on simplebus0
aintc0: Revision 5.0
ti_scm0: <TI Control Module> mem 0xe4e10000-0xe4e11fff on simplebus0
setting internal 70 for I2C0_SDA
setting internal 70 for I2C0_SCL
setting internal 20 for gmii1_rxerr
setting internal 0 for gmii1_txen
setting internal 20 for gmii1_rxdv
setting internal 0 for gmii1_txd3
setting internal 0 for gmii1_txd2
setting internal 0 for gmii1_txd1
setting internal 0 for gmii1_txd0
setting internal 20 for gmii1_txclk
setting internal 20 for gmii1_rxclk
setting internal 20 for gmii1_rxd3
setting internal 20 for gmii1_rxd2
setting internal 20 for gmii1_rxd1
setting internal 20 for gmii1_rxd0
setting internal 30 for mdio_data
setting internal 10 for mdio_clk
setting internal 30 for mmc0_cmd
setting internal 30 for mmc0_clk
setting internal 30 for mmc0_dat0
setting internal 30 for mmc0_dat1
setting internal 30 for mmc0_dat2
setting internal 30 for mmc0_dat3
setting internal 27 for gpio0_7
setting internal 27 for gpio0_26
setting internal 27 for gpio0_27
setting internal 27 for gpio1_0
setting internal 27 for gpio1_1
setting internal 27 for gpio1_2
setting internal 27 for gpio1_3
setting internal 27 for gpio1_4
setting internal 27 for gpio1_5
setting internal 27 for gpio1_6
setting internal 27 for gpio1_7
setting internal 27 for gpio1_12
setting internal 27 for gpio1_13
setting internal 27 for gpio1_14
setting internal 27 for gpio1_15
setting internal 27 for gpio1_16
setting internal 27 for gpio1_17
setting internal 7 for gpio1_21
setting internal 7 for gpio1_22
setting internal 7 for gpio1_23
setting internal 7 for gpio1_24
setting internal 27 for gpio1_28
setting internal 27 for gpio1_29
setting internal 27 for gpio1_30
setting internal 27 for gpio1_31
setting internal 27 for gpio2_1
setting internal 27 for gpio2_6
setting internal 27 for gpio2_7
setting internal 27 for gpio2_8
setting internal 27 for gpio2_9
setting internal 27 for gpio2_10
setting internal 27 for gpio2_11
setting internal 27 for gpio2_12
setting internal 27 for gpio2_13
setting internal 26 for uart3_ctsn
setting internal 26 for uart4_ctsn
setting internal 27 for gpio2_22
setting internal 27 for gpio2_23
setting internal 27 for gpio2_24
setting internal 27 for gpio2_25
setting internal 27 for gpio3_19
setting internal 27 for gpio3_21
setting internal 2 for timer4
setting internal 2 for timer5
setting internal 2 for timer6
setting internal 2 for timer7
setting internal 6 for ehrpwm1A
setting internal 6 for ehrpwm1B
setting internal 4 for ehrpwm2A
setting internal 4 for ehrpwm2B
setting internal 28 for uart1_rxd
setting internal 0 for uart1_txd
am335x_prcm0: <AM335x Power and Clock Management> mem 0xe4e00000-0xe4e012ff on simplebus0
am335x_prcm0: Clocks: System 24.0 MHz, CPU 500 MHz
am335x_dmtimer0: <AM335x DMTimer> mem 0xe4e05000-0xe4e05fff,0xe4e31000-0xe4e31fff,0xcf161000-0xcf161fff,0xcf162000-0xcf162fff,0xcf163000-0xcf163fff,0xcf164000-0xcf164fff,0xcf165000-0xcf165fff,0xcf166000-0xcf166fff irq 66,67,68,69,92,93,94,95 on simplebus0
Timecounter "AM335x Timecounter" frequency 24000000 Hz quality 1000
Event timer "AM335x Eventtimer0" frequency 24000000 Hz quality 1000
gpio0: <TI General Purpose I/O (GPIO)> mem 0xe4e07000-0xe4e07fff,0xcf167000-0xcf167fff,0xcf168000-0xcf168fff,0xcf169000-0xcf169fff irq 96,97,98,99,32,33,62,63 on simplebus0
gpioc0: <GPIO controller> on gpio0
gpiobus0: <GPIO bus> on gpio0
uart0: <16750 or compatible> mem 0xe4e09000-0xe4e09fff irq 72 on simplebus0
uart0: console (115384,n,8,1)
Fatal kernel mode data abort: 'External Non-Linefetch Abort (S)'
trapframe: 0xc071db3c
FSR=00001008, FAR=cf16a008, spsr=60000093
r0 =00000000, r1 =cf16a000, r2 =00000008, r3 =c05f0b94
r4 =c1bd3608, r5 =c1bd3600, r6 =00000000, r7 =c1c56200
r8 =c1bd3608, r9 =00000002, r10=00000000, r11=c071db98
r12=00000002, ssp=c071db88, slr=c025792c, pc =c04f52ac

[ thread pid 0 tid 100000 ]
Stopped at      generic_bs_r_1: ldrb    r0, [r1, r2]
db> t
Tracing pid 0 tid 100000 td 0xc05f9800
db_trace_self() at db_trace_self+0xc
scp=0xc04f90a4 rlv=0xc04f90f0 (db_trace_thread+0x38)
        rsp=0xc071d82c rfp=0xc071d838
db_trace_thread() at db_trace_thread+0xc
scp=0xc04f90c4 rlv=0xc022a1b0 (db_stack_trace+0xe4)
        rsp=0xc071d83c rfp=0xc071d858
db_stack_trace() at db_stack_trace+0xc
scp=0xc022a0d8 rlv=0xc0229858 (db_command+0x2d8)
        rsp=0xc071d85c rfp=0xc071d900
        r5=0x00000000 r4=0xc05c8350
db_command() at db_command+0xc
scp=0xc022958c rlv=0xc02299c4 (db_command_loop+0x60)
        rsp=0xc071d904 rfp=0xc071d910
        r10=0x60000193 r8=0x00001008
        r7=0x00000000 r6=0xcf16a008 r5=0xc05c8660 r4=0xc071d91c
db_command_loop() at db_command_loop+0xc
scp=0xc0229970 rlv=0xc022be88 (db_trap+0xec)
        rsp=0xc071d914 rfp=0xc071da30
db_trap() at db_trap+0xc
scp=0xc022bda8 rlv=0xc0380c70 (kdb_trap+0xa4)
        rsp=0xc071da34 rfp=0xc071da58
kdb_trap() at kdb_trap+0xc
scp=0xc0380bd8 rlv=0xc0507734 (dab_fatal+0x194)
        rsp=0xc071da5c rfp=0xc071da78
        r10=0xc071db3c r8=0xc1bd3608
        r7=0xc05f9800 r6=0xcf16a008 r5=0x00001008 r4=0xc071db3c
dab_fatal() at dab_fatal+0xc
scp=0xc05075ac rlv=0xc0507aa8 (dab_buserr+0x64)
        rsp=0xc071da7c rfp=0xc071da94
        r6=0x00000000 r5=0xc05f9800
dab_buserr() at dab_buserr+0xc
scp=0xc0507a50 rlv=0xc0507c78 (data_abort_handler+0x120)
        rsp=0xc071da98 rfp=0xc071db38
        r5=0xc1bd3600 r4=0xc06111e8
data_abort_handler() at data_abort_handler+0xc
scp=0xc0507b64 rlv=0xc04fa8a8 (exception_exit)
        rsp=0xc071db3c rfp=0xc071db98
        r10=0x00000000 r9=0x00000002
        r8=0xc1bd3608 r7=0xc1c56200 r6=0x00000000 r5=0xc1bd3600
ns8250_probe() at ns8250_probe+0xc
scp=0xc0257908 rlv=0xc0257dd0 (ns8250_bus_probe+0x20)
        rsp=0xc071db9c rfp=0xc071dbcc
ns8250_bus_probe() at ns8250_bus_probe+0xc
scp=0xc0257dbc rlv=0xc025663c (uart_bus_probe+0x1b8)
        rsp=0xc071dbd0 rfp=0xc071dc10
        r10=0x00000000 r9=0x00000002
        r8=0xc1bd363c r7=0xc1c56200 r6=0x00000000 r5=0xc1bd3600
uart_bus_probe() at uart_bus_probe+0xc
scp=0xc0256490 rlv=0xc0255fcc (uart_fdt_probe+0xf8)
        rsp=0xc071dc14 rfp=0xc071dc38
        r10=0x00000000 r9=0x00000000
        r8=0xc1c43d80 r7=0x00000000 r6=0xc1c56200 r5=0x00000000
uart_fdt_probe() at uart_fdt_probe+0xc
scp=0xc0255ee0 rlv=0xc037c1ac (device_probe_child+0x1a0)
        rsp=0xc071dc3c rfp=0xc071dc68
        r6=0x00000000 r5=0xc1c56200
device_probe_child() at device_probe_child+0xc
scp=0xc037c018 rlv=0xc037c444 (device_probe+0x8c)
        rsp=0xc071dc6c rfp=0xc071dc84
        r10=0xc1bfd780 r9=0xc1bfd780
        r8=0xc1c20d80 r7=0xc1c20d94 r6=0xc1bfd780 r5=0xc1c20d80
device_probe() at device_probe+0xc
scp=0xc037c3c4 rlv=0xc037c518 (device_probe_and_attach+0x2c)
        rsp=0xc071dc88 rfp=0xc071dc98
        r6=0xc1bfd780 r5=0xc1c20d80
device_probe_and_attach() at device_probe_and_attach+0xc
scp=0xc037c4f8 rlv=0xc037c5f8 (bus_generic_attach+0x20)
        rsp=0xc071dc9c rfp=0xc071dcac
bus_generic_attach() at bus_generic_attach+0xc
scp=0xc037c5e4 rlv=0xc02321a8 (simplebus_attach+0x1cc)
        rsp=0xc071dcb0 rfp=0xc071dcd0
simplebus_attach() at simplebus_attach+0xc
scp=0xc0231fe8 rlv=0xc037b800 (device_attach+0x320)
        rsp=0xc071dcd4 rfp=0xc071dd10
        r8=0xffffffff r7=0xc052be4c
        r6=0xc1bfd7d0 r5=0x80000003 r4=0xc1bfd880
device_attach() at device_attach+0xc
scp=0xc037b4ec rlv=0xc037c534 (device_probe_and_attach+0x48)
        rsp=0xc071dd14 rfp=0xc071dd24
        r10=0xc1bd7080 r8=0xc1bfd880
        r7=0x00000000 r6=0x00000000 r5=0xc1bfd710 r4=0xc1bfd780
device_probe_and_attach() at device_probe_and_attach+0xc
scp=0xc037c4f8 rlv=0xc037c5f8 (bus_generic_attach+0x20)
        rsp=0xc071dd28 rfp=0xc071dd38
bus_generic_attach() at bus_generic_attach+0xc
scp=0xc037c5e4 rlv=0xc0231c24 (fdtbus_attach+0x564)
        rsp=0xc071dd3c rfp=0xc071ddb0
fdtbus_attach() at fdtbus_attach+0xc
scp=0xc02316cc rlv=0xc037b800 (device_attach+0x320)
        rsp=0xc071ddb4 rfp=0xc071ddf0
        r10=0xc1bfd880 r9=0xc070d000
        r8=0xffffffff r7=0xc052be4c r6=0xc1bfd8d0 r5=0x80000003
device_attach() at device_attach+0xc
scp=0xc037b4ec rlv=0xc037c534 (device_probe_and_attach+0x48)
        rsp=0xc071ddf4 rfp=0xc071de04
        r10=0xc1c20080 r8=0xffffffff
        r7=0xc052be4c r6=0xc1c20080 r5=0xffffffff r4=0xc1bfd880
device_probe_and_attach() at device_probe_and_attach+0xc
scp=0xc037c4f8 rlv=0xc037c5f8 (bus_generic_attach+0x20)
        rsp=0xc071de08 rfp=0xc071de18
bus_generic_attach() at bus_generic_attach+0xc
scp=0xc037c5e4 rlv=0xc04fe620 (nexus_attach+0x70)
        rsp=0xc071de1c rfp=0xc071de34
nexus_attach() at nexus_attach+0xc
scp=0xc04fe5bc rlv=0xc037b800 (device_attach+0x320)
        rsp=0xc071de38 rfp=0xc071de74
        r6=0xc1c200d0 r5=0x80000003
device_attach() at device_attach+0xc
scp=0xc037b4ec rlv=0xc037c534 (device_probe_and_attach+0x48)
        rsp=0xc071de78 rfp=0xc071de88
        r10=0x88048970 r8=0x880466c8
        r7=0x8020014c r6=0xc1bfc380 r5=0xc05ef268 r4=0xc1c20080
device_probe_and_attach() at device_probe_and_attach+0xc
scp=0xc037c4f8 rlv=0xc037c8b4 (bus_generic_new_pass+0xec)
        rsp=0xc071de8c rfp=0xc071dea4
bus_generic_new_pass() at bus_generic_new_pass+0xc
scp=0xc037c7d4 rlv=0xc037a6a4 (bus_set_pass+0x9c)
        rsp=0xc071dea8 rfp=0xc071dec0
        r6=0x7fffffff r5=0xc1bfc380
bus_set_pass() at bus_set_pass+0xc
scp=0xc037a614 rlv=0xc037a704 (root_bus_configure+0x14)
        rsp=0xc071dec4 rfp=0xc071ded0
        r6=0x8ff84cfc r5=0x80200158
root_bus_configure() at root_bus_configure+0xc
scp=0xc037a6fc rlv=0xc04f40bc (configure+0x10)
        rsp=0xc071ded4 rfp=0xc071dee0
configure() at configure+0xc
scp=0xc04f40b8 rlv=0xc030516c (mi_startup+0xf8)
        rsp=0xc071dee4 rfp=0xc071def4
mi_startup() at mi_startup+0xc
scp=0xc0305080 rlv=0xc0200218 (virt_done+0x30)
        rsp=0xc071def8 rfp=0x00000000

More information about the freebsd-arm mailing list