驱动:代码实现蜂鸣器和led灯点亮

本文详细介绍了驱动开发中如何通过代码实现蜂鸣器和LED灯的控制。首先从驱动的头文件开始,接着阐述在应用层如何进行操作,为初学者提供了清晰的步骤和实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

驱动

#include <linux/init.h>
#include <linux/module.h>
#include<linux/fs.h>
#include<linux/uaccess.h>
#include<linux/io.h>
#include<linux/device.h>
#include"head.h"

int major;
struct class *cls;
struct device *dev;
//定义一些变量接收映射后的虚拟地址
rcc_t *vir_rcc;
gpio_t *vir_gpiob;
tim2_3_4_5_t *vir_tim4;

unsigned int *virz_rcc;
gpio_t *vir_led1;
gpio_t *vir_led2;
gpio_t *vir_led3;
//主板上的三个灯
gpio_t *vir_led4;
gpio_t *vir_led5;
gpio_t *vir_led6;

char kbuf[128]={0};
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 *off)
{
    int ret; 
    //判断kbuf的大小,如果<size,把size的数值修改为kbuf的大小
    if(size>sizeof(kbuf))
    size=sizeof(kbuf);
    ret=copy_to_user(ubuf,kbuf,size);
    if(ret)
    {
        printk("copy_to_user filed\n");
        return -EIO;//拷贝失败返回错误码
    }
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}
ssize_t  mycdev_write(struct file *file, const char  *ubuf, size_t size, loff_t *off)
{
    int ret;
    if(size>sizeof(kbuf))
    size=sizeof(kbuf);
    ret=copy_from_user(kbuf,ubuf,size);
    if(ret)
    {
        printk("copy_from_user filed\n");
        return -EIO;//拷贝失败返回错误码
    }

    return 0;
}
//ioctl
long mycdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  {
   int temp,ret;
    ret=copy_from_user(&temp,(void *)arg,sizeof(int));
    if(ret)
    {
        printk("copy_from_user err1 \n");
        return -ENOMEM;
    }
    switch(cmd)
    {
        case LED_ON:
        switch(temp)
        {
            case 1://led1
                vir_led1->ODR |=1<<10;
                break;
            case 2:
                vir_led2->ODR |=1<<10;
                break;
            case 3:
                vir_led3->ODR |=1<<8;
                break;
            case 4:
                vir_led4->ODR |=1<<5;
                break;
            case 5:
                vir_led5->ODR 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值