打印
[嵌入式Linux]

platform_device_register设备注册问题

[复制链接]
2449|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
15228876176|  楼主 | 2015-6-11 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
platform_device_register()单独注册设备(serial8250)没问题,内核能成功启动。如果编译进相对应的驱动,内核起不来Uncompressing Linux... done, booting the kernel.再无相应,单独注掉platform_device_register(),即不注册设备,同样把该驱动(serial8250)编进内核是可以启动的。。换句话说,单独都能存在,不能同时注册进内核,可能会是哪里冲突呢? 求各路大神指点指点,

相关帖子

沙发
mini1986| | 2015-6-12 08:31 | 只看该作者
最好能贴出代码来,让别人看看,才能找问题......光看描述很难定位原因......

使用特权

评论回复
板凳
15228876176|  楼主 | 2015-6-12 09:09 | 只看该作者
本帖最后由 15228876176 于 2015-6-12 09:10 编辑

static struct gpmc_timings ext_uart_timings = {
        /*Minumum clock period for synchronous mode (in picoseconds)*/
        .sync_clk = 0,
        /*CS signal timing corresponding to GPMC_CONFIG2*/
        .cs_on = 10,        //T6S
        .cs_rd_off = 80,        //oe_off + T7H
        .cs_wr_off = 60,        //tcs for write: we_off + t13h
//        .adv_on = 6,
//        .adv_rd_off = 34,
//        .adv_wr_off = 44,
        .we_on = 20,
        .we_off = 60,

        .oe_on = 20,
        .oe_off = 70,

        .access = 60,
        .rd_cycle = 110,
        .wr_cycle = 90,

        .wr_access = 40,
        .wr_data_mux_bus = 0,
};
static struct plat_serial8250_port tq3359_ext_uart_data[] ={
        {
                .mapbase        = -1,
                .irq                = -1,
                .uartclk        = 1843200,
                .iotype                = UPIO_MEM,
                .regshift        = 0,
                .flags                = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
                .irqflags        = IRQF_TRIGGER_HIGH,
        },
        {
                .mapbase        = -1,
                .irq                = -1,
                .uartclk        = 1843200,
                .iotype                = UPIO_MEM,
                .regshift        = 0,
                .flags                = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
                .irqflags        = IRQF_TRIGGER_HIGH,
        },
        {
                .mapbase        = -1,
                .irq                = -1,
                .uartclk        = 1843200,
                .iotype                = UPIO_MEM,
                .regshift        = 0,
                .flags                = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
                .irqflags        = IRQF_TRIGGER_HIGH,
        },
        {
                .mapbase        = -1,
                .irq                = -1,
                .uartclk        = 1843200,
                .iotype                = UPIO_MEM,
                .regshift        = 0,
                .flags                = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
                .irqflags        = IRQF_TRIGGER_HIGH,
        },

};


static struct platform_device tq3359_ext_uart_device = {
        .name        = "serial8250",
        .id                = 0,
        .dev        = {
                .platform_data        =        tq3359_ext_uart_data,
        },
};

void gpmc_extuart_init(void)
{
        unsigned long csn1;
        unsigned long serial_gpmc_mem_base_phys = 0;

        gpmc_cs_write_reg(2,GPMC_CS_CONFIG1,0x82000200);
        gpmc_cs_write_reg(2,GPMC_CS_CONFIG2,0x00060801);
        gpmc_cs_write_reg(2,GPMC_CS_CONFIG3,0x22000010);
        gpmc_cs_write_reg(2,GPMC_CS_CONFIG4,0x06026712);
        gpmc_cs_write_reg(2,GPMC_CS_CONFIG5,0x00060906);
        gpmc_cs_write_reg(2,GPMC_CS_CONFIG6,0x84000000);
//        gpmc_cs_write_reg(2,GPMC_CS_CONFIG7,0x00000043);
        
       gpmc_cs_request(2,SZ_16M,&serial_gpmc_mem_base_phys);

        tq3359_ext_uart_data[0].mapbase                = serial_gpmc_mem_base_phys;
        tq3359_ext_uart_data[0].irq                        = gpio_to_irq(GPIO_TO_PIN(2,21));

        tq3359_ext_uart_data[1].mapbase                = serial_gpmc_mem_base_phys + 0x08;
        tq3359_ext_uart_data[1].irq                        = gpio_to_irq(GPIO_TO_PIN(2,21));

        tq3359_ext_uart_data[2].mapbase                = serial_gpmc_mem_base_phys + 0x10;
        tq3359_ext_uart_data[2].irq                        = gpio_to_irq(GPIO_TO_PIN(2,21));

        tq3359_ext_uart_data[3].mapbase                = serial_gpmc_mem_base_phys + 0x18;
        tq3359_ext_uart_data[3].irq                        = gpio_to_irq(GPIO_TO_PIN(2,21));

        if(platform_device_register(&tq3359_ext_uart_device)<0)
        {
                printk(KERN_INFO "Unable to register ST16c554 device\n");
                goto out_free_cs;
        }
        return 0;
out_free_cs:
        gpmc_cs_free(2);
        return -1;
//        omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
//        omap_init_elm();
}

使用特权

评论回复
地板
15228876176|  楼主 | 2015-6-12 23:08 | 只看该作者
编译成模块 注册设备启动内核后 加载模块出现如下错误,

root@SBC8600:/mnt/my# insmod 8250.ko
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
Internal error: Oops - bad syscall: 913310 [#1]
Modules linked in: 8250(+)
CPU: 0    Not tainted  (3.2.0 #82)
PC is at 0xdf06e59c
LR is at 0xafc8
pc : [<df06e59c>]    lr : [<0000afc8>]    psr: 80000013
sp : bef41654  ip : df00bb38  fp : df00bb94
r10: 00000000  r9 : fffffffe  r8 : 00000002
r7 : bf004154  r6 : 000000d8  r5 : bf004154  r4 : 00000000
r3 : 00000000  r2 : 00000000  r1 : 00000004  r0 : bf004154
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: 10c5387d  Table: 9cb0c019  DAC: 00000015
Process insmod (pid: 2066, stack limit = 0xdf00a2f0)
Stack: (0xbef41654 to 0xdf00c000)
1640:                                              ???????? ???????? ????????
1660: ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????
1680: ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????
16a0: ???????? ???????? ???????? ???????? ???????? ???????? ???????? ????????

反汇编了= = 不知道怎么定位这个错误啊?望指点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

56

帖子

0

粉丝