驱动 led亮灭

这篇具有很好参考价值的文章主要介绍了驱动 led亮灭。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

led.c

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main(int argc,char const *argv)
{
    char buf[128] = {0};
    int fd = open("/dev/mychrdev",O_RDWR);
    if(fd < 0)
    {
        printf("打开设备文件失败\n");
        exit(-1);
    }

    while(1)
    {
        printf("请输入选择哪一个灯泡 1 2 3\n");
        fgets(buf,sizeof(buf),stdin);
        printf("请输入亮灭 0 灭 1 亮\n");
        fgets(buf+1,sizeof(buf),stdin);
        buf[strlen(buf)-1]='\0';
        write(fd,buf,sizeof(buf));
    }
    close(fd);
    return 0;
}

mychrdev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/io.h>
#include "led.h"

unsigned int major;
char kbuf[128] = {0};
unsigned int *vir_led1_moder;
unsigned int *vir_led1_odr;
unsigned int *vir_rcc;

unsigned int *vir_led2_moder;
unsigned int *vir_led2_odr;

unsigned int *vir_led3_moder;
unsigned int *vir_led3_odr;

int mycdev_open(struct inode *inode,struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}

ssize_t mycdev_read(struct file *file,char *ubuf,size_t size,loff_t *lof)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    long ret;
    ret=copy_to_user(ubuf,kbuf,size);
    if(ret)
    {
        printk("copy_to_user failed\n");
        return -EIO;
    }
    return 0;
}


ssize_t mycdev_write(struct file *file,const char *ubuf,size_t size,loff_t *lof)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    long ret;
    ret=copy_from_user(kbuf,ubuf,size);
    if(ret)
    {
        printk("copy_from_user failed\n");
        return -EIO;
    }
    switch(kbuf[0])
    {
        case '1':
            if(kbuf[1] == '0')
            {
                (*vir_led1_odr) &= (~(0x1 << 10));
            }
            else if(kbuf[1] == '1')
            {
                (*vir_led1_odr) |= (0x1 << 10);
            }
            break;
        case '2':
            if(kbuf[1] == '0')
            {
                (*vir_led2_odr) &= (~(0x1 << 10));
            }
            else if(kbuf[1] == '1')
            {
                (*vir_led2_odr) |= (0x1 << 10);
            }
            break;
        case '3':
            if(kbuf[1] == '0')
            {
                (*vir_led1_odr) &= (~(0x1 << 8));
            }
            else if(kbuf[1] == '1')
            {
                (*vir_led1_odr) |= (0x1 << 8);
            }
            break;
    }
    return 0;
}


int mycdev_close(struct inode *inode,struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}


//定义操作方法结构体变量
struct file_operations fops={
    .open=mycdev_open,
    .read=mycdev_read,
    .write=mycdev_write,
    .release=mycdev_close,
};

//入口函数,里面主要进行资源的申请和注册
static int __init mycdev_init(void)
{
    printk(KERN_ERR "入口函数\n");
    major=register_chrdev(0,"mychrdev",&fops);
    if(major<0)
    {
        printk("注册字符设备驱动失败\n");
        return major;
    }
    printk("字符设备注册成功\n");

    //地址映射
    vir_led1_moder=ioremap(PHY_LED1_MODER,4);
    if(vir_led1_moder==NULL)
    {
        printk("映射物理地址失败%d\n",__LINE__);
        return -EFAULT;
    }
    vir_led2_moder=ioremap(PHY_LED2_MODER,4);
    if(vir_led2_moder==NULL)
    {
        printk("映射物理地址失败%d\n",__LINE__);
        return -EFAULT;
    }

    vir_led1_odr=ioremap(PHY_LED1_ODR,4);
    if(vir_led1_odr==NULL)
    {
        printk("映射物理地址失败%d\n",__LINE__);
         return -EFAULT;
    }

    vir_led2_odr=ioremap(PHY_LED2_ODR,4);
    if(vir_led2_odr==NULL)
    {
        printk("映射物理地址失败%d\n",__LINE__);
         return -EFAULT;
    }

    vir_led3_moder = vir_led1_moder;
    vir_led3_odr = vir_led1_odr;

    vir_rcc=ioremap(PHY_RCC,4);
    if(vir_rcc==NULL)
    {
        printk("映射物理地址失败%d\n",__LINE__);
         return -EFAULT;
    }

    //硬件初始化
    (*vir_rcc)|=(0x3 << 4);
    (*vir_led1_moder) &= (~(0x3 << 20));
    (*vir_led1_moder) |= (0x1 << 20);

    (*vir_led3_moder) &= (~(0x3 << 16));
    (*vir_led3_moder) |= (0x1 << 16);

    (*vir_led2_moder) &= (~(0x3 << 20));
    (*vir_led2_moder) |= (0x1 << 20);

    (*vir_led1_odr) &= (~(0x1 << 10));
    (*vir_led3_odr) &= (~(0x1 << 8));
    (*vir_led2_odr) &= (~(0x1 << 10));
    printk("映射物理地址成功");
    return 0;//返回值一定要加,除非函数类型是void
}   

//出口函数,主要进行资源的释放和注销
static void __exit mycdev_exit(void)
{
    printk("出口函数\n");
    unregister_chrdev(major,"mychrdev");
    //__exit          __section(".exit.text")
    //用于声明mycdev_exit在.exit.text段
}
//用于向内核报备当前内核模块入口函数的地址
module_init(mycdev_init);
//用于向内核报备当前内核模块出口函数的地址            
module_exit(mycdev_exit);
//声明当前内核模块遵循GPL协议
MODULE_LICENSE("GPL");

led.h文章来源地址https://www.toymoban.com/news/detail-603148.html

#ifndef __HEAD_H__
#define __HEAD_H__

#define PHY_LED1_MODER 0x50006000
#define PHY_LED1_ODR 0x50006014
#define PHY_RCC 0x50000A28

#define PHY_LED2_MODER 0x50007000
#define PHY_LED2_ODR 0x50007014

#define PHY_LED3_MODER 0x50006000
#define PHY_LED3_ODR 0x50006014

#endif

到了这里,关于驱动 led亮灭的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 驱动开发 day8 (设备树驱动,按键中断实现led亮灭)

    //编译驱动  (注意Makefile的编译到移植到开发板的内核)         make arch=arm //清除编译生成文件         make clean ****************************************** //安装驱动         insmod mycdev.ko //卸载驱动         rmmod mycdev   需要在内核路径/arch/arm/boot/dts/  修改 stm32mp157a-fsmp1a-dts 文件 *

    2024年02月14日
    浏览(42)
  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(67)
  • [驱动开发]gpio子系统及中断实现led亮灭

    编写LED灯的驱动,使用GPIO子系统,里面添加按键的中断处理 1.应用程序发送指令控制发光二极管亮灭 2.按键1按下,led1电位反转;按键2按下,led2电位反转;按键3按下,led3电位反转   

    2024年02月14日
    浏览(78)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(82)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(98)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(94)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(55)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(58)
  • 服务器,Linux,centos7成功安装显卡驱动(超详细)

    在某些情况下我们可能会遇到重装服务器显卡驱动的需求,比如重装操作系统之后需要安装一个显卡驱动,旧版的显卡驱动需要升级,需要换一个显卡驱动等等。 如果你需要重装服务器操作系统,请戳这里: 服务器重装centos7系统 https://blog.csdn.net/qq_51570094/article/details/124133

    2024年01月23日
    浏览(56)
  • 在windows系统中映射网络驱动器时,如何通过非455端口远程访问Linux服务器的Samba服务

    通常情况下,在windows中通过Linux服务器的Samba服务去映射网络驱动器时候,一般默认就是直接填入内网Linux服务器ip即可,它会默认445端口。 若是我的windows并不和Linux服务器在一个网段时,该如何操作呢? 是 pid 为 4 的进程进行监听。 右键 电脑–管理–服务和应用程序–服务

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包