首页 > 编程语言 >led驱动程序进阶-使用面向对象的思想完成led驱动程序

led驱动程序进阶-使用面向对象的思想完成led驱动程序

时间:2024-04-19 16:33:38浏览次数:18  
标签:__ GPIO1 led 驱动程序 int include 进阶

上一篇文章实现了一个led驱动程序的模板,该模板虽然只是用于led驱动程序的编写,但是对于其它任何设备的驱动程序编写,其面向对象的思想都是可以借鉴和参考的。任何看似高深的技巧,都是从简单出发的,逐步深入。独孤九剑的最高境界就是无剑、无招,所有高深的变化都是从最基本的原理出发!
本文基于正点原子的imx6ull开发板实现board.c,led电路原理图和所用的GPIO引脚、配置方法见《led驱动实例》那篇文章

点击查看代码
//board_imx6ull.c

#include "led_orp.h"
#include "asm/memory.h"
#include "asm/uaccess.h"
#include "linux/err.h"
#include "linux/export.h"
#include "linux/kdev_t.h"
#include "linux/printk.h"
#include <linux/module.h>

#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/printk.h>
#include <linux/init.h>
#include <asm/io.h>

static unsigned int *CCM_CCGR1;
static unsigned int *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;
static unsigned int *GPIO1_GDIR;
static unsigned int *GPIO1_DR;

int led_init(unsigned int which)
{
    unsigned int val;
    printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
    /*
    在配置寄存器前先进行地址映射
    */
    if(!CCM_CCGR1 && which == 0)
    {
        CCM_CCGR1 = ioremap(0x20C406C, 4);
        IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 = ioremap(0x20E0068, 4);
        GPIO1_GDIR = ioremap(0X209C004, 4);
        GPIO1_DR = ioremap(0X209C000, 4);
    }

    /*
    使能GPIO1_IO03时钟
    CCGR1[27:26] = b11
    20C_406Ch
    */
    val = *CCM_CCGR1;
    val |= (0x3 << 26);
    *(CCM_CCGR1) = val;

    /*
    配置IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03为GPIO模式
    IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03[3:0] = b0101
    20E_0068h

    IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03暂时不使用,这是配置引脚的模式,比如上升沿,上下拉电阻等
    */
    val = *IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03;
    val &= ~(0xF);  //低四位清零
    val |= (0x5);   //低四位赋值b0101
    *(IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03) = val;

    /*
    配置GPIO1_GDIR寄存器使GPIO1_IO03配置为输出
    GPIO1_GDIR[3] = 1
    209_C004h
    */

    *(GPIO1_DR) |= (0x1 << 3);

    return 1;
}

int led_ctl(unsigned int which, char status)
{
    printk("%s %s line %d\n", __FILE__, __FUNCTION__, __LINE__);
    /*
    根据status修改GPIO1_IO03的输出
    GPIO1_DR
    209_C000h
    */

    if(which == 0)
    {
        if(status)
        {
            *GPIO1_DR &= ~(1 << 3);

            printk("led on\n");
        }
        else {
            *GPIO1_DR |= (1 << 3);
            printk("led off\n");
        }
    }
    return 0;
}

static struct led_operations led_orp = {
    .init = led_init,
    .ctl = led_ctl,
};

struct led_operations* get_led_operations()
{
    return &led_orp;
}

基于上一篇文章中的模板,只需要实现board_imx6ull.c文件即可,其实就是实现led_orp.h头文件中的函数和结构体,从面向对象的角度来解释就是根据所用的开发板imx6ull创建一个led_orp对象,对象名board_imx6ull

标签:__,GPIO1,led,驱动程序,int,include,进阶
From: https://www.cnblogs.com/starstxg/p/18139245

相关文章

  • PVE下面安装Windows2012R2虚拟机的VirtIO驱动程序
    从官网链接下载不同版本的进行测试安装https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/测试结果如下virtio-win-0.1.215-2/2022-01-1305:42正常安装virtio-win-0.1.217-2/2022-05-3104:41安装失败virtio-win-0.1.221-1/2022......
  • stm32例子 串口接受oled屏幕不卡显示
      #include<Arduino.h>#include<U8g2lib.h>#ifdefU8X8_HAVE_HW_SPI#include<SPI.h>#endif#ifdefU8X8_HAVE_HW_I2C#include<Wire.h>#endifU8G2_SSD1306_128X64_NONAME_F_SW_I2Cu8g2(U8G2_R0,/*clock=*/PB6,/*data=*/PB......
  • NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate
    NVIDIA驱动失效简单解决方案:NVIDIA-SMIhasfailedbecauseitcouldn‘tcommunicatewiththeNVIDIAdriver.问题:准备用GPU跑模型时,提示cuda不存在第一步,打开终端,输入:vidia-smi1|NVIDIA-SMIhasfailedbecauseitcouldn'tcommunicatewiththeNVIDIAdriver.2|Make......
  • 【Azure 环境】在Azure中为数据启用强制保留期 mandatoryRetentionPeriodEnabled
    问题描述mandatoryRetentionPeriodEnabled 是Azure数据库的一个设置,用于启用或禁用强制保留期。这是一种数据保护措施,确保在指定的保留期内,数据不能被删除或修改。这个设置是为了满足某些行业或应用场景下的合规性需求,比如金融、医疗、政府等场景中,可能需要保留一段时间的数据......
  • net8 linux docker sqlserver报错error: 31 - Encryption(ssl/tls) handshake failed)
    asp.netcore升级到8.0后遇到数据库不能连接问题?_已解决_博问_博客园(cnblogs.com) 中文提示:连接数据库过程中发生错误,检查服务器是否正常连接字符串是否正确,错误信息:Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthep......
  • NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL)、新一代数据集BIRD
    NL2SQL进阶系列(5):论文解读业界前沿方案(DIN-SQL、C3-SQL、DAIL-SQL)、新一代数据集BIRD-SQL解读NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(SpidervsBIRD)全面对比优劣分析[Text2SQL、Text2DSL]NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技......
  • 【布局进阶】巧用 :has & drop-shadow 实现复杂布局效果
    最近,群里聊到了一个很有意思的布局效果。大致效果如下所示,希望使用CSS实现如下所示的布局效果:正常而言,我们的HTML结构大致是如下所示:<divclass="g-container"><divclass="g-nav"><ul><li>Tab1</li><li>Tab2</li>......
  • Failed to resolve loader: sass-loader
    错误现象:原因是工程里缺少sass-loader和node-sass依赖,需要安装。sass-loader的作用:>https://www.sass.hk/docs/#google_vignetteSass是一款强化CSS的辅助工具,它在CSS语法的基础上增加了变量(variables)、嵌套(nestedrules)、混合(mixins)、导入(inlineimports)......
  • vscode remote-x11 ssh 连接时Another All configured authentication methods failed
    错误remote-x11-ssh插件使用ssh2扩展出现以下错误https://github.com/joelspadin/vscode-remote-x11/issues/75Error:Allconfiguredauthenticationmethodsfailed原因https://github.com/mscdex/ssh2/issues/989解决换成ed25519并修改配置......
  • MIT 6.5830 simpleDB Lab1
    Exercise1需要完成的代码有:src/java/simpledb/storage/TupleDesc.javasrc/java/simpledb/storage/Tuple.javaTuple是simpleDB的元组,由多个Field(字段)组成,TupleDesc负责描述Tuple中各个Field对应的schema。Tuple.java代码:packagesimpledb.storage;importjava.io.Serial......