国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【驅(qū)動(dòng)開(kāi)發(fā)day2作業(yè)】

這篇具有很好參考價(jià)值的文章主要介紹了【驅(qū)動(dòng)開(kāi)發(fā)day2作業(yè)】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【驅(qū)動(dòng)開(kāi)發(fā)day2作業(yè)】,驅(qū)動(dòng)開(kāi)發(fā)

head.h

#ifndef __HEAD_H__
#define __HEAD_H__ 
typedef struct{
    unsigned int MODER;
    unsigned int OTYPER;
    unsigned int OSPEEDR;
    unsigned int PUPDR;
    unsigned int IDR;
    unsigned int ODR;
}gpio_t;
#define PHY_LED1_ADDR 0X50006000
#define PHY_LED2_ADDR    0X50007000
#define PHY_LED3_ADDR 0X50006000
#define PHY_RCC_ADDR    0X50000A28
#endif 

mychrdev.c

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

int major;
char kbuf[128]={0};
gpio_t *vir_led1;
gpio_t *vir_led2;
gpio_t *vir_led3;
unsigned int *vir_rcc;
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__);
     unsigned long ret;
    //向用戶空間讀取拷貝
    if(size>sizeof(kbuf))//用戶空間期待讀取的大小內(nèi)核滿足不了,那就給內(nèi)核支持的最大大小
        size=sizeof(kbuf);
    ret=copy_to_user(ubuf,kbuf,size);
    if(ret)//拷貝失敗
    {
        printk("copy_to_user filed\n");
        return ret;
    }
    return 0;
}
ssize_t mycdev_write(struct file *file, const char  *ubuf, size_t size, loff_t *lof)
{
    unsigned long ret;
    //從用戶空間讀取數(shù)據(jù)
    if(size>sizeof(kbuf))//用戶空間期待讀取的大小內(nèi)核滿足不了,那就給內(nèi)核支持的最大大小
        size=sizeof(kbuf);
    ret=copy_from_user(kbuf,ubuf,size);
    if(ret)//拷貝失敗
    {
        printk("copy_to_user filed\n");
        return ret;
    }
    switch(kbuf[0]){
        case '1'://LED1
            if(kbuf[1]=='0')//關(guān)燈
                vir_led1->ODR &= (~(1<<10));
            else//開(kāi)燈
                vir_led1->ODR |= 1<<10;
            break;
        case '2'://LED2
            if(kbuf[1]=='0')//關(guān)燈
                vir_led2->ODR &= (~(1<<10));
            else//開(kāi)燈
                vir_led2->ODR |= 1<<10;
            break;
        case '3'://LED3
            if(kbuf[1]=='0')//關(guān)燈
                vir_led3->ODR &= (~(1<<8));
            else//開(kāi)燈
                vir_led3->ODR |= 1<<8;
            break;
    }
    return 0;
}
int mycdev_close(struct inode *inode, struct file *file)
{
    printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);
    return 0;
}

//定義操作方法結(jié)構(gòu)體變量并賦值
struct file_operations fops={

    .open=mycdev_open,
    .read=mycdev_read,
    .write=mycdev_write,
    .release=mycdev_close,
};

int all_led_init(void)
{
    //寄存器地址的映射
    vir_led1=ioremap(PHY_LED1_ADDR,sizeof(gpio_t));
    if(vir_led1==NULL)
    {
        printk("ioremap filed:%d\n",__LINE__);
        return -ENOMEM;
    }
     vir_led2=ioremap(PHY_LED2_ADDR,sizeof(gpio_t));
    if(vir_led2==NULL)
    {
        printk("ioremap filed:%d\n",__LINE__);
        return -ENOMEM;
    }
     vir_led3=vir_led1;
    vir_rcc=ioremap(PHY_RCC_ADDR,4);
    if(vir_rcc==NULL)
    {
        printk("ioremap filed:%d\n",__LINE__);
        return -ENOMEM;
    }
    printk("物理地址映射成功\n");
    //寄存器的初始化
    //rcc
    (*vir_rcc) |= (3<<4);
    //led1
    vir_led1->MODER &= (~(3<<20));
    vir_led1->MODER |= (1<<20);
    vir_led1->ODR &= (~(1<<10));
    //led2
    vir_led2->MODER &= (~(3<<20));
    vir_led2->MODER |= (1<<20);
    vir_led2->ODR &= (~(1<<10));
    //led3
    vir_led3->MODER &= (~(3<<16));
    vir_led1->MODER |= (1<<16);
    vir_led1->ODR &= (~(1<<8));
    printk("寄存器初始化成功\n");

    return 0;
}

static int __init mycdev_init(void)
{
    //字符設(shè)備驅(qū)動(dòng)注冊(cè)
    major=register_chrdev(0,"mychrdev",&fops);
    if(major<0)
    {
        printk("字符設(shè)備驅(qū)動(dòng)注冊(cè)失敗\n");
        return major;
    }
    printk("字符設(shè)備驅(qū)動(dòng)注冊(cè)成功:major=%d\n",major);
    //寄存器映射以及初始化
    all_led_init();

    return 0;
}
static void __exit mycdev_exit(void)
{
    //取消地址映射
    iounmap(vir_led1);
    iounmap(vir_led2);
    iounmap(vir_rcc);
    //注銷字符設(shè)備驅(qū)動(dòng)
    unregister_chrdev(major,"mychrdev");


}
module_init(mycdev_init);
module_exit(mycdev_exit);
MODULE_LICENSE("GPL");

led.c文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-606499.html

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


int main(int argc, char const *argv[])
{
    char buf[128]={0};
    int fd=open("/dev/mychrdev",O_RDWR);
    if(fd<0)
    {
        printf("打開(kāi)設(shè)備文件失敗\n");
        exit(-1);
    }
    while(1)
    {
        //從終端讀取
        printf("請(qǐng)輸入兩個(gè)字符\n");
        printf("第一個(gè)字符:1(LED1) 2(LED2) 3(LED3)\n");
        printf("第二個(gè)字符:0(關(guān)燈) 1(開(kāi)燈)\n");
        printf("請(qǐng)輸入>");
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf)-1]='\0';
        //向設(shè)備文件中寫
        write(fd,buf,sizeof(buf));
    }

    
    close(fd);

    return 0;
}

到了這里,關(guān)于【驅(qū)動(dòng)開(kāi)發(fā)day2作業(yè)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【驅(qū)動(dòng)開(kāi)發(fā)day4作業(yè)】

    【驅(qū)動(dòng)開(kāi)發(fā)day4作業(yè)】

    頭文件代碼 ?應(yīng)用層代碼 ?驅(qū)動(dòng)代碼

    2024年02月15日
    瀏覽(19)
  • QT DAY2 作業(yè)

    QT DAY2 作業(yè)

    1. ?頭文件 main.cpp mywidget.cpp 效果圖 2 2.思維導(dǎo)圖 ?

    2024年01月21日
    瀏覽(21)
  • IO進(jìn)程線程作業(yè)day2

    IO進(jìn)程線程作業(yè)day2

    使用fread和fwrite完成兩個(gè)圖片文件的拷貝 現(xiàn)象展示:? 使用read、write完成兩個(gè)圖片文件的拷貝 效果圖 ? 3 將時(shí)間在文件中跑起來(lái) 1、17:30:41 2、17:30:42 3、17:30:43 鍵入ctrl+c,結(jié)束進(jìn)程后 ... 4、17:35:28 5、17:35:29 效果圖: ?思維導(dǎo)圖

    2024年02月19日
    瀏覽(25)
  • 爬蟲day2 正則表達(dá)式作業(yè)

    利用正則表達(dá)式完成下面的操作: 一、不定項(xiàng)選擇題 能夠完全匹配字符串\\\"(010)-62661617\\\"和字符串\\\"01062661617\\\"的正則表達(dá)式包括(ABD) A. r\\\"(?d{3})?-?d{8}\\\" B. r\\\"[0-9()-]+\\\" 中括號(hào)里面的字符出現(xiàn)任意次 C. r\\\"[0-9(-)]*d*\\\" (-) 表示(到)的所有字符 D. r\\\"[(]?d*[)-]*d*\\\" [(]就是一個(gè)(; [)-]是)- 能夠

    2023年04月08日
    瀏覽(24)
  • L16物聯(lián)網(wǎng)ARM開(kāi)發(fā)--開(kāi)發(fā)環(huán)境搭建及平臺(tái)及GPIO口操作平臺(tái)介紹(day2、3)

    L16物聯(lián)網(wǎng)ARM開(kāi)發(fā)--開(kāi)發(fā)環(huán)境搭建及平臺(tái)及GPIO口操作平臺(tái)介紹(day2、3)

    目錄 一、MDK-ARM環(huán)境介紹及安裝 二、STM32Cube簡(jiǎn)介及安裝 ??STM32CubeMX安裝 加載固件庫(kù) ?編輯 ?三、 STM32F0存儲(chǔ)器映射 四、STM32啟動(dòng)文件分析 略 五、GPIO的基本概念及寄存器介紹1 1、GPIO接口簡(jiǎn)介 ?2、GPIO功能復(fù)用 ?3、GPIO寄存器介紹 ?GPIO工作原理框圖: 五、點(diǎn)亮LED寄存器版(

    2024年02月01日
    瀏覽(26)
  • 6.22 驅(qū)動(dòng)開(kāi)發(fā)作業(yè)

    6.22 驅(qū)動(dòng)開(kāi)發(fā)作業(yè)

    字符設(shè)備驅(qū)動(dòng)的內(nèi)部實(shí)現(xiàn)有兩種情況: 情況1.應(yīng)用層調(diào)用open函數(shù)的內(nèi)部實(shí)現(xiàn): open函數(shù)的第一個(gè)參數(shù)是要打開(kāi)的文件的路徑,根據(jù)這個(gè)路徑 虛擬文件系統(tǒng)層VFS 可以找到這個(gè)文件在文件系統(tǒng)中唯一的標(biāo)識(shí),也就是inode號(hào),通過(guò)inode號(hào)作為索引可以找到儲(chǔ)存在內(nèi)核中的struct inode結(jié)

    2024年02月11日
    瀏覽(16)
  • 驅(qū)動(dòng)開(kāi)發(fā) 作業(yè)5

    使用驅(qū)動(dòng)代碼實(shí)現(xiàn)如下要求: 使用驅(qū)動(dòng)通過(guò)阻塞 io 模型讀取 number 變量的值 number 是內(nèi)核驅(qū)動(dòng)中的一個(gè)變量 number 的值隨著按鍵按下而改變(按鍵中斷) 例如 number = 0 按下按鍵 number = 1,再次按下按鍵 number = 0 在按下按鍵的時(shí)候需要同時(shí)將 led1 的狀態(tài)取反 驅(qū)動(dòng)中需要編寫字符

    2024年02月16日
    瀏覽(17)
  • 驅(qū)動(dòng)開(kāi)發(fā) 作業(yè)3

    編寫LED燈的驅(qū)動(dòng),創(chuàng)建三個(gè)設(shè)備文件,每個(gè)設(shè)備文件和一個(gè)LED燈綁定,當(dāng)操作這個(gè)設(shè)備文件時(shí)只能控制設(shè)備文件對(duì)應(yīng)的這盞燈。 完整目錄,查看這個(gè)倉(cāng)庫(kù) 注冊(cè)設(shè)備驅(qū)動(dòng)對(duì)象 cdev_add 也需要對(duì)三個(gè) LED 分別添加,否則 LED2 和 LED3 的設(shè)備文件雖然生成,但是無(wú)法被用戶空間打開(kāi)

    2024年02月13日
    瀏覽(16)
  • 驅(qū)動(dòng)開(kāi)發(fā) 作業(yè)1

    下面代碼中的 gpio.h 和 rcc.h 是 led 項(xiàng)目中的 common/include 目錄下的 stm32mp1xx_gpio.h 和 stm32mp1xx_rcc.h 所以不貼代碼了,完整的目錄查看這個(gè)倉(cāng)庫(kù) 這里直接把 GPIOE / GPIOF , RCC 結(jié)構(gòu)體的地址映射到虛擬地址中 用戶空間應(yīng)用程序的代碼沒(méi)有修改,也不貼上來(lái)了,輸入 1,2,3 分別對(duì)應(yīng)開(kāi)

    2024年02月13日
    瀏覽(22)
  • 驅(qū)動(dòng)開(kāi)發(fā)作業(yè)2

    驅(qū)動(dòng)開(kāi)發(fā)作業(yè)2

    LED.H MYCDEV.C TEST.C

    2024年02月11日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包