switch_class

SDRAM控制器——添加读写FIFO 用FIFO实现数据缓存 阅读详情

switch 类

1. init/exit:

static int __init switch_class_init(void)
    {
        return create_switch_class();   //新建一个switch类
    }
    static void __exit switch_class_exit(void)
    {
        class_destroy(switch_class);    //销毁一个switch类
    }
    module_init(switch_class_init);
    module_exit(switch_class_exit);
2. create_switch_class()

struct class *switch_class;         //声明两个全局变量
    static atomic_t device_count;

    static int create_switch_class(void)
    {
        if (!switch_class) {
            switch_class = class_create(THIS_MODULE, "switch");   //给this module创建一个switch类.
            if (IS_ERR(switch_class))
                return PTR_ERR(switch_class);
            atomic_set(&device_count, 0);                  //初始化一个原子变量,用来保护临界区。
        }
        return 0;
    }
3. switch_dev_register(): 设备注册函数,提供给别的驱动调用,用来注册switch设备。

int switch_dev_register(struct switch_dev *sdev)
    {
        int ret;
        if (!switch_class) {
            ret = create_switch_class();     //如果没有switch类,则创建一个。
            if (ret < 0)
                return ret;
        }
        sdev->index = atomic_inc_return(&device_count);   //原子变量+1,以获得原子锁,进入临界区操作。
        sdev->dev = device_create(switch_class, NULL,     
            MKDEV(0, sdev->index), NULL, sdev->name);     //创建一个名为sdev->name,设备号为MKDEV(0, sdev->index)的switch类设备。

        if (IS_ERR(sdev->dev))        //如果创建不成功就返回。
            return PTR_ERR(sdev->dev);
        ret = device_create_file(sdev->dev, &dev_attr_state);    //为设备添加 sysfs attribute:state。
        if (ret < 0)
            goto err_create_file_1;
        ret = device_create_file(sdev->dev, &dev_attr_name);    //为设备添加 sysfs attribute:name
        if (ret < 0)
            goto err_create_file_2;
        dev_set_drvdata(sdev->dev, sdev);   //给设备初始化。
        sdev->state = 0;
        return 0;
    err_create_file_2:
        device_remove_file(sdev->dev, &dev_attr_state);
    err_create_file_1:
        device_destroy(switch_class, MKDEV(0, sdev->index));
        printk(KERN_ERR "switch: Failed to register driver %s\n", sdev->name);
        return ret;
    }
    EXPORT_SYMBOL_GPL(switch_dev_register);
4. 注册完一个switch设备之后,就可以给该switch设备设置状态了, 即: switch_set_state()

void switch_set_state(struct switch_dev *sdev, int state)
    {
        char name_buf[120];
        char state_buf[120];
        char *prop_buf;
        char *envp[3];
        int env_offset = 0;
        int length;
        if (sdev->state != state) {
            sdev->state = state;        //如果设备状态不等于state,则赋值state.
            prop_buf = (char *)get_zeroed_page(GFP_KERNEL);    //获得一页初始化为0的内存 prop_buf。
            if (prop_buf) {
                length = name_show(sdev->dev, NULL, prop_buf);   //输出设备名 到prop_buf 中.
                if (length > 0) {
                    if (prop_buf[length - 1] == '\n')
                        prop_buf[length - 1] = 0;
                    snprintf(name_buf, sizeof(name_buf),
                        "SWITCH_NAME=%s", prop_buf);            //打印switch name
                    envp[env_offset++] = name_buf;
                }
                length = state_show(sdev->dev, NULL, prop_buf);
                if (length > 0) {
                    if (prop_buf[length - 1] == '\n')
                        prop_buf[length - 1] = 0;
                    snprintf(state_buf, sizeof(state_buf),    //打印switch state
                        "SWITCH_STATE=%s", prop_buf);
                    envp[env_offset++] = state_buf;
                }
                envp[env_offset] = NULL;
                kobject_uevent_env(&sdev->dev->kobj, KOBJ_CHANGE, envp); //给该switch设备传输一份带envp[]的数据。
                free_page((unsigned long)prop_buf);  //释放申请的内存。
            } else {
                printk(KERN_ERR "out of memory in switch_set_state\n");
                kobject_uevent(&sdev->dev->kobj, KOBJ_CHANGE);   //notify userspace by ending an uevent 通知用户空间,uevent操作结束。
            }
        }
    }
    EXPORT_SYMBOL_GPL(switch_set_state);
 5. name 和 state 属性操作

static ssize_t state_show(struct device *dev, struct device_attribute *attr,
            char *buf)
    {
        struct switch_dev *sdev = (struct switch_dev *)
            dev_get_drvdata(dev);
        if (sdev->print_state) {
            int ret = sdev->print_state(sdev, buf);   //打印state
            if (ret >= 0)
                return ret;
        }
        return sprintf(buf, "%d\n", sdev->state);
    }
    static ssize_t name_show(struct device *dev, struct device_attribute *attr,
            char *buf)
    {
        struct switch_dev *sdev = (struct switch_dev *)
            dev_get_drvdata(dev);
        if (sdev->print_name) {
            int ret = sdev->print_name(sdev, buf);   //打印name
            if (ret >= 0)
                return ret;
        }
        return sprintf(buf, "%s\n", sdev->name);
    }
    static DEVICE_ATTR(state, S_IRUGO | S_IWUSR, state_show, NULL);    //给用户空间提供接口
    static DEVICE_ATTR(name, S_IRUGO | S_IWUSR, name_show, NULL);

6. 一个重要的数据结构,描述switch设备的。

struct switch_dev {
        const char    *name;
        struct device    *dev;   
        int        index;
        int        state;
        ssize_t    (*print_name)(struct switch_dev *sdev, char *buf);
        ssize_t    (*print_state)(struct switch_dev *sdev, char *buf);
    };

 
五、实战pxe安装ubuntu 22.04 软raid1(实际生产pxe配置) 这段配置文件是一个cloud-init的自动安装配置,用于自动化部署Ubuntu服务器操作系统。它定义了从系统身份、键盘布局、区域设置到磁盘分区和RAID配置的一系列设置,并且包含了在安装过程的最后阶段执行的一些命令。基础设置version: 1指定了autoinstall配置文件的版本。source定义了安装源,这里是ubuntu-server。identity设置了主机名(hostname)、用户(username)和密码(password注意这里的密码是经过加密的。键盘与语言设置。 阅读详情

相关推荐

从谱峰搜索到多项式求根:Root-MUSIC算法原理与MATLAB实践

本文深入解析Root-MUSIC算法在阵列信号处理中的原理与应用,通过多项式求根替代传统MUSIC算法的谱峰搜索,显著提升计算效率和精度。文章详细介绍了算法核心思想、MATLAB实现步骤及工程优化技巧,帮助读者掌握这一高效的DOA估计方法。

weixin_30832143的博客 80

switch代替if与 instanceof 结合的使用(switch的case语句判断Class类型)

switch代替if与 instanceof 结合的使用(switch的case语句判断Class类型) switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。 思路:从switch支持的变量类型中,我们可以看到,switch还不...

天生卷发 8967

华为交换机密码策略配置避坑指南:明文/密文、长度、复杂度,一个命令就出错

本文详细解析华为交换机密码策略配置的关键要点,包括密码长度、复杂度及等保合规要求。通过实战案例揭示常见配置误区,如明文/密文密码格式差异、复杂度检查联动机制等,帮助网络工程师避免安全漏洞。特别针对等保二级和三级要求,提供可直接落地的安全加固方案。

weixin_30879169的博客 368

关于 switch class

早上查找一种代码示例(通过 sysfs 开关外设比如 modem),看到了 switch class, 位于drivers/switch由google编写。它主要用于管理一些开关型外设, 比如耳机插拔等。 目前实现了 gpio 型的开关, 当然,它也提供了接口用于实现非 gpio型开关。它提供了 sysfs 的接口用于查询当前开关的状态, 同时出现开关事件时,会通过 uevent

zjujoe的专栏 2491

子网划分详解

还不会子网划分?看这篇就够了,保姆级教程

m0_47584619的博客 6093

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

jQuery UI 实例 - 转换 Class(Switch Class)

当动画样式改变时,为匹配的元素集合内的每个元素添加和移除指定的 Class。

m0_72763148的博客 468

17、扩展景深成像的瞳孔函数工程技术解析

本文详细解析了扩展景深成像的关键技术,包括基于焦距堆栈的数字处理方法、立方相位掩模的光学设计、对数非球面透镜的应用以及旋转点扩散函数的深度编码功能。通过实验验证和实际应用分析,展示了这些技术在显微镜成像、工业检测和医疗影像中的广泛用途及优势。同时探讨了未来发展方向,如智能算法优化、新型光学材料和多模态成像技术,为相关领域的技术创新提供了参考。

y2z3a4b5c的博客 168

什么是代数类型 ? java为什么要添加record,Sealed class 和增强switch ?

代数类型是编程中一种简单而强大的概念,它将类型视为值的集合,并通过加法和乘法运算来组合类型。积类型(如元组和结构体)通过组合多个类型的值创建新类型,而和类型(如Option和Result)允许一个值属于多个类型之一。这种类型系统能更精确地建模现实问题,减少运行时错误,并简化API设计。尽管在一些主流语言中缺乏对代数类型的原生支持导致开发者需要绕道实现类似功能,但在支持代数类型的语言(如OCaml和Rust)中,类型系统能更自然地表达程序逻辑,降低认知负担并提高代码安全性。

xuejianxinokok的专栏 884

go实现MQTT broker(附完整源码)

go实现MQTT broker(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 577

Matlab:Matlab 软件学习之Matlab内置的各种系统的简介、案例应用(基于Simulink模糊控制仿真/二阶瞬态震荡电路案例)之详细攻略

选择左上角要编辑变量的图标,给定当前变量的论域Range,设置隶属函数类型type(八种隶属函数类型以供选择),最后选中某个隶属度函数(选中为红色),移动绘图区的每个隶属度函数的三个端点(竖向为权重)。(1)、首先在模糊规则编辑器左边选择一个输入变量,并选中它的一个语言值(隶属函数),然后编辑器右边选择一个输出变量,并选中它的一个语言值(隶属函数),然后将这种关系添加到模糊规则中。制定完成后,会形成模糊规则矩阵,系统会根据模糊输入量(如r1、r2),经过模糊规则(如45条),进而确定输出量(Y1、Y2)。

走向CTO之路 1123

switch多选择结构与反编译(源码class查看)

switch多选择结构与反编译(源码class查看) 1.switch多选结构 多选择结构还有一个实现的方式就是switch case语句。 switch case语句判断一个变量与一系列值中某个值是否相等,每个值为一个分支。 switch(expression){ case value : //语句 case valua : //语句 break;//可选 //你可以有任意数量的case语句 ...

m0_55112422的博客 190

银河麒麟桌面系统 必会操作 | 加装双系统(麒麟桌面系统+Windows系统)的详细方法(含常见故障和解决方法)

装好麒麟桌面操作系统的电脑上、再加装Windows 操作系统的详细方法;和在已经装好Windows系统的电脑上、再加装麒麟桌面操作系统的详细方法;含加装双系统过程中常见问题的解决方法。

qq_33216613的博客 2419

java switch class_【问题交流】JAVA 基础 switch 执行顺序的问题

Java codepublic class Test_A {public static void main(String[] args) {int i=1, j=0;switch(i) {case 2:j+=6;case 4:j+=1;default:j +=2;case 0:j +=4;}System.out.println("j="+j);}}打印:j=6;问: 进入switch后,程序是怎么...

weixin_30282917的博客 328

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

switch class和extcon

在3.0的内核中switch class位于drivers/switch目录下 在3.4的内核中switch class位于drivers/staging/android/switch目录下 到了3.5内核就把switch class移除掉了,换成了extcon,原因如下: switch class添加switch driver,可以参考switch_gpio.c文件 a. 通过switch

luckywang1103的专栏 3857

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

MUI class="mui-switch" 开关监听

如何对MUI中的switch开关按钮进行监听, 页面代码如下: &lt;form class="mui-input-group"&gt; &lt;ul class="mui-table-view mui-table-view-chevron"&gt; &lt;li class="mui-table-view-cell"&gt; 自动登录 ..

weixin_34128534的博客 1247

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Day13(switch,反编译,查看class文件)

switch多选择结构 多选择结构还有一个实现方式就是switch case 语句。 switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 switch 语句中的变量类型可以是: byte , short , int 或者 char 从Java SE 7 开始 switch 支持字符串 String 类型了 同时 case 标签必须为字符串常量或字面量。 语法: switch(expression){case value: //语句 break;

SuperrWatermelon的博客 359

java switch class_是否可以在java switch / case语句中使用类名?

编译器错误已经说了. case标签必须是常量表达式,类文字和调用getSimpleName()的结果都是常量表达式.一个工作的解决方案是:String tableName = "MyClass1";...switch (tableName) {case "MyClass1":return 1;case "MyClass2":return 2;default:return Integer.MAX_V...

weixin_39732825的博客 984

C++ : switch:switch string的两种用法

C++ : 基础点滴:switch string的两种用法

C++ JAVA的专栏 5375

java 反编译 switch_对于包含switch语句的class文件进行反编译发现的问题

protectedLong doSubmit(ActionForm form)throwsGenericException{OUserForm oForm=(OUserForm)form;int operType =oForm.getOperType();Long userId= null;UserTransaction ut=Trans.getUserTransaction();try{ut.b...

weixin_29353431的博客 254

对于包含switch语句的class文件进行反编译发现的问题

对于有switch语句 反编译的java 文件 需要注意 如果 有switch语句 则重点观察 break 使用情况,检查 case 后 break是否丢失。经过比较DJ Java Decompiler 和Java Decompiler 两个工具 发现Java Decompiler 对于switch语句处理丢失break 语句。所以涉及switch语句的方法综合两个工具得到最后结果,以Jav...

weixin_30532759的博客 197

【Class 22】通过字典dict来实现switch case功能

Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。 dict.get(key, default=None) key -- 字典中要查找的键 default -- 如果指定键的值不存在时,返回该默认值 return -- 返回指定键的值,如果值不在字典中返回默认值None 实例一: 初步实现 # 通过字典映射来实现switch case 功能...

|~~~热爱生活、努力学习的小伙汁~~~| 677

【MUI】HBuilder class="mui-switch"开关监听

转载请注明出处:http://blog.youkuaiyun.com/qq_26525215 本文源自【大学之旅_谙忆的博客】 如何对MUI中的switch开关按钮进行监听, 页面代码如下: form class="mui-input-group"> ul class="mui-table-view mui-table-view-chevron"> li class="mu

谙忆-陈浩翔 9800

jQuery UI 实例 - 切换 Class(Toggle Class)

当动画样式改变时,根据 Class 是否存在以及 switch 参数的值,为匹配的元素集合内的每个元素添加或移除一个或多个 Class。

m0_72763148的博客 502

MUI class="mui-switch"开关 JQuery 控制开关

<div class="mui-switch mui-active"> <div class="mui-switch-handle"></div> </div> mui-active表示开关为打开状态,移除属性mui-active开关就是关闭状态 这种情况出现的解决方法就是将 class属性为mui-switch-handle 的...

weixin_30415801的博客 240
上一篇: switch_gpio
下一篇: 基于Android的Linux内核的电源管理:Early Suspend
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值