Linux Debug: Difference between revisions

From ArmadeusWiki
 
(30 intermediate revisions by 8 users not shown)
Line 1: Line 1:
** Tips to do debug under linux **
Tips to do debugging under Linux.


===Introduction===
==Introduction==


On this page, you will find usefull informations for debugging Armadeus under Linux
On this page, you will find usefull informations for debugging your Linux kernel/drivers.


===Testing your custom Linux kernel before flashing it===
==Testing your custom Linux kernel before flashing it==


You can test a linux kernel you've generated without having to reflash your board and destroy your currently working image.
You can test a linux kernel you've generated without having to reflash your board and destroy your currently working image.
Indeed Linux kernel images can be loaded and started from SDRAM with U-Boot:
Indeed Linux kernel images can be loaded and started from SDRAM with U-Boot:
  BIOS> tftp 8000000 linux-kernel-2.6.16-arm.bin
<pre class="apf">
BIOS> bootm 8000000
  BIOS> run download_kernel
MAC: 00:1e:ac:00:00:02
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.0.104; our IP address is 192.168.0.10
Filename 'apf9328-linux.bin'.
Load address: 0x8000000
Loading: #################################################################
#################################################################
#################################################################
#################################################################
#################################################################
########
done
Bytes transferred = 1703940 (1a0004 hex)
BIOS> bootm
## Booting kernel from Legacy Image at 08000000 ...
</pre>


===imxregs===
==Changing processor registers from Linux user space with imxregs==


This tool allows you to access iMX registers from linux userspace/console. This way you debug your driver or access iMX hardware functionnalities
This tool allows you to access i.MX registers from Linux userspace/console. This way you can debug your driver or access i.MX hardware functionnalities directly from Linux console.
directly from Linux console.


First, you have enable this tool in Buildroot (package selection for target):
In recent releases (>= 3.0) you should find this tool in ''/usr/bin/'' on your board.
$ make menuconfig


Once done, compile it:
===Unlock registers access===
$ make
{{Note | On [[APF51]]/[[APF28]]/[[OPOS6UL]] you don't have to explicitly unlock registers in U-Boot to access them under Linux, like explained just above}}


The generated file is located in buildroot/build_arm_nofpu/imxregs-1.0/. Now you can copy it on your target.
* To use it, you must clear i.MX PAR_1 & PAR_2 registers (registers access rights) '''before''' launching Linux kernel, so in U-Boot type (example here is for APF9328):
 
<pre class="apf">
To use it, you must clear PAR 1&2 registers (register access rights) before launching Linux kernel, so in U-Boot type:
  BIOS> mw.l 0x00200008 0
  BIOS> mw.l 0x00200008 0
  BIOS> mw.l 0x00210008 0
  BIOS> mw.l 0x00210008 0
</pre>
* on APF27:
<pre class="apf">
BIOS> mw 10000008 0
BIOS> mw 10020008 0
</pre>


Then in linux, launch it like that:
If you use it frequently, a small script ''unlock_regs'' has been defined in U-Boot, and you can call it before booting your board:
  # imxregs REGISTER_NAME (give it the register name as printed in iMX Ref Manual or just the begining of the name)
<pre class="apf">
BIOS> run unlock_regs
BIOS> boot
</pre>
 
===Usage===
* Then in Linux console/terminal, launch ''imxregs'' like that:
<pre class="apf">
  # imxregs REGISTER_NAME   (give it the register name as printed in i.MX Ref Manual or just the begining of the name)
</pre>
or
or
<pre class="apf">
  # imxregs    (to dump all supported registers)
  # imxregs    (to dump all supported registers)
</pre>


====Examples:====
===Examples===
Show OCR1 registers of each GPIO Port:
* Show OCR1 registers of each GPIO Port:
<pre class="apf">
  # imxregs OCR1
  # imxregs OCR1
</pre>


Write 123 to OCR1_D register:
* Write 0x00000123 to OCR1_D register:
<pre class="apf">
  # imxregs OCR1_D 123
  # imxregs OCR1_D 123
</pre>
==Changing FPGA IP's registers from Linux user space==
See [[FPGA_register|fpgaregs]] tool.
==Using DebugFS==
DebugFS is a in-kernel filesystem, similar to procfs or sysfs, that allows Linux driver to easily communicate debug informations to user space. Full documentation: http://lxr.linux.no/linux+v2.6.32/Documentation/filesystems/debugfs.txt or http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/ch09s07.html
===Mounting it===
<pre class="apf">
# mount -t debugfs none /sys/kernel/debug
</pre>
===Showing already allocated GPIOs===
<pre class="apf">
# cat /sys/kernel/debug/gpio
GPIOs 0-31, gpio-0:         
gpio-5  (LCD                ) in  lo
gpio-6  (LCD                ) in  lo
gpio-7  (LCD                ) in  lo
gpio-8  (LCD                ) in  lo
....
</pre>
===Showing clock tree===
<pre class="config">
Device Drivers  --->
    Common Clock Framework  --->
        [*]  DebugFS representation of clock tree
| Creates a directory hierarchy in debugfs for visualizing the clk
| tree structure.  Each directory contains read-only members
| that export information specific to that clk node: clk_rate,
| clk_flags, clk_prepare_count, clk_enable_count & clk_notifier_count.
</pre>
all clocks are availables under ''/sys/kernel/debug/clk'':
<pre class="apf">
# mount -t debugfs none /sys/kernel/debug/
# cat /sys/kernel/debug/clk/clk_summary
</pre>
==Tracers==
* http://lxr.linux.no/#linux+v3.0.22/Documentation/trace/ftrace.txt#L1016
===Function profiler===
<pre class="host">
$ make linux-menuconfig
</pre>
<pre class="config">
Kernel hacking  --->
    [*] Tracers  --->
        [*]  Kernel Function Tracer
        ...
        [*]  Kernel function profiler


===fpgaregs===


This tool allows you to access FPGA registers from linux userspace/console. This way you can easily debug your driver directly from the Linux console.
This option enables the kernel function profiler. A file is created
in debugfs called function_profile_enabled which defaults to zero.
When a 1 is echoed into this file profiling begins, and when a
zero is entered, profiling stops. A "functions" file is created in
the trace_stats directory; this file shows the list of functions that
have been hit and their counters.
</pre>


First, you have enable this tool in Buildroot (package selection for target):
==Observing system clocks==
$ make menuconfig


Once done, compile it:
You can "export" and observe some clocks:
$ make
* On OPOS6UL/L: signal CLKO1 is available on pad JTAG_TMS (pin 7 of J36) and signal CLKO2 is available on pad JTAG_TDO (pin 13 of J36).


The generated file is located in buildroot/build_arm_nofpu/fpgaregs-1.0/. Now you can copy it on your target.
Example on OPOS6UL/L:
Then in linux, launch it like that:
# fpgaregs address (for read) or fpga address value (for write)


====Examples:====
Mux CLKO1 and CLKO2 signals on JTAG_TMS and JTAG_DO:
Show register at internal FPGA address 0x0010:
<pre>
# fpgaregs 0x0010
# devmem 0x20E0048 32 3
# devmem 0x20E004C 32 3
</pre>


Write 0x0123 to FPGA register 0x0020:
Export ARM clock (divided by 8) on CLKO2:
# imxregs 0x0020 0x0123
<pre>
# devmem 0x20C4060 32 0x1EA0001
</pre>


See the reference manual of the OPOS6UL/L for the others clocks "exportable".


===Links===
==Links==
http://www.armadeus.com
* http://www-users.cs.umn.edu/~boutcher/kprobes/
* http://tree.celinuxforum.org/CelfPubWiki/PatchArchive

Latest revision as of 10:31, 3 May 2019

Tips to do debugging under Linux.

Introduction

On this page, you will find usefull informations for debugging your Linux kernel/drivers.

Testing your custom Linux kernel before flashing it

You can test a linux kernel you've generated without having to reflash your board and destroy your currently working image. Indeed Linux kernel images can be loaded and started from SDRAM with U-Boot:

 BIOS> run download_kernel 
MAC: 00:1e:ac:00:00:02
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.0.104; our IP address is 192.168.0.10
Filename 'apf9328-linux.bin'.
Load address: 0x8000000
Loading: #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 #################################################################
	 ########
done
Bytes transferred = 1703940 (1a0004 hex)
BIOS> bootm
## Booting kernel from Legacy Image at 08000000 ...

Changing processor registers from Linux user space with imxregs

This tool allows you to access i.MX registers from Linux userspace/console. This way you can debug your driver or access i.MX hardware functionnalities directly from Linux console.

In recent releases (>= 3.0) you should find this tool in /usr/bin/ on your board.

Unlock registers access

Note Note: On APF51/APF28/OPOS6UL you don't have to explicitly unlock registers in U-Boot to access them under Linux, like explained just above


  • To use it, you must clear i.MX PAR_1 & PAR_2 registers (registers access rights) before launching Linux kernel, so in U-Boot type (example here is for APF9328):
 BIOS> mw.l 0x00200008 0
 BIOS> mw.l 0x00210008 0
  • on APF27:
 BIOS> mw 10000008 0
 BIOS> mw 10020008 0

If you use it frequently, a small script unlock_regs has been defined in U-Boot, and you can call it before booting your board:

 BIOS> run unlock_regs
 BIOS> boot

Usage

  • Then in Linux console/terminal, launch imxregs like that:
 # imxregs REGISTER_NAME    (give it the register name as printed in i.MX Ref Manual or just the begining of the name)

or

 # imxregs    (to dump all supported registers)

Examples

  • Show OCR1 registers of each GPIO Port:
 # imxregs OCR1
  • Write 0x00000123 to OCR1_D register:
 # imxregs OCR1_D 123

Changing FPGA IP's registers from Linux user space

See fpgaregs tool.

Using DebugFS

DebugFS is a in-kernel filesystem, similar to procfs or sysfs, that allows Linux driver to easily communicate debug informations to user space. Full documentation: http://lxr.linux.no/linux+v2.6.32/Documentation/filesystems/debugfs.txt or http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/ch09s07.html

Mounting it

# mount -t debugfs none /sys/kernel/debug

Showing already allocated GPIOs

# cat /sys/kernel/debug/gpio
GPIOs 0-31, gpio-0:          
 gpio-5   (LCD                 ) in  lo
 gpio-6   (LCD                 ) in  lo
 gpio-7   (LCD                 ) in  lo
 gpio-8   (LCD                 ) in  lo
....

Showing clock tree

Device Drivers  --->
    Common Clock Framework  --->
        [*]   DebugFS representation of clock tree

| Creates a directory hierarchy in debugfs for visualizing the clk
| tree structure.  Each directory contains read-only members
| that export information specific to that clk node: clk_rate,
| clk_flags, clk_prepare_count, clk_enable_count & clk_notifier_count. 

all clocks are availables under /sys/kernel/debug/clk:

# mount -t debugfs none /sys/kernel/debug/
# cat /sys/kernel/debug/clk/clk_summary

Tracers

Function profiler

$ make linux-menuconfig
Kernel hacking  --->
    [*] Tracers  --->
        [*]   Kernel Function Tracer
        ...
        [*]   Kernel function profiler


 This option enables the kernel function profiler. A file is created
 in debugfs called function_profile_enabled which defaults to zero.
 When a 1 is echoed into this file profiling begins, and when a
 zero is entered, profiling stops. A "functions" file is created in
 the trace_stats directory; this file shows the list of functions that
 have been hit and their counters.

Observing system clocks

You can "export" and observe some clocks:

  • On OPOS6UL/L: signal CLKO1 is available on pad JTAG_TMS (pin 7 of J36) and signal CLKO2 is available on pad JTAG_TDO (pin 13 of J36).

Example on OPOS6UL/L:

Mux CLKO1 and CLKO2 signals on JTAG_TMS and JTAG_DO:

# devmem 0x20E0048 32 3
# devmem 0x20E004C 32 3

Export ARM clock (divided by 8) on CLKO2:

# devmem 0x20C4060 32 0x1EA0001

See the reference manual of the OPOS6UL/L for the others clocks "exportable".

Links