paddr=0xff803000 dev->size=0x1000 uart_init@serial.c:56 chardev_map mapped page_vaddr 0
Hi everyone
Summary - trying to get util_libs/libplatsupport going for a HardKernel
ODROID-C4, using the camkes serialserver_polling app - but not having any
luck with mapping the UART. I'd welcome any explanations of what you think
is happening here. The background and my progress follows.
I thought I'd dive into the seL4 world and do some experimenting. I
thought a good place to start would be the UNSW AOS project (17 years after
I first did it) - but with no more ODROID-C2, got a hold of an ODROID-C4
and figured that would be a good project in itself (and well timed with a
Sydney lockdown).
So - good news: The peripheral devices we need are all very similar to a
C2, so by getting a new DTS file and updating a few addresses it starts off
fairly happily. sel4-test builds and runs (All is well...); so does the
camkes adder app; and with some mods to provide enough slots (maybe because
it has 4GB rather than 2GB) I have got the AOS milestone 0 stub to run
(including the uart initialisation). (More work to actually finish m0 and
keep going, but a job for later)
But then: I moved onto the util_libs / libplatsupport project to try and
port over as much of the device settings as possible; and using the camkes
app serialserver_polling, under the hood using SerialServer, I can't get
the uart to initialiise (or more strictly can't get the uart address to
map). chardev_map / ps_io_map fails, returning a vaddr of 0.
I've added a bunch of debug prints to the process; and for comparison also
run it on QEMU emulating a Sabre board.
On odroidc4 hardware:
## Starting application at 0x01080000 ...
ELF-loader started on CPU: ARM Ltd. Cortex-A55 r1p0
paddr=[95e000..d5710f]
No DTB passed in from boot loader.
Looking for DTB in CPIO archive...found at a86de8.
Loaded DTB from a86de8.
paddr=[23f000..24afff]
ELF-loading image 'kernel' to 0
paddr=[0..23efff]
vaddr=[ffffff8000000000..ffffff800023efff]
virt_entry=ffffff8000000000
ELF-loading image 'capdl-loader' to 24b000
paddr=[24b000..563fff]
vaddr=[400000..718fff]
virt_entry=408e48
Enabling MMU and paging
Jumping to kernel-image entry point...
Bootstrapping kernel
Booting all finished, dropped to user space
pre_init@serial.c:501 About to init port, io_ops=0x487cf0
ps_cdev_init@chardev.c:46 About to init_fn 3
ps_cdev_init@chardev.c:47 dev_defn[3].paddr: 0xff803000, size 1000
uart_init@serial.c:51 about to chardev_map: dev=0x473948, defn->id=3,
defn->padd
r=0xff803000
chardev_map@chardev.h:26 ops->io_mapper=0x487be0 &(ops->io_mapper)=0x442728
dev-
plat_pre_init@plat.c:64 Failed to initialise character device
plat_pre_init@plat.c:65 PS_SERIAL_DEFAULT: 3
On Sabre QEMU:
./simulate: qemu-system-arm -machine sabrelite -nographic -serial null
-serial mon:stdio -m size=1024M -kernel images/capdl-loader-image-
arm-imx6
ELF-loader started on CPU: ARM Ltd. Cortex-A9 r0p0
paddr=[106fc000..10aa98e3]
No DTB passed in from boot loader.
Looking for DTB in CPIO archive...found at 107fe33c.
Loaded DTB from 107fe33c.
paddr=[1003d000..10047fff]
ELF-loading image 'kernel' to 10000000
paddr=[10000000..1003cfff]
vaddr=[e0000000..e003cfff]
virt_entry=e0000000
ELF-loading image 'capdl-loader' to 10048000
paddr=[10048000..10300fff]
vaddr=[10000..2c8fff]
virt_entry=187f8
Enabling MMU and paging
Jumping to kernel-image entry point...
Bootstrapping kernel
Warning: Could not infer GIC interrupt target ID, assuming 0.
Booting all finished, dropped to user space
pre_init@serial.c:501 About to init port, io_ops=0x69cf0
ps_cdev_init@chardev.c:45 About to init_fn 1
ps_cdev_init@chardev.c:46 dev_defn[1].paddr: 0x21e8000, size 1000
uart_init@serial.c:224 about to chardev_map: dev=0x7f8c8, defn->id=1,
defn->paddr=0x21e8000
chardev_map@chardev.h:26 ops->io_mapper=0x69cf0 &(ops->io_mapper)=0x1f328
dev->paddr=0x1f654 dev->size=0x4ebc4
uart_init@serial.c:226 chardev_map mapped vaddr 0xbb000
pollcli: Hello Serial Server!
pollcli: abc
This has me confused - it's good it works, but I can't follow in the flow
how the paddr gets changed from the value supplied to chardev_map (ie
0x21e80000 becomes 0x1f654), yet in that case it works. Or is it a
complication of using QEMU?
A similar kind of test with AOS on odroidc4 - particularly the success
of "*uart_init@uart.c:35
Mapped uart paddr:ff803000 size:1000 vaddr:b0000000*"
## Starting application at 0x01080000 ...
ELF-loader started on CPU: ARM Ltd. Cortex-A55 r1p0
paddr=[88a000..c2b10f]
No DTB passed in from boot loader.
Looking for DTB in CPIO archive...found at 9f3068.
Loaded DTB from 9f3068.
paddr=[247000..252fff]
ELF-loading image 'kernel' to 0
paddr=[0..246fff]
vaddr=[ffffff8000000000..ffffff8000246fff]
virt_entry=ffffff8000000000
ELF-loading image 'sos' to 253000
paddr=[253000..48cfff]
vaddr=[400000..639fff]
virt_entry=4172e0
Enabling MMU and paging
Jumping to kernel-image entry point...
Bootstrapping kernel
Booting all finished, dropped to user space
SOS Starting...
<