dev/watchdog和dev/watchdog0 是同一个设备
dev/watchdog 下会有watchdog 和 watchdog0等等。这里先给出结论watchdog和watchdog0代表的是同一个硬件,即使他们的字符设备的major和minor 不一样
linux-hice:~ # ls /dev/watchdog
watchdog watchdog0 watchdog1
linux-hice:/dev # ls -al | grep watchdog
crw------- 1 root root 10, 130 Jun 7 04:38 watchdog
crw------- 1 root root 252, 0 Jun 7 04:38 watchdog0
crw------- 1 root root 252, 1 Jun 7 04:38 watchdog1
一般在watchdog的probe函数中都会调用watchdog_register_device 来在dev下注册设备,就是如上面的/dev/watchdog等
watchdog_register_device->__watchdog_register_device->watchdog_dev_register
int watchdog_dev_register(struct watchdog_device *wdd)
{
struct device *dev;
dev_t devno;
int ret;
devno = MKDEV(MAJOR(watchdog_devt), wdd->id);
ret = watchdog_cdev_register(wdd, devno);
if (ret)
return ret;
//这里就注册dev/watchdog0
dev = device_create_with_groups(&watchdog_class, wdd->parent,
devno, wdd, wdd->groups,
"watchdog%d", wdd->id);
if (IS_ERR(dev)) {
watchdog_cdev_unregister(wdd);
return PTR_ERR(dev);
}
ret = watchdog_register_pretimeout(wdd);
if (ret) {
device_destroy(&watchdog_class, devno);
watchdog_cdev_unregister(wdd);
}
return ret;
}
static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno)
{
struct watchdog_core_data *wd_data;
int err;
wd_data = kzalloc(sizeof(struct watchdog_core_data), GFP_KERNEL);
if (!wd_data)
return -ENOMEM;
kref_init(&wd_data->kref);
mutex_init(&wd_data->lock);
wd_data->wdd = wdd;
wdd->wd_data = wd_data;
if (!watchdog_wq)
return -ENODEV;
INIT_DELAYED_WORK(&wd_data->work, watchdog_ping_work);
//如果id是0的话,就调用misc_register 来注册/dev/watchdog,注意这个/dev/watchdog 对应的watchdog_device *wdd 和调用cdev_add 添加的字符设备用的同一个watchdog_device *wdd,所以才说他们对应的是同一个hw,以上层应用不管是打开dev/watchdog还是dev/watchdog0 都是一样的.
if (wdd->id == 0) {
old_wd_data = wd_data;
watchdog_miscdev.parent = wdd->parent;
err = misc_register(&watchdog_miscdev);
if (err != 0) {
pr_err("%s: cannot register miscdev on minor=%d (err=%d).\n",
wdd->info->identity, WATCHDOG_MINOR, err);
if (err == -EBUSY)
pr_err("%s: a legacy watchdog module is probably present.\n",
wdd->info->identity);
old_wd_data = NULL;
kfree(wd_data);
return err;
}
}
/* Fill in the data structures */
cdev_init(&wd_data->cdev, &watchdog_fops);
wd_data->cdev.owner = wdd->ops->owner;
/* Add the device */
err = cdev_add(&wd_data->cdev, devno, 1);
if (err) {
pr_err("watchdog%d unable to add device %d:%d\n",
wdd->id, MAJOR(watchdog_devt), wdd->id);
if (wdd->id == 0) {
misc_deregister(&watchdog_miscdev);
old_wd_data = NULL;
kref_put(&wd_data->kref, watchdog_core_data_release);
}
return err;
}
/* Record time of most recent heartbeat as 'just before now'. */
wd_data->last_hw_keepalive = jiffies - 1;
/*
* If the watchdog is running, prevent its driver from being unloaded,
* and schedule an immediate ping.
*/
if (watchdog_hw_running(wdd)) {
__module_get(wdd->ops->owner);
kref_get(&wd_data->kref);
queue_delayed_work(watchdog_wq, &wd_data->work, 0);
}
return 0;
}
之所以要注册/dev/watchog 是为来兼容老的接口
dev/watchdog和dev/watchdog0 是同一个设备相关推荐
- linux 触摸屏在dev的那个目录下,各硬件设备在Linux中的文件名
原标题:各硬件设备在Linux中的文件名 选择好你的硬件设备以后,接下来得要了解一下各硬件在Linux当中扮演得角色.再次强调一下:"在Linux系统中,每个设备都被当成一个文件来对峙&qu ...
- 查看linux设备Ran的大小,linux – 来自/ dev / zero和/ dev / urandom的不同文件大小
dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10 dd status=progress if=/dev/ura ...
- linux mtd 块设备,Linux系统中/dev/mtd与/dev/mtdblock的区别,即MTD字符设备和块设备的区别...
转:http://www.crifan.com/linux_system_in__dev__mtd_and__dev__mtdblock_distinction_character_devices_a ...
- /dev/tty和/dev/console
目录 1.串行端口终端(/dev/ttySn) 2.伪终端(/dev/pty/) 3.控制终端(/dev/tty) 4.控制台终端(/dev/ttyn, /dev/console) 5.其它类型 (1 ...
- /dev/random 和 /dev/urandom 的原理
/dev/random和 /dev/urandom是 Linux 上的字符设备文件,它们是随机数生成器,为系统提供随机数 随机数的重要性 随机数在计算中很重要. TCP/IP 序列号.密码盐和 DNS ...
- /dev/console,/dev/tty 和 /dev/null
UNIX和Linux中比较重要的三个设备文件是:/dev/console,/dev/tty和/dev/null. 0 /dev/console 这个设备代表的是系统控制台,错误信息和诊断信息通常会被发 ...
- /dev、/sys/dev 和/sys/devices 和udev的关系
/dev,设备文件存储目录,应用程序通过对这些文件的读写和控制,可以访问实际的设备: /sys/devices目录,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备:是文件系统管理设备的最 ...
- 关于 /dev/null 与 /dev/zero
使用/dev/null 把/dev/null 看作"黑 洞" . 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /de ...
- linux dd devzero,makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令
ifeq语法是ifeq ";" ";" ,功能是比较参数"arg1"和"arg2"的值是否相同,相同时为1 ifneq ...
最新文章
- Android外设存储设备的访问及测试
- 系统制成docker镜像_Docker学习以及镜像制作流程
- MATLAB:图像的与、或、非、异或逻辑运算(、|、~、xor)
- Ubuntu中update-alternatives命令(版本切换)
- 冒名顶替上大学罗彩霞_什么是冒名顶替综合症,您如何克服?
- mysql 执行计划详解,Mysql中的explain执行计划详解(1)
- logback指定不同包下的日志输出到不同的文件
- Android中在布局中写ViewPager无法渲染出来的问题
- linux扫描后台地址,Linux如何查看和控制进程
- oracle数据文件recover,又遇BUG-ORA-01148:数据文件忽然变为recover状态
- Beyong Compare4过期解决办法
- 做好数据全生命周期管理,实现数据资产化
- 路由器有线优先吗_如何设置有线上网优先 - 卡饭网
- 苹果测试充电速度软件,ChargerLAB推出iPhone 8快充测试工具POWER-Z
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
- 宽和窄俯卧撑哪个更难_宽距俯卧撑与窄距俯卧撑,练出来的肌肉有什么差距?...
- linux定时任务nodejs,让Nodejs来管理定时任务later
- 速学堂高淇老师java作业,公用电话传递数据进行加密
- 手机网页html怎样阻止广告,Webview拦截广告
- python用禁忌搜索算法实现TSP旅行商问题
热门文章
- linux服务器u盘启动失败怎么办,U盘安装Linux启动失败问题(grub)
- OWASP TOP10 及防御手段(附加应用安全设计框架)
- python文件二进制加密
- 系统支付服务器 绑定支付宝,支付宝支付 · CRMEB 多商户系统 帮助文档 · 看云...
- HPLC载波模块通信单元引脚定义
- 三校生计算机应用基础模块,三校生高考《计算机应用基础》电子教案.doc
- [网络收集]为了保护您眼睛视力,请对Vista/Win7/XP作如下设置
- Python初学者必须会的Jupyter Notebook
- 【190115】VC++ 视频聊天系统源代码
- 渗透测试中网站代码漏洞审计服务