He leído y escrito en registros en el pasado escribiendo un módulo del núcleo que crea una entrada en el archivo / proc filesytem. Entonces puedo leer los registros haciendo cat /proc/lpc32xx_regcheck
por ejemplo.
Este código puede ser basura; Podría estar en contra de las "mejores prácticas" hacerlo de esta manera. No soy un programador de Linux de ninguna manera, pero me funcionó para la depuración.
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <linux/fb.h>
#include <linux/stat.h>
#include <mach/platform.h>
#include <mach/hardware.h>
#include <mach/i2s.h>
struct proc_dir_entry *lpc32xx_regcheck = NULL;
static int my_proc_read(char *buf, char **start, off_t offset, int count, int *eof);
static int my_proc_read(char *buf, char **start, off_t offset, int count, int *eof)
{
int len = 0;
len += sprintf( buf + len, "LPC3250 I2S REGISTER DUMP:\n");
len += sprintf( buf + len, "I2S0 RXFIFO :0x%X\n", __raw_readl(io_p2v(0x2009400C)));
len += sprintf( buf + len, "I2S1 RXFIFO :0x%X\n", __raw_readl(io_p2v(0x2009C00C)));
len += sprintf( buf + len, "I2S0 STATE :0x%X\n", __raw_readl(io_p2v(0x20094010)));
len += sprintf( buf + len, "I2S1 STATE :0x%X\n", __raw_readl(io_p2v(0x2009C010)));
len += sprintf( buf + len, "I2S0 DMA0 :0x%X\n", __raw_readl(io_p2v(0x20094014)));
len += sprintf( buf + len, "I2S1 DMA0 :0x%X\n", __raw_readl(io_p2v(0x2009C014)));
len += sprintf( buf + len, "I2S0 DMA1 :0x%X\n", __raw_readl(io_p2v(0x20094018)));
len += sprintf( buf + len, "I2S1 DMA1 :0x%X\n", __raw_readl(io_p2v(0x2009C018)));
len += sprintf( buf + len, "I2S0 IRQ :0x%X\n", __raw_readl(io_p2v(0x2009401C)));
len += sprintf( buf + len, "I2S1 IRQ :0x%X\n", __raw_readl(io_p2v(0x2009C01C)));
len += sprintf( buf + len, "I2S0 TXRATE :0x%X\n", __raw_readl(io_p2v(0x20094020)));
len += sprintf( buf + len, "I2S1 TXRATE :0x%X\n", __raw_readl(io_p2v(0x2009C020)));
len += sprintf( buf + len, "I2S0 RXRATE :0x%X\n", __raw_readl(io_p2v(0x20094024)));
len += sprintf( buf + len, "I2S1 RXRATE :0x%X\n", __raw_readl(io_p2v(0x2009C024)));
len += sprintf( buf + len, "\nWriting to P_MUX_CLR...\n");
__raw_writel(0x1c,io_p2v(0x40028104));
len += sprintf( buf + len, "NEW P_MUX STATE :0x%X\n", __raw_readl(io_p2v(0x40028108)));
if(len <= count + offset)
*eof = 1;
*start = buf + offset;
len -= offset;
if( len > count)
len = count;
if( len <0)
len = 0;
return len;
}
static int __init test_init(void)
{
printk("Hello.\n");
lpc32xx_regcheck = create_proc_entry("lpc32xx_regcheck", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH, NULL);
if (lpc32xx_regcheck)
{
lpc32xx_regcheck->read_proc = my_proc_read;
}
return 0;
}
static void __exit test_exit(void)
{
printk("Goodbye.\n");
}
module_init(test_init);
module_exit(test_exit);
MODULE_AUTHOR("dext0rb");
MODULE_LICENSE("LOL");