基于Linux内核的驱动开发

1 用字符设备驱动框架和平台设备驱动框架实现led驱动
       1.1   用字符设备驱动框架--》led2
          控制led2闪烁
          1 应用层:
              1  open("/dev/haha0")
              2   
                    while(1)
                     ioctl(fd,LED_ON);
                      sleep(1);
                     ioctl(fd,LED_OFF);
                      sleep(1);
         2 驱动层:
            HelloIoctl(pfile,cmd,arg)
            {
                switch(cmd)
                    case LED_ON:
                        {
                        led_on();--->点灯  内核函数  设备树文件
                        gpio_set_value_cansleep(gpio管脚编号,1)
                        }
                    case LED_OFF:
                        {
                        led_off()
                        gpio_set_value_cansleep(gpio管脚编号,0)
                        }
            }

            1  操作LED--》设备树文件--》增加LED节点--》make dtbs-->新exynos4412-fs4412.dtb
            2  如何操作led硬件地址?使用内核提供的函数
                struct device_node   *p=of_find_node_by_path("/fs4412-led")
                gpio管脚编号=of_get_named_gpio(p,"led",0)
                gpio_set_value_cansleep(gpio管脚编号,val)
               
            
        虚拟机:
            1  修改设备树文件--》添加led2节点--》make dtbs-->exynos4412-fs4412.dtb
            2 cp exynos4412-fs4412.dtb  /tftpboot
            3 修改hello.c-->使用linux3.14下的Makefile编译--》hello.ko
            4 cp  hello.ko   /source4/rootfs
            5 arm-none-linux-gnueabi-gcc -o test test.c
            6 cp test   /source4/rootfs

      开发板:
            1 启动开发板,进入u-boot模式
                修改ipaddr  serverip  gatewayip   bootargs
                setenv bootargs  root=/dev/nfs nfsroot=192.168.2.252:/source4/rootfs  rw console=ttySAC2,115200 init=/linuxrc  ip=192.168.2.101
            2 重启开发板,加载内核 设备树 挂接网络文件系统
            3 root@farsight#insmod hello.ko
                                    dmesg |tail
                                    ./test--->观察led2是否闪烁?

  1.2  平台设备驱动框架(ioremap)-->led2
        ioremap-->内核函数--》内核&驱动
        作用:将物理地址映射到内核虚拟地址
        void __iomem *ioremap(unsigned long paddr, unsigned long size)
            paddr:需要映射的物理地址
            size:需要映射的字节数
            返回值:映射成功后生成内核虚拟地址

         cpu为IO外设提供了两种编址方式:
            第一种:IO映射方式(IO外设独立编址),CPU为外设专门实现了一个单独的
                        地址空间,为IO地址空间,CPU通过专门的IO指令来访问这一地址空间。
            第二种:内存映射方式(IO外设统一编址),RISC系统的CPU通常会对IO外设做
                        统一编址,通常只实现一个物理地址空间,IO外设端口像内存一样被
                        统一编址,CPU可以像访问内存一样访问IO端口。

            static inline void writel(u32 b, volatile void __iomem *addr)
            作用:将数据写入到内核虚拟地址
            b:通过内核虚拟地址向物理地址写入的值
            *addr:指向内核虚拟地址的指针

        static inline unsigned int readl(const volatile void __iomem *addr)
            作用:通过内核虚拟地址读取对应物理地址的值
            *addr:指向内核虚拟地址的指针
            返回值:从内核虚拟地址读到的对应物理地址的值
        
        led2_on()
            writel(1,内核虚拟地址)

         驱动层:
            HelloIoctl(pfile,cmd,arg)
            {
                switch(cmd)
                    case LED_ON:
                        {
                        led_on();--->点灯  内核函数  设备树文件
                        writel(g_buf,1)
                        }
                    case LED_OFF:
                        {
                        led_off()
                        gpio_set_value_cansleep(gpio管脚编号,0)
                        }
            }
    helloprobe(struct platform_device *pdev)-->pdev->resource
                ioremap(pdev->resource[0].start,g_buf)
    2  中断
        定义:是指CPU在执行程序的过程中插入了另外一段程序的执行过程。
         发起中断的方式:1 软中断--》通过软件的方式发起的,是可控的
                            2 硬件中断--》由于硬件故障产生的,不可控的
        系统中断
          功能:按下K2按键 触发中断
        在Linux设备驱动中,要使用中断的设备需要申请中断和释放中断
        request_irq-->给设备请求一个中断
          free_irq-->释放中断
        
         fs4412-key{
                compatible="fs4412,key"
                interrrupt-parent=<&gpx1>
                interrupts=<1 2>
            }
        static inline int __must_check
        request_irq(unsigned int irq57, irq_handler_t handler, unsigned long flags,
        const char *name, void *dev)
        作用:请求中断
         irq:从设备资源中获取到的中断号
        handler:中断处理程序
            typedef irqreturn_t (*irq_handler_t)(int, void *);
        flags:中断属性,可以指定中断的触发方式和处理方式
        *name:请求中断的设备节点名称
        *dev:共享中断的结构体 一般给NULL
        
        void free_irq(unsigned int irq, void *dev_id)
               作用:释放中断
             irq:从设备资源中获取到的中断号
            *dev_id:NULL
        
        platfrom_get_resource(pdev,IOERSOURCE_IRQ,0)-->获取资源
        struct resource *platform_get_resource(struct platform_device *dev,
                       unsigned int type, unsigned int num)
            作用:从平台设备中获取资源
            *dev:指向平台设备的指针
             type:资源类型
            num:资源索引
            返回值:返回得到的资源

    测试步骤:
            虚拟机:
            1 修改设备树文件--》添加fs4412-key节点 --》make dtbs
                cp exynos4412-fs4412.dtb  /tftpboot
            2 编译hello.c-->交叉编译---》hello.ko
            3 cp hello.ko  /source4/rootfs
            开发板:
            1 启动开发板 配置ip相关项 配置bootarg为nfs
            2 重启开发板
                root@farsight#insmod hello.ko
                    手动按下开发板上的k2按键
                root@farsight#dmesg |tail-->查看中断处理函数的打印

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/3411.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文解读:PP-LiteSeg: A Superior Real-Time Semantic Segmentation Model

发表时间&#xff1a;2022 论文地址&#xff1a;https://arxiv.org/abs/2204.02681 项目地址&#xff1a;https://github.com/PaddlePaddle/PaddleSeg PP-LiteSeg&#xff0c;一个新的轻量级实时语义分割任务模型&#xff0c;在分割精度和推理速度之间实现了一种最先进的权衡…

JVM垃圾回收机制

文章目录JVM垃圾回收机制如何确定该对象是垃圾引用计数可达性分析如何释放对象常用策略JVM垃圾回收机制 以对象为单位来进行回收 如何确定该对象是垃圾 Java 中使用 可达性分析方法 Python 中时使用 引用计数方法 引用计数 使用额外的计数器&#xff0c;来记录某个对象有多少个…

【致敬未来的攻城狮计划】连续打卡第4天+物联网操作系统概述

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;https://www.renesas.cn/cn/zh&#xff09; 联合发起的「 致敬未来的攻城狮计划 」的第 4 天&#xff0c;点击查看活动计划详…

【Vue3】用Element Plus实现列表界面

&#x1f3c6;今日学习目标&#xff1a;用Element Plus实现列表界面 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人格言&#xff1a;生如芥子&#xff0c;心藏须弥 ⏰本期期数&#xff1a;第四期 &#x1f389;专栏系列&#xff1a;Vue3 文章目录前言效果图目录简介修改vite…

基于springboot框架实现心理健康心灵治愈交流平台【源码+论文】展示

基于springboot框架实现心灵心理健康 【源码论文】开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Ma…

CSS 7种居中效果实现原理与案例

目录 1.标准盒子居中 2.定位-绝对定位实现居中 3.表格方式实现垂直居中 4.弹性盒子&#xff1a;实现垂直居中 5.通过行高line-height实现垂直居中 6.变形定位实现居中 7.网格实现垂直居中 1.标准盒子居中 不需要设置display&#xff0c;只能实现水平居中 效果&#xff1…

代码随想录算法训练营第五十二天| ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 看完题后的思路 dp[i] [0,i]子数组中,以nums[i]结尾的子序列的长度 dp[i]dp[j]1 j从i-1向0遍历,在所有nums[j]<nums[i]中dp[j]最大 初始化 dp[0]1 代码 class Solution {public int lengthOfLIS(int[] nums) {if (nums.length0){return 0;}int[] dpne…

Gateway服务网关

Spring Cloud Gateway为微服务架构提供一种简单有效的统一的 API 路由管理方式。Gateway网关是所有微服务的统一入口。网关的核心功能特性&#xff1a;请求路由和负载均衡&#xff1a;一切请求都必须先经过gateway&#xff0c;但网关不处理业务&#xff0c;而是根据某种规则&am…

vue3自定义svg图标组件

可参考&#xff1a; 未来必热&#xff1a;SVG Sprites技术介绍 懒人神器&#xff1a;svg-sprite-loader实现自己的Icon组件 在Vue3项目中使用svg-sprite-loader 前置知识 在页面中&#xff0c;虽然可以通过如下的方式使用img标签&#xff0c;来引入svg图标。但是&#xff0c;…

架构的容错性设计

面对程序故障&#xff0c;我们该做些什么 “容错性设计”&#xff08;Design for Failure&#xff09;是微服务的另一个核心原则&#xff0c;也是架构反复强调的开发观念的转变。 流量治理 流量治理所要解决的问题 1.某一个服务的崩溃&#xff0c;会导致所有用到这个服务的…

Unity --- 三维数学 --- Vector类 --- 向量部分

1.注意每一个数字都表示一段有向位移 --- 有方向的距离 1.从尾到头那一段称为向量的模长 --- magnitude (direction对应的是向量的方向) 2.一个向量有大小 -- 模长(magnitude) &#xff0c; 有方向&#xff08;direction&#xff09; 1.向量的模长等于各分量的平方和的平方根…

IO流你了解多少

IO流你了解多少 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公…

国产化大趋势下学习linux的必要性

由于国际上的一些国家的制裁和威胁。最近几年国产化大趋势慢慢的兴起&#xff0c;我们国产化硬件的需求越来越大。对国产操作系统的需求也越来越多&#xff0c;那么我们一直用的Windows系统为什么不用了呢&#xff1f;众所周知的原因&#xff0c;不管是最新的Windows11还是正值…

【Python入门第三十六天】Python丨文件写入

写入已有文件 如需写入已有的文件&#xff0c;必须向 open() 函数添加参数。 “a” - 追加 - 会追加到文件的末尾“w” - 写入 - 会覆盖任何已有的内容 实例 打开文件 “demofile2.txt” 并将内容追加到文件中&#xff1a; f open("demofile2.txt", "a&qu…

主动学习相关论文、代码

文章目录Object Detection2019Learning Loss for Active LearningAn Adaptive Supervision Framework for Active Learning in Object Detection2021Active Learning for Deep Object Detection via Probabilistic ModelingMultiple Instance Active Learning for Object Detec…

STM32数据搬运工DMA

DMA的概念DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路&#xff…

Linux进程概念—环境变量

Linux进程概念—环境变量1.孤儿进程2.环境变量2.1常见环境变量2.2查看环境变量方法2.3在环境变量中添加2.4和环境变量相关的命令2.5环境变量的组织方式2.6命令行参数&#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f68…

五分钟带你了解 计算机操作系统——进程与线程(万字详解·图文)

进程线程可以说是操作系统基础&#xff0c;看过很多关于这方面知识的文章都是纯理论讲述&#xff0c;我准备用图解的形式带你学习和掌握进程、线程。文字力求简单明了&#xff0c;对于复杂概念做到一个概念一张图解&#xff0c;在操作系统课程的学习中&#xff0c;很多人对进程…

HTTP/HTTPS协议认识

写在前面 这个博客我们要要讨论的是协议,主要是应用层.今天我们将正式认识HTTP和HTTPS,也要认识序列化和反序列化,内容比较多,但是不难 再谈协议 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层,我们要完成下面三个步骤. sock的使用 定制…

JAVA Session会话 Thymeleaf - 视图模板技术配置步骤

JAVAWebSession会话会话跟踪技术session保存作用域Thymeleaf - 视图模板技术配置过程Session会话 HTTP是无状态的&#xff1a;服务器无法区分这两个请求是同一个客户端发过来的&#xff0c;还是不同的客户端发过来的 现实问题&#xff1a;第一次请求是添加商品到购物车&#x…