verificando el desbordamiento de uart y enmarcando las marcas de error en linux

1

Comprobando el desbordamiento de uart y los indicadores de error de trama en linux. En algunos microcontroladores, puedo acceder programáticamente a las señales de error de saturación y de trama. ¿Es posible acceder a estas banderas desde la línea de comandos?

    
pregunta sdfsdfsdf

1 respuesta

0

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");
    
respondido por el dext0rb

Lea otras preguntas en las etiquetas