22071驱动day3

#ifndef __LED_H__

#define __LED_H__

typedef struct{

    volatile unsigned int MODER;

    volatile unsigned int OTYPER;

    volatile unsigned int OSPEEDR;

    volatile unsigned int PUPDR;

    volatile unsigned int IDR;

    volatile unsigned int ODR;

}gpio_t;

#define GPIOE 0x50006000

#define GPIOF 0x50007000

#define PHY_RCC   0x50000A28

#endif

#include <linux/init.h>

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/uaccess.h>

#include <linux/io.h>

#include "led.h"

#define CNAME "myled"

int major;

char kbuf[128]={0};

volatile unsigned int* virt_rcc;

gpio_t* led1;

gpio_t* led2;

gpio_t* led3;

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 __user *ubuf, size_t size, loff_t *loffs)

{

    int ret;

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    if(size>sizeof(kbuf)) size=sizeof(kbuf);

    ret=copy_to_user(ubuf,kbuf,size);

    if(ret)

    {

        printk("copy to user is error\n");

        return -EIO;

    }

    return size;

}

ssize_t mycdev_write(struct file *file, const char __user *ubuf, size_t size, loff_t *loffs)

{

    int ret;

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    if(size>sizeof(kbuf)) size=sizeof(kbuf);

    ret=copy_from_user(kbuf,ubuf,size);

    if(ret)

    {

        printk("copy from user is error\n");

        return -EIO;

    }

    printk("copy from user kbuf=%s\n",kbuf);

    if(kbuf[0]=='1')

    {

        if(kbuf[1]=='1')

        {

            led1->ODR |=(0x1<<10);

        }

        else if(kbuf[1]=='0')

        {

            led1->ODR &=(~(0x1<<10));

        }

    }

    else if(kbuf[0]=='2')

    {

        if(kbuf[1]=='1')

        {

            led2->ODR |=(0x1<<10);

        }

        else if(kbuf[1]=='0')

        {

            led2->ODR &=(~(0x1<<10));

        }

    }

    else if(kbuf[0]=='3')

    {

        if(kbuf[1]=='1')

        {

            led3->ODR |=(0x1<<8);

        }

        else if(kbuf[1]=='0')

        {

            led3->ODR &=(~(0x1<<8));

        }

    }

    return size;

}

int  mycdev_close(struct inode *inode, struct file *file)

{

    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);

    return 0;

}

const struct file_operations fops={

    .open=mycdev_open,

    .read=mycdev_read,

    .write=mycdev_write,

    .release=mycdev_close,

};

static int __init mycdev_init(void)

{

    major=register_chrdev(0,CNAME,&fops);

    if(major<0)

    {

        printk("register chrdev is error\n");

        return major;

    }

    printk("major=%d\n",major);

    virt_rcc=ioremap(PHY_RCC,4);

    if(NULL==virt_rcc)

    {

        printk("rcc ioremap is error\n");

        return -ENOMEM;

    }

    led1 = ioremap(GPIOE,sizeof(gpio_t));

    if(NULL == led1)

    {

        printk("gpio moder ioremap is error\n");

        return -ENOMEM;

    }

     led2 = ioremap(GPIOF,sizeof(gpio_t));

    if(NULL == led2)

    {

        printk("gpio moder ioremap is error\n");

        return -ENOMEM;

    }

    led3 = ioremap(GPIOE,sizeof(gpio_t));

    if(NULL == led3)

    {

        printk("gpio moder ioremap is error\n");

        return -ENOMEM;

    }

    //引脚初始化

    *virt_rcc |= (0x3 << 4);

    //led1

    led1->MODER &= (~(0x3 << 20));

    led1->MODER |= (0x1 << 20);

    led1->ODR &= (~(0x1 << 10));

     //led2

    led2->MODER &= (~(0x3 << 20));

    led2->MODER |= (0x1 << 20);

    led2->ODR &= (~(0x1 << 10));

     //led3

    led3->MODER &= (~(0x3 << 16));

    led3->MODER |= (0x1 << 16);

    led3->IDR &= (~(0x1 << 8));

    return 0;

}

static void __exit mycdev_exit(void)

{

    unregister_chrdev(major,CNAME);

    iounmap(virt_rcc);

    iounmap(led1);

    iounmap(led2);

    iounmap(led3);

    //iounmap(virt_gpioF_odr);

}

module_init(mycdev_init);

module_exit(mycdev_exit);

MODULE_LICENSE("GPL");

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

char buf[128]={""};

int main(int argc,char const *argv[])

{

    int fd=-1;

    fd=open("/dev/myled",O_RDWR);

    if(-1==fd)

    {

        perror("open is error");

        exit(1);

    }

   

    while(1)

    {

        buf[0]='1';

        write(fd,buf,sizeof(buf));

        buf[1]='1';

        write(fd,buf,sizeof(buf));

        sleep(1);

        buf[1] ='0';

        write(fd,buf,sizeof(buf));

        sleep(1);

        buf[0]='2';

        write(fd,buf,sizeof(buf));

        buf[1]='1';

        write(fd,buf,sizeof(buf));

        sleep(1);

        buf[1] ='0';

        write(fd,buf,sizeof(buf));

        sleep(1);

        buf[0]='3';

        write(fd,buf,sizeof(buf));

        buf[1]='1';

        write(fd,buf,sizeof(buf));

        sleep(1);

        buf[1] ='0';

        write(fd,buf,sizeof(buf));

        sleep(1);

    }

    close(fd);

    return 0;

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值