Linux Debug: Difference between revisions

From ArmadeusWiki
(Chnage some titles)
 
(29 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==
Line 9: Line 9:
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>


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


This tool allows you to access i.MXl registers from linux userspace/console. This way you debug your driver or access i.MXl hardware functionnalities directly from Linux console.
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.


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>
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:
<pre class="apf">
BIOS> run unlock_regs
BIOS> boot
</pre>


Then in linux, launch it like that:
===Usage===
  # imxregs REGISTER_NAME (give it the register name as printed in iMX Ref Manual or just the begining of the name)
* 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


==Changing FPGA IP's registers from Linux user space with 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:
# fpgaregs 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