国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

迅為瑞芯微RK3568開發板編寫LED驅動

發布時間:2022-5-27 09:41    發布者:就是塔塔

我們在 ubuntu home/nfs/07 目錄下新建 led.c 文件,可以在上次實驗的驅動代碼基礎上進行修改,以
下代碼為完整的驅動代碼。
我們已經學會了雜項設備驅動編寫的基本流程,其實需求已經完成了一半了,我們已經注冊了雜項設
備,并生成了設備節點。接下來我們要完成控制 BEEP 的邏輯操作,那么控制 BEEP 就涉及到了對寄存器的
操作,但是對寄存器的操作我們是不能直接訪問的,因為 linux 不能直接訪問我們的物理地址,需要把物理
地址先映射成虛擬地址,我們完成這一步轉換需要用到 ioremap 函數。
完整的驅動文件如下所示:
/*
* @Descripttion: 基于雜項設備的 LED 驅動
* @version:
* @Author:
* @Date: 2021-02-23 13:54:49
*/
#include
//初始化頭文件
#include
//最基本的文件,支持動態添加和卸載模塊。
#include //包含了 miscdevice 結構的定義及相關的操作函數。
#include
//文件系統頭文件,定義文件表結構(file,buffer_head,m_inode 等)
#include
//包含了 copy_to_user、copy_from_user 等內核訪問用戶進程內存地址的函
數定義。
#include
//包含了 ioremap、iowrite 等內核訪問 IO 內存等函數的定義。
#include
//驅動要寫入內核,與內核相關的頭文件
#define GPIO_DR 0xfdd60000 //LED 物理地址,通過查看原理圖得知
unsigned int *vir_gpio_dr; //存放映射完的虛擬地址的首地址
/**
* @name: misc_read
* @test: 從設備中讀取數據,當用戶層調用函數 read 時,對應的,內核驅動就會調用這個函數。
* @msg:
* @param {structfile} *file file 結構體
* @param {char__user} *ubuf 這是對應用戶層的 read 函數的第二個參數 void *buf
* @param {size_t} size 對應應用層的 read 函數的第三個參數
* @param {loff_t} *loff_t 這是用于存放文件的偏移量的,回想一下系統編程時,讀寫文件的操作都會使
偏移量往后移。
* @return {*} 當返回正數時,內核會把值傳給應用程序的返回值。一般的,調用成功會返回成功讀取
的字節數。
如果返回負數,內核就會認為這是錯誤,應用程序返回-1
*/
ssize_t misc_read (struct file *file, char __user *ubuf, size_t size, loff_t *loff_t)
{
printk("misc_read\n ");
return 0;
}
/**
* @name: misc_write
* @test: 往設備寫入數據,當用戶層調用函數 write 時,對應的,內核驅動就會調用這個函數。
* @msg:
* @param {structfile} * filefile 結構體
* @param {constchar__user} *ubuf 這是對應用戶層的 write 函數的第二個參數 const void *buf
* @param {size_t} size 對應用戶層的 write 函數的第三個參數 count。
* @param {loff_t} *loff_t 這是用于存放文件的偏移量的,回想一下系統編程時,讀寫文件的操作都會使
偏移量往后移。
* @return {*} 當返回正數時,內核會把值傳給應用程序的返回值。一般的,調用成功會返回成功讀取
的字節數。
如果返回負數,內核就會認為這是錯誤,應用程序返回-1。
*/
ssize_t misc_write (struct file *file, const char __user *ubuf, size_t size, loff_t *loff_t)
{
/*應用程序傳入數據到內核空間,然后控制蜂鳴器的邏輯,在此添加*/
// kbuf 保存的是從應用層讀取到的數據
char kbuf[64] = {0};
// copy_from_user 從應用層傳遞數據給內核層
if(copy_from_user(kbuf,ubuf,size)!= 0)
{
// copy_from_user 傳遞失敗打印
printk("copy_from_user error \n ");
return -1;
}
//打印傳遞進內核的數據
printk("kbuf is %d\n ",kbuf[0]);
if(kbuf[0]==1) //傳入數據為 1 ,LED 亮
{
*vir_gpio_dr = 0x80008000;
}
else if(kbuf[0]==0) //傳入數據為 0,LED 滅
*vir_gpio_dr = 0x80000000;
return 0;
}
/**
* @name: misc_release
* @test: 當設備文件被關閉時內核會調用這個操作,當然這也可以不實現,函數默認為 NULL。關閉設
備永遠成功。
* @msg:
* @param {structinode} *inode 設備節點
* @param {structfile} *file filefile 結構體
* @return {0}
*/
int misc_release(struct inode *inode,struct file *file){
printk("hello misc_relaease bye bye \n ");
return 0;
}
/**
* @name: misc_open
* @test: 在操作設備前必須先調用 open 函數打開文件,可以干一些需要的初始化操作。
* @msg:
* @param {structinode} *inode 設備節點
* @param {structfile} *file filefile 結構體
* @return {0}
*/
int misc_open(struct inode *inode,struct file *file){
printk("hello misc_open\n ");
return 0;
}
//文件操作集
struct file_operations misc_fops={
.owner = THIS_MODULE,
.open = misc_open,
.release = misc_release,
.read = misc_read,
.write = misc_write,
};
//miscdevice 結構體
struct miscdevice misc_dev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "hello_misc",
.fops = &misc_fops,
};
static int misc_init(void)
{
int ret;
//注冊雜項設備
ret = misc_register(&misc_dev);
if(ret<0)
{
printk("misc registe is error \n");
}
printk("misc registe is succeed \n");
//將物理地址轉化為虛擬地址
vir_gpio_dr = ioremap(GPIO_DR,4);
if(vir_gpio_dr == NULL)
{
printk("GPIO_DR ioremap is error \n");
return EBUSY;
}
printk("GPIO_DR ioremap is ok \n");
return 0;
}
static void misc_exit(void){
//卸載雜項設備
misc_deregister(&misc_dev);
iounmap(vir_gpio_dr);
printk(" misc gooodbye! \n");
}
module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
更多內容請關注:北京迅為




本文地址:http://m.qingdxww.cn/thread-791446-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉USB橋接器以及基于CAN的主機和自舉程序應用程序
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 污污网站免费观看 | 成人毛片免费看 | 亚欧成人毛片一区二区三区四区 | www.日韩在线观看 | 国产日韩精品一区在线观看播放 | 日韩精品视频网站 | 91网站网址最新 | 美女又黄又免费的视频 | 精品在线观看一区 | 久久精品视频大全 | 久久九九99热这里只有精品 | 天然素人在线观看 | 91精品在线观看视频 | 国产亚洲精品日韩香蕉网 | 青青草亚洲 | 色天天综合色天天碰 | 韩日一级毛片 | 一级毛片在线看在线播放 | 精品在线视频播放 | 成品人app软件大全免费下载 | 国产满18av精品免费观看视频 | 香蕉久久夜色精品国产2020 | 羞羞视频免费网站com | 日韩国产欧美在线观看一区二区 | 韩国毛片一级 | 亚洲 欧美 卡通 在线 另类 | 成人国产激情福利久久精品 | 四虎最新地址 | 午夜精品一区二区三区免费视频 | 不卡一区二区在线 | 日韩欧美亚洲国产 | 久草视频资源在线观看 | 两个人免费观看高清在线 | 向日葵视频免费在线观看 | 亚洲欧美日韩在线线精品 | 日韩欧美视频一区二区在线观看 | 国产日韩高清一区二区三区 | 亚洲欧洲小视频 | 91天堂国产在线 在线播放 | 青青青免费网站在线观看 | 性欧美视频|