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

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

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

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

华恒家庭网关方案

新版 明解C++入門編

<4D F736F F D20B5DA36D5C22020D7D6B7FBC9E8B1B8C7FDB6AF>

DVK530/531扩展板

DVK530/531扩展板



Linux内核的移植技术剖析

Microsoft Word - 实用案例.doc

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

S3C6410 ARM11开发板Linux BSP构建

<4D F736F F F696E74202D20D7A8CCE2D2BBA3BAC7B6C8EBCABDBFAAB7A2D6AEB4A5C3FEC6C1C7FDB6AFBFAAB7A2202D20D2D7C0CFCAA62E BBCE6C

网卡驱动程序框架 网卡驱动程序 收发功能 : 只要把上层的数据发给网卡, 从网卡来的数据构造成包给上层即可 网卡只需要 socket 编程, 不需要打开某设备 驱动程序都是以面向对象的思想写的, 都有相关的结构体 编程步骤 1, 分配某结构体 :net_device 2, 设置结构体 1, 提供一个

地 理 志 鏡 止 煞, 來 達 到 安 宅 的 效 果 4. 門 神 符 紙 : 於 門 板 繪 製 門 神, 作 為 宅 第 的 守 護, 民 宅 所 使 用 的 門 神 題 材, 多 為 天 官 賜 福 或 文 武 官 員 符 紙 是 以 畫 了 符 咒 的 紙 懸 掛 室 內, 或 加 框

云 浮 市 总 工 会 学 习 贯 彻 市 委 五 届 九 次 全 会 精 神 全 省 工 会 第 二 季 度 暨 上 半 年 劳 资 纠 纷 研 判 会 召 开 河 源 市 总 工 会 召 开 劳 资 纠 纷 研 判 会 议 湛 江 市 总 工 会 召 开 上 半 年 劳 资 纠 纷 研 判 会

CC213

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

<4D F736F F F696E74202D20B5DAB6FEBDB2A3BAC7B6C8EBCABD4C696E75782D416E64726F6964C7FDB6AFBFAAB7A2BDD2C3D8D6AED2BABEA7C6C1C7FDB6AFBFAAB7A22DB9F9C0CFCAA62E BBCE6C8DDC4A3CABD5D>

SA-CPCB81TRA-CN (Panduit INdustrial Automation Solutions).indd

ebook71-13

穨_1_.PDF

标题

目 录 一 重 要 提 示... 3 二 公 司 主 要 财 务 数 据 和 股 东 变 化... 3 三 重 要 事 项... 8 四 附 录 / 28

Microsoft Word - MAN2023A_CH_APPONE.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

公務員服務法第13條相關解釋彙整表

大陸教育部等6個部門公佈「現代職業教育體系建設規劃 ( 年)」規劃到2015年初步形成現代職業教育體系框架,到2020年基本建成「中國」特色現代職業教育體系

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

B1

浙江师范大学2014年度毕业生就业质量报告

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

B1

Microsoft Word - 临政办发6.doc

菩提道次第廣論

路 上 沒 說 話, 車 子 被 爸 離 去 後 開 走 了, 沒 什 麼 變, 除 了 一 股 淡 淡 的 香 味, 我 不 太 習 慣, 像 空 氣 中 的 粉 塵, 左 飄 右 飄, 光 中 飛 舞 我 沒 提, 看 車 窗 外, 外 面 不 太 有 趣, 我 只 是 沒 事 幹, 我 們 本

繁 華 國 小 101 學 年 母 親 節 感 恩 惜 福 - 跳 蚤 市 場 暨 科 學 闖 關 遊 戲 親 子 活 動 實 施 計 畫 一 依 據 : 本 校 101 學 年 度 校 務 計 畫 及 行 事 曆 二 目 的 : 1. 培 養 學 生 感 恩 惜 物 知 福 惜 福 的 節 儉 觀

台 中 市 北 屯 區 東 山 里 橫 坑 9 林 志 明 巷 89-5 菜 豆 菜 大 漿 果 菜 豆 菜 大 漿 果 小 漿 果 核 果 柑 桔 無 陳 錦 生 新 竹 市 香 山 區


育儿小故事(四)

新版 明解C言語入門編

团 学 要 闻 我 校 召 开 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 3 月 17 日, 我 校 共 青 团 五 届 九 次 全 委 ( 扩 大 ) 会 议 在 行 政 办 公 楼 五 楼 会 议 室 举 行, 校 团 委 委 员 各 院 ( 系 ) 团 委 书 记 校 学 生

SCC11課文

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

1

ebook15-C

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

SEP4020 Linux2

网名 鱼树 的学员聂龙浩, 学习 韦东山 Linux 视频第 2 期 时所写的笔记很详细, 供大家参考 也许有错漏, 请自行分辨 目录 一 输入子系统框架 : 最上层 ( 核心层 ):... 4 (1) 流程如下 :input.c... 6 (2) int init input_in

????.rtf

<4D F736F F D20C7B6C8EBCABDCFB5CDB3BFAAB7A2CAB5D1E9CBC42E646F63>

C/C++ - 文件IO

网名 鱼树 的学员聂龙浩, 学习 韦东山 Linux 视频第 2 期 时所写的笔记很详细, 供大家参考 也许有错漏, 请自行分辨 目录 一 IIS 接口 : 原理图 硬件 : ) 声音是如何录制 : ) 声音播放 : ) IIS:

第 14 行调用 of_demo_controller_register 注册 demo controller 驱动,xlate 函数设置的都是 of_demo_simple_xlate, 这个函数完成对 user 传来的参数的处理 1. int of_demo_controller_registe

SEP4020 Linux2

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

untitled

1 政 策 聚 焦 最 高 人 民 法 院 关 于 适 用 中 华 人 民 共 和 国 保 险 法 若 干 问 题 的 解 释 ( 三 ) 中 国 保 监 会 印 发 保 险 业 功 能 服 务 指 标 体 系 2 监 管 动 态 2016 年 全 国 保 险 监 管 工 作 会 议 召 开 --

华清远见嵌入式培训课件

嵌入式Linux知识培训

JLX

第11章 可调内核参数

1.01

c_cpp

CC213

プログラムの設計と実現II

C/C++ - 字符串与字符串函数

基于Linux的internet收音机的实现

通过Hive将数据写入到ElasticSearch

. Outline 编译 Linux 在 QEMU 模拟器上运行制作带 grub 启动的磁盘映像...1 编译 Linux 在 QEMU 模拟器上运行...2 制作带 grub 启动的磁盘映像

ebook15-12

Microsoft Word - 第6章 Android驱动编程.docx

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

全國寺院宮廟基本資料調查表

生产工艺难突破制约草铵膦行业发展

C/C++程序设计 - 字符串与格式化输入/输出

untitled

韦东山嵌入式系列视频介绍 韦东山淘宝店 淘宝网址 淘宝店铺名 韦东山老师个人店 掌柜 thisway_diy 韦东山第一期 如何看原理图 ARM 裸机程序, uboot 分析和移植, linux 驱动移植, linux 驱动入门 韦东山第二期 深入

C语言的应用.PDF

ebook8-30

腰部酸痛保健法

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

ESP-Jumpstart

"!""#!"#$!"""!""$ %&# #$(!""%!""& ) *+#,$ -.# % /&01!""(!" " &#(& ) 203,+," #$4,$ #5, %&# #$(!""%!""( #$!""# $ $!"#

<4D F736F F F696E74202D20C7B6C8EBCABDC7FDB6AFBFAAB7A22DD2D7CBC9BBAA2E BBCE6C8DDC4A3CABD5D>

Linux网络设备驱动

C

说 : 荀 子 极 偏 驳, 只 一 句 性 恶, 大 本 已 失 5 朱 熹 说 : 荀 扬 不 惟 说 性 不 是, 从 头 到 底 皆 不 识 6 采 取 的 都 是 这 种 理 论 框 架 另 一 种 理 论 框 架 始 于 20 世 纪 前 期, 这 便 是 诸 子 学 研 究 的 框 架

Microsoft PowerPoint - Chapter7-DriverDevices.ppt

ebook15-4

Microsoft Word - MSP430 Launchpad 指导书.docx

工业和信息化部 水利部 全国节约用水办公室

X-One 系统看穿式监管 V1.6.3 版本客户端及 API 使用相关说明

江西省2015届高校毕业生

Microsoft Word - 正文.doc

Transcription:

网名 鱼树 的学员聂龙浩, 学习 韦东山 Linux 视频第 2 期 时所写的笔记很详细, 供大家参考 也许有错漏, 请自行分辨 目录 驱动框架分析... 2 1. 2.4 内核中的理解 :... 2 2. 2.6 内核这样理解 :... 2 RTC... 6 1. 测试 RTC:... 11 1. 1. 修改 arch\arm\plat-s3c24xx\common-smdk.c... 11 2. 2. make uimage, 使用新内核启动... 12 3. 3. ls /dev/rtc* -l... 12

驱动框架分析 1. 2.4 内核中的理解 : 1, 确定主设备号 2,file_operations 结构 3,register_chrdev( 主设备号, 名字,file_operations 结构 ); 4, 入口函数 5, 出口函数 chrdevs 数组, 以 主设备号 为下标的 file_operations 结构数组 2. 2.6 内核这样理解 : 1,chrdevs 数组只用 255, 则一个内核只能支持 255 个字符设备驱动 以前 2.4 内核确实是有这样的缺点 但 2.6 内核中很多书上建议不再用 register_chrdev() 了 2, 以前 open 一个字符设备时, 虚拟文件系统 (VFS) 层, 有 sys_open, 以前是以主设备号为下标, 在 chrdevs 数中找到以前注册的 file_oprerations 结构体, 现在变化了, 是以 主设备号 和 次设备号 两个作为一个整体来找到 file_operations 结构体 分析 drivers/rtc/rtc-s3c.c : int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops) -->cdev = cdev_alloc(); 搜索 cdev_alloc(), 可以见到别人的展开, 在 scx200_gpio.c int init scx200_gpio_init(void) -->rc = register_chrdev_region(devid, MAX_PINS, "scx200_gpio"); 参 1, 参 2 的意思 : 从哪里开始, 共有多少个 -->cd = register_chrdev_region(major(n), MINOR(n),next - n, name); -->rc = alloc_chrdev_region(&devid, 0, MAX_PINS, "scx200_gpio"); -->cdev_init(&scx200_gpio_cdev, &scx200_gpio_fileops); -->cdev_add(&scx200_gpio_cdev, devid, MAX_PINS); 3,2.6 内核中对注册字符设备的扩展 : 对 "register_chrdev" 的拆分 ❶, 若确定了 主设备号 时用 register_chrdev_region(). 没有确定主设备号时用 alloc_chrdev_region() 区域是指从( 某个主设备号 某个次设备号 )~ ( 某主设备号, 某次设备号 +n) 都对应于这个 file_operations 结构体 而 register_chrdev() 是从 主设备号 0 到 主设备号 255 都对应 file_operations" 结构体 ❷,cdev_init(); ❸,cdev_add(); 以上 ❶~❸ 步, 在 "register_chrdev()" 中可以见到此过程 :

int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) -->cd = register_chrdev_region(major, 0, 256, name); -->if (major == 0) -->cdev = cdev_alloc(); --> 开始设置 cdev->owner = fops->owner; cdev->ops = fops; kobject_set_name(&cdev->kobj, "%s", name); -->err = cdev_add(cdev, MKDEV(cd->major, 0), 256); int register_chrdev_region(dev_t from, unsigned count, const char *name) 有主设备号时, 有多少个次设备号的范围的字符设备都对些相同 file_operations 结构 参 1, 从哪里开始 参 2, 有多少个 参 3, 名字 int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,const char *name) 若没有分配主设备号时, 先分配一个主设备号放到 &dev 中, 参 1, 存放主设备号 参 2, 次设备号的基地址 参 3, 个数 参 4, 名字 若 devid = MKDEV (major, 0); 时,register_chrdev_region (devid, 2, "hello"); 是指 (major,0~1) 对应 'hello_fops',(major,2~255) 不对应 helle_fops register_chrdev_region() 参 2 是指在有主设备号的情况下, 这里有 2 个次设备号 (major,0~1) 对应于这个 file_operations 结构体 -- hello_fops 若 devid = MKDEV (major, 1); 时,register_chrdev_region (devid, 2, "hello"); 是指 (major,1~2) 对应 'hello_fops',(major,3~255) 不对应 helle_fops 编译测试 : 这是缺少头文件 :#include <linux/cdev.h>

注册时, 就要求了设备号的区域 devid = MKDEV (major, 0); 表示了从主设备 major 和次设备号 0 开始 #define HELLO_CNT 2; /* 对应次设备号的个数 */ 规定了次设备号的个数为 2 个 现在是以 主设备号 和 次设备号 一起从内核 chrdevs[] 中找到相应的 file_operations 结构体 而 2.4 内核中的方法是以主设备号为下标从 chrdevs[] 中找到相应的 file_operations 结构 2.4 中最多有 255 个驱动程序 而且现在的 2.6 内核中, 用了 20 位表示次设备号, 主设备号是用了 12 位来表示, 即有 2^12 * 2^20 个驱动程序 理论上有 4G 个驱动程序

第二个测试程序 : 以相同的主设备号, 不同的次设备号注册一个新的 file_operations 结构体

RTC 实时时钟, 断电后可以维持 就像手机拔断电池后里面还有个备份电源在维持里面的一个 时钟在运行 给时钟模块使用的晶振

RTC 时钟的电源 有块电池 BT1 使得开发板断电后, 里面的 RTC 模块还是可以运行 的 RTC 模块耗电量很少, 一小块电池它就能维持一 二年 开发板上电后说无法打开 RTC 设备 开发板上电后, 时间总是从 1970 年开始 内核中有带 RTC 模块的驱动 : drivers/rtc/rtc-s3c.c int init s3c_rtc_init(void) -->platform_driver_register(&s3c2410_rtcdrv); 注册一个平台驱动 内核中有同名 s3c2410-rtc 的设备时, 则.probe 函数才会被调用

int s3c_rtc_probe(struct platform_device *pdev) -->s3c_rtc_tickno = platform_get_irq(pdev, 1); 从平台设备里获得某些信息 -->rtc = rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, THIS_MODULE); 注册一个 RTC 设备 linux-2.6.22.6\drivers\rtc\class.c rtc-dev,c 这是 RTC 的上一层 : -->rtc_class = class_create(this_module, "rtc"); 创建类 -->rtc_dev_init(); 在 rtc-dev.c 中, -->err = alloc_chrdev_region(&rtc_devt, 0, RTC_DEV_MAX, "rtc"); 最多有 16 个次设备号 Class.c 中也实现了 rtc_device_register() rtc_device *rtc_device_register(const char *name, struct device *dev,const struct rtc_class_ops *ops, struct module *owner) -->rtc_dev_prepare(rtc); 准备. -->rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id); -->cdev_init(&rtc->char_dev, &rtc_dev_fops); -->rtc_dev_add_device(rtc); -->cdev_add(&rtc->char_dev, rtc->dev.devt, 1); drivers\rtc\rtc-s3c.c s3c_rtc_init platform_driver_register s3c_rtc_probe rtc_device_register("s3c", &pdev->dev, &s3c_rtcops, THIS_MODULE) rtc_dev_prepare cdev_init(&rtc->char_dev, &rtc_dev_fops); rtc_dev_add_device cdev_add

看 RTC 的读写操作 : static ssize_t rtc_dev_read(struct file *file, char user *buf, size_t count, loff_t *ppos) -->struct rtc_device *rtc = to_rtc_device(file->private_data); 用 private_data 私有数据得到一个 rtc_device 结构体 app: open("/dev/rtc0"); ------------------------------------------- kernel: sys_open rtc_dev_fops.open rtc_dev_open // 根据次设备号找到以前用 "rtc_device_register" 注册的 rtc_device struct rtc_device *rtc = container_of(inode->i_cdev,struct rtc_device, char_dev); const struct rtc_class_ops *ops = rtc->ops; err = ops->open? ops->open(rtc->dev.parent) : 0; s3c_rtc_open 关于 rtc_dev_fops 中的读写比较复杂, 可以看 busybox 中的 hwclock 的实现 : 使 用 ioctl() app: ioctl(fd, RTC_RD_TIME,...) ------------------------------------------- kernel: sys_ioctl rtc_dev_fops.ioctl

rtc_dev_ioctl struct rtc_device *rtc = file->private_data; 得到 rtc_device 结构体 rtc_read_time(rtc, &tm); err = rtc->ops->read_time(rtc->dev.parent, tm); s3c_rtc_gettime rtc_device 结构中有一个 const struct rtc_class_ops *ops; int s3c_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) --> 读相关寄存器 retry_get_time: rtc_tm->tm_min = readb(base + S3C2410_RTCMIN); 分 rtc_tm->tm_hour = readb(base + S3C2410_RTCHOUR); 时 rtc_tm->tm_mday = readb(base + S3C2410_RTCDATE); 日期 rtc_tm->tm_mon = readb(base + S3C2410_RTCMON); 月 rtc_tm->tm_year = readb(base + S3C2410_RTCYEAR); 年 rtc_tm->tm_sec = readb(base + S3C2410_RTCSEC); 秒 在开发板启动后, 并没有加载 RTC 驱动, 但内核中其实已经有了驱动, 只是没有加载平台 设备

要注册这个 s3c_device_rtc 平台设备 可以看到这个 平台设备 并没有使用, 上面都是声明和引用 可以把这个结构体使用起来 :common-smdk.c arch\arm\plat-s3c24xx\common-smdk.c 内核中其他函数会把这个数据 smkd_devs[] 添加进去 : 修改这个文件后, 重新编译内核 :make uimage 1. 测试 RTC: 1. 1. 修改 arch\arm\plat-s3c24xx\common-smdk.c static struct platform_device initdata *smdk_devs[] = { &s3c_device_nand,

&smdk_led4, &smdk_led5, &smdk_led6, &smdk_led7, 改为 ( 在数组 smdk_devs 里加上 s3c_device_rtc): static struct platform_device initdata *smdk_devs[] = { &s3c_device_nand, &smdk_led4, &smdk_led5, &smdk_led6, &smdk_led7, &s3c_device_rtc, 2. 2. make uimage, 使用新内核启动 3. 3. ls /dev/rtc* -l date /* 显示系统时间 */ date 123015402011.30 /* 设置系统时间 date [MMDDhhmm[[CC]YY][.ss]] */ hwclock -w /* 把系统时间写入 RTC */ 短电, 重启, 执行 date