開發(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);
上一篇:點(diǎn)亮指路燈
下一篇:ARM-Linux S5PV210 UART驅(qū)動(5)----串口的open操作(tty_open、uart_open)
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- AM3G-2412DZ ±12V 3 瓦 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- 使用 LT3045IDD 并聯(lián)多個使用 ILIM(電流監(jiān)視器)以消除鎮(zhèn)流電阻壓降的典型應(yīng)用
- LTC1921 在一個 4 二極管設(shè)計(jì)電路中監(jiān)控卡邊緣的每個電源
- LT1021BCN8-5 具有升壓輸出電流和電流限制的電壓基準(zhǔn)的典型應(yīng)用
- DC2263A-A,用于 LTC3887EUJ (RSENSE) 雙路 PMBU 降壓轉(zhuǎn)換器的演示板,7V = VIN = 18V,Vout0/Vout1 = 0.8V 至 1.8V @ 25A
- LT3990IMSE-5 2.5V 降壓轉(zhuǎn)換器的典型應(yīng)用
- 使用 ROHM Semiconductor 的 BD4958 的參考設(shè)計(jì)
- TL431 可編程精密基準(zhǔn)電壓源的典型應(yīng)用,用于串聯(lián)通路穩(wěn)壓器的高電流分流穩(wěn)壓器
- 基于VIPer06的12V-4W,115kHz隔離反激
- LTC7813EUH 寬輸入范圍至 10V/10A 低 IQ 級聯(lián)升壓+降壓穩(wěn)壓器的典型應(yīng)用電路
- 高性能電動滑板車 BLDC 電機(jī)驅(qū)動器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測的實(shí)時聯(lián)動
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢”多模態(tài)交互設(shè)計(jì)
- 工業(yè)機(jī)器人高精度力控的“雙模融合”傳感器設(shè)計(jì)
- 工業(yè)機(jī)器人集群的“數(shù)字孿生-物理實(shí)體”閉環(huán)優(yōu)化
- 工業(yè)以太網(wǎng)交換機(jī)的“時間敏感網(wǎng)絡(luò)(TSN)”改造
- 工業(yè)現(xiàn)場信號測試:耦合方式選擇實(shí)戰(zhàn)案例
- 移動機(jī)器人:人機(jī)協(xié)作是未來的發(fā)展趨勢
- LCD1602液晶顯示模塊深入詳解之軟件篇(AVR)
- 舊文備份:AVR讀寫EEPROM分析
- 通過底層AVR方法實(shí)現(xiàn)SPI數(shù)據(jù)傳輸
- AVR單片機(jī)控制發(fā)光二極管
- 通過快速納米傳感器技術(shù)診斷防治傳染病
- 飛思卡爾16位單片機(jī)(十五)—— 如何批量燒寫芯片
- 51單片機(jī)(一)—— 51單片機(jī)簡介
- e絡(luò)盟攜手英飛凌發(fā)起低功耗物聯(lián)網(wǎng)設(shè)計(jì)挑戰(zhàn)賽
- 51單片機(jī)(二)—— 如何燒寫51單片機(jī)程序