Linux内核的移植技术剖析

Similar documents
S3C6410 ARM11开发板Linux BSP构建

Linux网络设备驱动

DVK530/531扩展板

[公司名称]

[公司名称]

DVK530/531扩展板

华清远见嵌入式培训课件

Microsoft Word - 正文.doc

ESP-Jumpstart

华恒家庭网关方案

Microsoft Word - 实用案例.doc

嵌入式Linux块设备驱动开发解析

Ch03_嵌入式作業系統建置_01

CC213

C/C++ - 文件IO

Measurement Studio Expands Your Test and Measurement Programming Power

考 試 日 期 :2016/04/24 教 室 名 稱 :602 電 腦 教 室 考 試 時 間 :09: 二 技 企 管 一 胡 宗 兒 中 文 輸 入 四 技 企 四 甲 林 姿 瑄 中 文 輸 入 二 技 企 管 一

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

3 PCI PCI PCI type 0 PCI type 1 PCI type 2 PCI CardBus PCI 16 6 Device ID Vendor ID 00h Status Register Command Register 04h Class Code Revision ID 08

2013年度西藏自治区教育厅

實用文格式大全.doc

个 小 小 的 乡 下 人 木 匠 的 儿 子, 竟 然 有 这 么 大 的 力 量 其 实 就 是 这 点, 祂 活 出 来 的 那 种 爱, 是 世 界 上 没 有 的 祂 活 出 来 的 爱 是 世 界 上 的 人 都 需 要 的, 但 却 是 人 人 在 这 个 世 界 上 都 得 不 到

薛 秦 高 继 宁 宋 明 锁 文 洪 梁 瑞 敏 贾 跃 进 内 蒙 古 自 治 区 (3 人 ) 琪 格 其 图 米 子 良 赵 震 生 辽 宁 省 (8 人 ) 田 素 琴 白 凤 鸣 肖 瑞 崇 黄 恩 申 白 长 川 杨 世 勇 李 敬 林 王 秀 云 吉 林 省 (5 人 ) 赵 继 福

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

概述

<4D F736F F D20C7B6C8EBCABDCAB5D1E9CAD2B7BDB0B82E646F63>

第 十 一 期 2015 年 2 月 关 于 车 辆 购 置 税 征 收 管 理 有 关 问 题 的 公 告 ( 点 击 跳 转 至 全 文 ) 国 家 税 务 总 局 公 告 2015 年 第 4 号 关 于 电 池 涂 料 消 费 税 征 收 管 理 有 关 问 题 的 公 告 ( 点 击 跳

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

网名 鱼树 的学员聂龙浩, 学习 韦东山 Linux 视频第 2 期 时所写的笔记很详细, 供大家参考 也许有错漏, 请自行分辨 目录 驱动框架分析 内核中的理解 : 内核这样理解 :... 2 RTC 测试 RTC:

C 1

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

,,, PCB, AR M VxWorks DSP,,,,,,,,,,, (CIP) /,,.:,2005 ISBN TP36 CIP (2005) : ( 10 ) : : (010 ) : (010)

P4i45GL_GV-R50-CN.p65

Microsoft Word - Index.doc

ebook50-15

Serial ATA ( Nvidia nforce430)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 6 (4) S A T A... 9 (5) S A T A (6) Microsoft Win

EK-STM32F

1 CPU interrupt INT trap CPU exception

FY.DOC

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

南京市人才服务中心

51 C 51 isp 10 C PCB C C C C KEIL

untitled

6020

1

USB解决方案.ppt

c_cpp

ebook15-C

Microsoft Word - S3c6410移植过程.doc

Microsoft Word - 第3章.doc

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

第一章 概论

专业主干课程与主要专业课程教学大纲(2009年、2011年).doc

<4D F736F F D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

ARM学习报告003——Bios源码分析.doc

untitled

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

穨2700使用手冊.doc

新版 明解C++入門編

ebook35-14

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

提问袁小兵:

untitled

Ác Åé å Serial ATA ( nvidia nforce4 SLI) S A T A (1) SATA (2) BIOS SATA (3)* RAID BIOS RAID (4) SATA (5) SATA (a) S A T A ( S A T A R A I D ) (b) (c)

Serial ATA ( Silicon Image SiI3512)...2 (1) SATA... 2 (2) B I O S S A T A... 3 (3) RAID BIOS RAID... 5 (4) S A T A... 8 (5) S A T A... 10

untitled

新・解きながら学ぶC言語

PCMCIA Compact Flash GPRS GPS PCMCIA Personal Computer Memory Card International Association CF Compact Flash PCMCIA CF PCMCIA/CF

C语言的应用.PDF

概述

<4D F736F F D20C7B6C8EBCABD6C696E7578BBF9B4A1CAB5D1E92E646F63>

马 克 思 主 义 学 院 经 济 与 工 商 管 理 学 院 公 共 管 理 学 院 法 学 院 社 会 学 院 外 国 语 学 院 中 国 现 当 代 史 世 界 中 古 史 世 界 近 现 代 史 文 化 遗 产 马 克 思 主 义 哲 学 国 际 政 治 科 学 社 会 主 义 马 克 思

目录

Abstract arm linux tool-chain root NET-Start! 2

2 12

untitled

/3/15 1, linux. linux,,. : 1.NAT ; 2. (load balance, virtual server);; 3. ; 4. ; 5. 6.VPN; 7. ; 8. ; 9.. (,

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

PROTEUS VSM

新・明解C言語入門編『索引』

ARM+Linux嵌入式系统开发路线

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

ARM JTAG实时仿真器安装使用指南

untitled

1. 软 件 核 武 器 CTreeNode 基 本 原 理 以 下 详 细 介 绍 这 一 技 术 的 基 本 原 理 -CTreeNode 这 是 一 种 数 据 结 构, 类 似 于 CObject 存 在 于 内 存 中 1. 能 够 以 树 形 的 方 式 嵌 套 存 贮 非 常 复 杂

Car DVD API User Manual V0.2 Feb 03, 2008

775i65PE_BIOS_CN.p65

发展党员材料填写参考(上网).doc

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

_汪_文前新ok[3.1].doc

地 方, 硬 件 工 程 师 在 写 完 了 一 个 4*4 键 盘 驱 动 后, 无 需 也 不 必 管 应 用 程 序 在 获 得 键 值 后 做 哪 些 处 理 及 操 作 也 就 是 说 软 件 工 程 师 需 要 看 到 一 个 没 有 硬 件 的 纯 软 件 世 界, 硬 件 必 须 透

C/C++ - 函数

SPHE8202R Design Guide Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provi

The golden pins of the PCI card can be oxidized after months or years

附件3

1.加入党组织主要经过哪些程序?

Transcription:

嵌入式培训专家 Linux 内核的移植技术剖析 主讲 : 宋宝华 www.farsight.com.cn

今天的内容 vbsp 的组成部分 vplat/mach 各组件的实现 内核节拍 中断管理 时钟 GPIO DMA IO 内存映射 v 设备与资源 platform device resource 和 plarform data uart/spi/i2c 等设备板级 resource

vbsp 作用 为内核的运行提供底层支撑 屏蔽与板相关的硬件细节 BSP 的组成部分 v 基本组成 时钟 tick(hz) 的产生 系统中断控制的方法 GPIO DMA 时钟资源的统一管理 静态映射的 IO 内存 设备的 IO 中断 DMA 等资源封装平台数据

vplat-xxx linux-2.6/arch/arm/ plat-omap/ plat-pxa/ plat-s3c/ plat-s3c24xx/ plat-s3c64xx/ plat-stmp3xxx/ vmach-xxx linux-2.6/arch/arm/ mach-s3c2400/ mach-s3c2410/ mach-s3c2412/ mach-s3c2440/ mach-s3c2442/ mach-s3c2443/ mach-s3c24a0/ mach-s3c6400/ mach-s3c6410/ ARM BSP 的目录

vsys_timer 和 timer_tick static irqreturn_t s3c2410_timer_interrupt(int irq, void *dev_id) { timer_tick(); return IRQ_HANDLED; } static struct irqaction s3c2410_timer_irq = { };.name.flags.handler 时钟节拍的产生 = "S3C2410 Timer Tick", = IRQF_DISABLED IRQF_TIMER IRQF_IRQPOLL, = s3c2410_timer_interrupt, static void init s3c2410_timer_init(void) { } s3c2410_timer_resources(); s3c2410_timer_setup(); setup_irq(irq_timer4, &s3c2410_timer_irq); struct sys_timer s3c24xx_timer = { };.init.offset.resume = s3c2410_timer_init, = s3c2410_gettimeoffset, = s3c2410_timer_setup

v irq_chip static struct irq_chip s3c_irq_uart = {.name = "s3c-uart",.mask = s3c_irq_uart_mask,.unmask = s3c_irq_uart_unmask,.mask_ack = s3c_irq_uart_maskack,.ack = s3c_irq_uart_ack, }; static void init s3c64xx_uart_irq(struct uart_irq *uirq) { for (offs = 0; offs < 3; offs++) { irq = uirq->base_irq + offs; set_irq_chip(irq, &s3c_irq_uart); set_irq_chip_data(irq, uirq); set_irq_handler(irq, handle_level_irq); set_irq_flags(irq, IRQF_VALID); } set_irq_chained_handler(uirq->parent_irq, s3c_irq_demux_uart); } void init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid) { set_irq_chip(irq, &s3c_irq_timer);... for (uart = 0; uart < ARRAY_SIZE(uart_irqs); uart++) s3c64xx_uart_irq(&uart_irqs[uart]); } 系统中断管理

GPIO 管理 vgpio_chip 和统一的 gpio_xxx API struct gpio_chip { int void int int int void (*request)(struct gpio_chip *chip, unsigned offset); (*free)(struct gpio_chip *chip, unsigned offset); (*direction_input)(struct gpio_chip *chip, unsigned offset); (*get)(struct gpio_chip *chip, unsigned offset); (*direction_output)(struct gpio_chip *chip, unsigned offset, int value); (*set)(struct gpio_chip *chip, unsigned offset, int value); }; int gpio_request(unsigned gpio, const char *label); void gpio_free(unsigned gpio); int gpio_direction_input(unsigned gpio); int gpio_direction_output(unsigned gpio, int value); int gpio_get_value_cansleep(unsigned gpio);

CLOCK 管理 v 提供统一的 clk_get clk_put 等 API: EXPORT_SYMBOL(clk_get); EXPORT_SYMBOL(clk_put); EXPORT_SYMBOL(clk_enable); EXPORT_SYMBOL(clk_disable); EXPORT_SYMBOL(clk_get_rate); EXPORT_SYMBOL(clk_round_rate); EXPORT_SYMBOL(clk_set_rate); EXPORT_SYMBOL(clk_get_parent); EXPORT_SYMBOL(clk_set_parent);

DMA 管理 v 统一的 DMA API 支持 : int request_dma(unsigned int chan, const char * device_id); void free_dma(unsigned int chan); void enable_dma(unsigned int chan); void disable_dma(unsigned int chan); void set_dma_mode (unsigned int chan, unsigned int mode); void set_dma_sg (unsigned int chan, struct scatterlist *sg, int nr_sg);

vmap_desc 和 iotable_init static struct map_desc s3c_iodesc[] initdata = { }; { }, {... },.virtual.pfn.length.type = (unsigned long)s3c_va_sys, = phys_to_pfn(s3c64xx_pa_syscon), = SZ_4K, = MT_DEVICE, IO 内存静态映射 void init s3c64xx_init_io(struct map_desc *mach_desc, int size) { } iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc)); iotable_init(mach_desc, size);

platform_device 和资源 v platform_device 和 resource static struct resource smdk6410_smsc911x_resources[] = { }; [0] = {.start = 0x18000000,.end = 0x18000000 + SZ_64K - 1,.flags = IORESOURCE_MEM, }, [1] = { },.start = S3C_EINT(10),.end = S3C_EINT(10),.flags = IORESOURCE_IRQ IRQ_TYPE_LEVEL_LOW, static struct platform_device smdk6410_smsc911x = {.name = "smsc911x",.id = -1,.num_resources = ARRAY_SIZE(smdk6410_smsc911x_resources),.resource = &smdk6410_smsc911x_resources[0], };

platform 数据 v 提供与板相关的硬件设置数据 static struct smsc911x_platform_config smdk6410_smsc911x_pdata = { };.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,.flags = SMSC911X_USE_32BIT SMSC911X_FORCE_INTERNAL_PHY,.phy_interface = PHY_INTERFACE_MODE_MII, static struct platform_device smdk6410_smsc911x = { };....dev = { },.platform_data = &smdk6410_smsc911x_pdata, struct smsc911x_platform_config 由对应设备的驱动定义, 而 platform_data 则由驱动引用

vspi_board_info static struct spi_board_info initdata jive_spi_devs[] = { }; [0] = { }, { },.modalias.bus_num = 1,.chip_select = 0, = "VGG2432A4",.mode = SPI_MODE_3, /* CPOL=1, CPHA=1 */.max_speed_hz = 100000,.platform_data = &jive_lcm_config,.modalias.bus_num = 2,.chip_select = 0, = "WM8750",.mode = SPI_MODE_0, /* CPOL=0, CPHA=0 */.max_speed_hz = 100000, SPI 板级信息 spi_register_board_info(jive_spi_devs, ARRAY_SIZE(jive_spi_devs));

vi2c_board_info static struct i2c_board_info i2c_devs0[] initdata = { { I2C_BOARD_INFO("24c08", 0x50), }, { I2C_BOARD_INFO("wm8580", 0x1b), }, I 2 C 板级信息 #ifdef CONFIG_SMDK6410_WM1190_EV1 { I2C_BOARD_INFO("wm8350", 0x1a), }, #endif };.platform_data = &smdk6410_wm8350_pdata,.irq = S3C_EINT(12), static void init smdk6410_machine_init(void) {... i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0)); i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));... }

MACHINE_START MACHINE_START(SMDK6410, "SMDK6410") /* Maintainer: Ben Dooks <ben@fluff.org> */.phys_io = S3C_PA_UART & 0xfff00000,.io_pg_offst= (((u32)s3c_va_uart) >> 18) & 0xfffc,.boot_params = S3C64XX_PA_SDRAM + 0x100,.init_irq = s3c6410_init_irq,.map_io = smdk6410_map_io,.init_machine = smdk6410_machine_init,.timer = &s3c24xx_timer, MACHINE_END

范例 : 添加 LDD6410 板 u 修改 Kconfig 和 Makefile: linux-2.6.31/arch/arm/mach-s3c6410/kconfig + config MACH_LDD6410 + bool "LDD6410" + select CPU_S3C6410 + select S3C_DEV_FB + select S3C64XX_SETUP_FB_24BPP + help + Machine support for the LDD6410 + config MACH_SMDK6410 bool "SMDK6410" select CPU_S3C6410 linux-2.6.31/arch/arm/mach-s3c6410/makefile + obj-$(config_mach_ldd6410) += mach-ldd6410.o obj-$(config_mach_smdk6410) += mach-smdk6410.o obj-$(config_mach_ncp) += mach-ncp.o u 增加新板子的文件 : linux-2.6.31/arch/arm/mach-s3c6410/mach-ldd6410.c

文档与参考实例 v Linux-2.6/arch/arm/ v http://code.google.com/p/ldd6410/ v http://code.google.com/p/ldd6410-2-6-28/ v 获取 LDD6410 源代码 : svn checkout http://ldd6410.googlecode.com/svn/trunk/ ldd6410-read-only svn checkout http://ldd6410-2-6-28.googlecode.com/svn/trunk/ ldd6410-2-6-28-read-only

演示板 LDD6410 的结构

演示板 LDD6410 的实物 (Android)

演示板 LDD6410 的实物 (QT)

LDD6410 配套软件 vu-boot vlinux 2.6.28.6( 附带 Android 补丁 ) vandroid vqt/embedded v 大量开发学习案例

Linux 设备驱动开发详解 v 主要出发点 : 力求用最简单的实例讲解复杂的知识点, 以免实例太复杂搅浑读者 ( 驱动理论部分 ) 对 Linux 设备驱动多种复杂设备的框架结构进行了全面的介绍 ( 驱动框架部分 ) 更面向实际的嵌入式工程, 讲解开发必备的软硬件基础, 及开发手段 ( 调试与移植部分 ) 提供讨论与交流平台 ( 华清远见,www.linuxdriver.cn)

筹备出版中 Linux 设备驱动开发详解第 2 版 v 主要出发点 开发 LDD6410 SAMSUNG S3C6410 开发板, 所有实例均可在该板上直接运行和学习 全面升级为 Linux 2.6.28.6 内核, 对 Linux 内核最新 API 和驱动子系统架构的变化进行介绍 对第一版中部分知识点进行整理和重新讲解 删除过时内容 新增大量内容 : SPI 主机和设备驱动 ALSA SoC 架构驱动 USB 设备控制器 /gadget 驱动 /USB OTG 驱动 内核移植 (BSP 构建与开发 ) Android 驱动 驱动分层思想 驱动分离思想

让我们一起讨论!

The success's road www.farsight.com.cn 谢谢!