日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

ARM-Linux S5PV210 UART驅(qū)動(6)----platform device的添加

發(fā)布者:Blissful5最新更新時間:2024-12-17 來源: cnblogs關(guān)鍵字:ARM-Linux  S5PV210  UART驅(qū)動  platform  device 手機(jī)看文章 掃描二維碼
隨時隨地手機(jī)看文章

開發(fā)板是飛凌OK210


arch/arm/mach-s5pv210/mach-smdkc110.c


首先是UART的寄存器默認(rèn)配置信息:


/* Following are default values for UCON, ULCON and UFCON UART registers */

#define S5PV210_UCON_DEFAULT    (S3C2410_UCON_TXILEVEL |   

                 S3C2410_UCON_RXILEVEL |   

                 S3C2410_UCON_TXIRQMODE |   

                 S3C2410_UCON_RXIRQMODE |   

                 S3C2410_UCON_RXFIFO_TOI |   

                 S3C2443_UCON_RXERR_IRQEN)


#define S5PV210_ULCON_DEFAULT    S3C2410_LCON_CS8


#define S5PV210_UFCON_DEFAULT    (S3C2410_UFCON_FIFOMODE |   

                 S5PV210_UFCON_TXTRIG4 |   

                 S5PV210_UFCON_RXTRIG4)


static struct s3c2410_uartcfg smdkc110_uartcfgs[] __initdata = {

    {

        .hwport        = 0,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

    {

        .hwport        = 1,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

#ifndef CONFIG_FIQ_DEBUGGER

    {

        .hwport        = 2,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

#endif

    {

        .hwport        = 3,

        .flags        = 0,

        .ucon        = S5PV210_UCON_DEFAULT,

        .ulcon        = S5PV210_ULCON_DEFAULT,

        .ufcon        = S5PV210_UFCON_DEFAULT,

    },

};


下面是添加platform device的具體過程:


1.


/*調(diào)用MACHINE_START宏

MACHINE_START和MACHINE_END框起了一個machine_desc結(jié)構(gòu)體的聲明并根據(jù)MACHINE_START宏的參數(shù)初始化其.nr和.name成員

并將該結(jié)構(gòu)體標(biāo)記編譯到.arch.info.init段

在MACHINE_START和MACHINE_END宏之間可以初始化machine_desc結(jié)構(gòu)體的剩余成員

*/

#ifdef CONFIG_MACH_SMDKC110

MACHINE_START(SMDKC110, 'SMDKC110')

#elif CONFIG_MACH_SMDKV210

MACHINE_START(SMDKV210, 'SMDKV210')

#endif

    /* Maintainer: Kukjin Kim */

    .phys_io    = S3C_PA_UART & 0xfff00000,

    .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,

    .boot_params    = S5P_PA_SDRAM + 0x100,

    .init_irq    = s5pv210_init_irq,//板級中斷初始化函數(shù)

    .map_io        = smdkc110_map_io,//板級io初始化函數(shù)

    .init_machine    = smdkc110_machine_init,//板級初始化函數(shù)

    .timer        = &s5p_systimer,

MACHINE_END


2.


static void __init smdkc110_map_io(void)

{

    s5p_init_io(NULL, 0, S5P_VA_CHIPID);

    s3c24xx_init_clocks(24000000);

    s5pv210_gpiolib_init();

    s3c24xx_init_uarts(smdkc110_uartcfgs, ARRAY_SIZE(smdkc110_uartcfgs));

    s5p_reserve_bootmem(smdkc110_media_devs, ARRAY_SIZE(smdkc110_media_devs));

#ifdef CONFIG_MTD_ONENAND

    s5pc110_device_onenand.name = 's5pc110-onenand';

#endif

#ifdef CONFIG_MTD_NAND

    s3c_device_nand.name = 's5pv210-nand';

#endif

    s5p_device_rtc.name = 'smdkc110-rtc';


}


3.


/* table of supported CPUs */

static struct cpu_table cpu_ids[] __initdata = {

{

        .idcode        = 0x43110000,

        .idmask        = 0xfffff000,

        .map_io        = s5pv210_map_io,

        .init_clocks    = s5pv210_init_clocks,

        .init_uarts    = s5pv210_init_uarts,

        .init        = s5pv210_init,

        .name        = name_s5pv210,

    },

};


arch/arm/plat-samsung/init.c


void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)

{

    if (cpu == NULL)

        return;


    if (cpu->init_uarts == NULL) {

        printk(KERN_ERR 's3c24xx_init_uarts: cpu has no uart initn');

    } else

        (cpu->init_uarts)(cfg, no);//這里最終會調(diào)用上面的s5pv210_init_uarts

}


4.


#define s5pv210_init_uarts s5pv210_common_init_uarts

 

/* uart registration process */

void __init s5pv210_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)

{

    struct s3c2410_uartcfg *tcfg = cfg;

    u32 ucnt;


    for (ucnt = 0; ucnt < no; ucnt++, tcfg++) {

        if (!tcfg->clocks) {

            tcfg->clocks = s5pv210_serial_clocks;

            tcfg->clocks_size = ARRAY_SIZE(s5pv210_serial_clocks);

        }

    }


    s3c24xx_init_uartdevs('s5pv210-uart', s5p_uart_resources, cfg, no);

}


5.


arch/arm/plat-samsung/init.c


void __init s3c24xx_init_uartdevs(char *name,

                  struct s3c24xx_uart_resources *res,

                  struct s3c2410_uartcfg *cfg, int no)

{

    struct platform_device *platdev;

    struct s3c2410_uartcfg *cfgptr = uart_cfgs;

    struct s3c24xx_uart_resources *resp;

    int uart;


    memcpy(cfgptr, cfg, sizeof(struct s3c2410_uartcfg) * no);


    for (uart = 0; uart < no; uart++, cfg++, cfgptr++) {

        platdev = s3c24xx_uart_src[cfgptr->hwport];


        resp = res + cfgptr->hwport;


        s3c24xx_uart_devs[uart] = platdev;


        platdev->name = name;

        platdev->resource = resp->resources;

        platdev->num_resources = resp->nr_resources;


        platdev->dev.platform_data = cfgptr;//將cfg掛到platdev->dev.platform_data上

    }


    nr_uarts = no;

}


static int __init s3c_arch_init(void)

{

    int ret;


    // do the correct init for cpu


    if (cpu == NULL)

        panic('s3c_arch_init: NULL cpun');


    ret = (cpu->init)();

    if (ret != 0)

        return ret;


    ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts);

    return ret;

}


arch_initcall(s3c_arch_init);


關(guān)鍵字:ARM-Linux  S5PV210  UART驅(qū)動  platform  device 引用地址:ARM-Linux S5PV210 UART驅(qū)動(6)----platform device的添加

上一篇:點(diǎn)亮指路燈
下一篇:ARM-Linux S5PV210 UART驅(qū)動(5)----串口的open操作(tty_open、uart_open)

小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved