Linux Driver,Go!
第一個驅動
demo.h
#ifndef _DEMO_H_ #define _DEMO_H_ #include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */ /******************************************************** * Macros to help debugging ********************************************************/ #undef PDEBUG /* undef it, just in case */ #ifdef DEMO_DEBUG #ifdef __KERNEL__ # define PDEBUG(fmt, args...) printk( KERN_DEBUG "DEMO: " fmt, ## args) #else//usr space # define PDEBUG(fmt, args...) fprintf(stderr, fmt, ## args) #endif #else # define PDEBUG(fmt, args...) /* not debugging: nothing */ #endif #undef PDEBUGG #define PDEBUGG(fmt, args...) /* nothing: it's a placeholder */ //裝置號 #define DEMO_MAJOR 224 #define DEMO_MINOR 0 #define COMMAND1 1 #define COMMAND2 2 //裝置結構 struct DEMO_dev { struct cdev cdev; /* Char device structure */ }; //函式申明 ssize_t DEMO_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos); ssize_t DEMO_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos); loff_t DEMO_llseek(struct file *filp, loff_t off, int whence); int DEMO_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); #endif /* _DEMO_H_ */
demo.c
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/fcntl.h> #include <linux/cdev.h> #include <linux/version.h> #include <linux/vmalloc.h> #include <linux/ctype.h> #include <linux/pagemap.h> #include "demo.h" MODULE_AUTHOR("wangzhzh"); MODULE_LICENSE("Dual BSD/GPL"); struct DEMO_dev *DEMO_devices; static unsigned char demo_inc=0; static u8 demoBuffer[256]; int DEMO_open(struct inode *inode, struct file *filp) { struct DEMO_dev *dev; if(demo_inc>0)return -ERESTARTSYS; demo_inc++; dev = container_of(inode->i_cdev, struct DEMO_dev, cdev); filp->private_data = dev; return 0; } int DEMO_release(struct inode *inode, struct file *filp) { demo_inc--; return 0; } ssize_t DEMO_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos) { int result; loff_t pos= *f_pos; /* 檔案的讀寫位置 */ if(pos>=256) { result=0; goto out; } if(count>(256-pos)) { count=256-pos; } pos += count; if (copy_to_user(buf,demoBuffer+*f_pos,count)) { count=-EFAULT; /* 把資料寫到應用程式空間 */ goto out; } *f_pos = pos; /* 改變檔案的讀寫位置 */ out: return count; } ssize_t DEMO_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos) { ssize_t retval = -ENOMEM; /* value used in "goto out" statements */ loff_t pos= *f_pos; if(pos>=256) { goto out; } if(count>(256-pos)) { count=256-pos; } pos += count; if (copy_from_user(demoBuffer+*f_pos, buf, count)) { retval = -EFAULT; goto out; } *f_pos = pos; return count; out: return retval; } int DEMO_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg) { if(cmd==COMMAND1) { printk("ioctl command1 successfully\n"); return 0; } if(cmd==COMMAND2) { printk("ioctl command2 successfully\n"); return 0; } printk("ioctl error\n"); return -EFAULT; } loff_t DEMO_llseek(struct file *filp, loff_t off, int whence) { loff_t pos; pos = filp->f_pos; switch (whence) { case 0: pos = off; break; case 1: pos += off; break; case 2: default: return -EINVAL; } if ((pos>256) || (pos<0)) { return -EINVAL; } return filp->f_pos=pos; } struct file_operations DEMO_fops = { .owner = THIS_MODULE, .llseek = DEMO_llseek, .read = DEMO_read, .write = DEMO_write, .ioctl = DEMO_ioctl, .open = DEMO_open, .release = DEMO_release, }; /******************************************************* MODULE ROUTINE *******************************************************/ void DEMO_cleanup_module(void) { dev_t devno = MKDEV(DEMO_MAJOR, DEMO_MINOR); if (DEMO_devices) { cdev_del(&DEMO_devices->cdev); kfree(DEMO_devices); } unregister_chrdev_region(devno,1); } int DEMO_init_module(void) { int result; dev_t dev = 0; dev = MKDEV(DEMO_MAJOR, DEMO_MINOR); result = register_chrdev_region(dev, 1, "DEMO"); if (result < 0) { printk(KERN_WARNING "DEMO: can't get major %d\n", DEMO_MAJOR); return result; } DEMO_devices = kmalloc(sizeof(struct DEMO_dev), GFP_KERNEL); if (!DEMO_devices) { result = -ENOMEM; goto fail; } memset(DEMO_devices, 0, sizeof(struct DEMO_dev)); cdev_init(&DEMO_devices->cdev, &DEMO_fops); DEMO_devices->cdev.owner = THIS_MODULE; DEMO_devices->cdev.ops = &DEMO_fops; result = cdev_add (&DEMO_devices->cdev, dev, 1); if(result) { printk(KERN_NOTICE "Error %d adding DEMO\n", result); goto fail; } return 0; fail: DEMO_cleanup_module(); return result; } module_init(DEMO_init_module); module_exit(DEMO_cleanup_module);
建立裝置節點
mknod /dev/demo c 224 0
test.c
#include<sys/types.h> #include<unistd.h> #include<fcntl.h> #include<linux/rtc.h> #include<linux/ioctl.h> #include<stdio.h> #include<stdlib.h> #define COMMAND1 1 #define COMMAND2 2 main() { int fd; int i; char data[256]; int retval; fd=open("/dev/demo",O_RDWR); if(fd==-1) { perror("error open\n"); exit(-1); } printf("open /dev/demo successfully\n"); retval=ioctl(fd,COMMAND1,0); if(retval==-1) { perror("ioctl error\n"); exit(-1); } printf("send command1 successfully\n"); retval=write(fd,"fgj",3); if(retval==-1) { perror("write error\n"); exit(-1); } retval=lseek(fd,0,0); if(retval==-1) { perror("lseek error\n"); exit(-1); } retval=read(fd,data,3); if(retval==-1) { perror("read error\n"); exit(-1); } printf("read successfully:%s\n",data); close(fd); }
相關推薦
Linux Driver,Go!
第一個驅動demo.h#ifndef _DEMO_H_ #define _DEMO_H_ #include <linux/ioctl.h> /* needed for the _IOW etc stuff used later */ /************
【不用敲命令】如何正常啟動雙系統(windows win7 linux ubuntu ),避免任一系統啟動項丟失或啟動卡殼、卡頓!
本說明針對正常安裝雙系統後,避免啟動任一系統困難。 【以Win7下安裝Ubuntu為例】 當在win7系統上安裝好Ubuntu系統後,進入系統時,發現可以看到win7的啟動條目,但選擇以後,有時候選擇了能進,多用幾次後就發現不行了,因此很惱火。 操作步驟:
運維請注意:10個“非常危險”的Linux命令,果斷收藏!
計算機作業系統是管理計算機軟硬體資源的一個平臺,沒有它,任何計算機都無法正常執行,市面上主流的作業系統有Windows、Unix、Linux、Mac OS X。 這裡主要說一下Linux系統,Linux是一個類Unix的開源版作業系統,主要有以下幾個特點: 開放式作業系統 Linu
Linux 末路,Kubernetes 崛起!
【CSDN編者按】在很長一段時間內,一度與 Windows、iOS 以及 Android 共列四大流行作業系統的 Linux,持續吸引著開發者的關注。但近來對於這個曾在網際網路世界掀起產業化運動颶風的作業系統,業界也開始冒出「唱衰」之聲。長江後浪推前浪,隨著 Re
常用Linux命令,記錄一下,避免搞忘記!
系統資訊 arch 或 uname -m 顯示機器的處理器架構 uname -r 顯示正在使用的Linux核心版本號 cat /proc/cpuinfo (Linux檢視cpu相關資訊,包括型號、主頻、核心資訊等) lsb_release -a 或 cat /etc/redh
學習神器!本機安裝虛擬機器,並安裝Linux系統,並部署整套web系統手冊(包含自動部署應用指令碼,JDK,tomcat,TortoiseSVN,Mysql,maven等軟體)
1. 引言 編寫目的 本文件的編寫目的主要是在Linux系統上部署mis_v3員工管理系統,方便測試,併為以後開發人員進行專案部署提供參考 準備工作 軟體部分 軟體項 版本 備註
深入體驗bash on windows,在windows上搭建原生的linux開發環境,酷!
今年微軟Build 2016大會最讓開發人員興奮的訊息之一,就是在Windows上可以原生執行Linux bash,對開發人員來說,這是一個喜聞樂見的訊息。 1 安裝 你必須安裝開發者預覽版本,才能使用windows的linux subsystem功能。 首先開啟你的Wi
Linux driver dts使用,例項驅動編寫
Device Tree後,許多硬體的細節可以直接透過它傳遞給Linux,而不再需要在kernel中進行大量的冗餘編碼。 Device Tree由一系列被命名的結點(node)和屬性(property)組成,而結點本身可包含子結點。所謂屬性,其實就是成對出現的n
全方位剖析 Linux 作業系統,太全了!!!
## Linux 簡介 UNIX 是一個互動式系統,用於同時處理多程序和多使用者同時線上。為什麼要說 UNIX,那是因為 Linux 是由 UNIX 發展而來的,UNIX 是由程式設計師設計,它的主要服務物件也是程式設計師。Linux 繼承了 UNIX 的設計目標。從智慧手機到汽車,超級計算機和家用電器,從
C/C++遍歷目錄下的所有文件(Windows/Linux篇,超詳細)
檢查 msd 字符 size tro 也會 結構 () alt 前面的一篇文章我們講了用Windows API遍歷一個目錄下的所有文件,這次我們講用一種Windows/Linux通用的方法遍歷一個目錄下的所有文件。 Windows/Linux的IDE都會提供一個頭文件—
linux配置PHP環境!!(雲服務器架設)
方便 string -s iad thread systemctl 1-1 賬號密碼 系統集成 首先去阿裏雲或騰訊雲購買主機(騰訊雲現在有免費30天的雲主機...) 購買好之後選擇安裝: 點登陸 就可以到linux的操作界面了 進入操作界面 輸入root賬號
Linux UTC,CST時間及修改時間
tag system 使用 本地 -s linux操作系統 一段時間 操作系統 選項 1。安裝linux的時候在設置時間的時候有一個選項: system clock uses UTC,那麽這個UTC是什麽意思呢?世界協調時間(Universal Time Coordinat
Delphi 調試連接 任意Android手機/平板/盒子(要安裝Google USB Driver,並且還有USB的相關許多文章)
ogl .org blog broadcast 通過 並且 install 無法 設備 Delphi有時候無法連接調試一些手機,解決方案: 1.安裝Google USB Driver 2.通過設備管理器查看手機或平板USB的VID,PID 3.修改你的電腦上的andr
LNMP1.3一鍵安裝Linux環境,配置Nginx運行ThinkPHP3.2
搜索 最終 ati 兼容 access eal inf pic enter LNMP1.3一鍵安裝Linux環境,配置Nginx運行ThinkPHP3.2 你是否遇見過:安裝LNMP1.3環境後,運行ThinkPHP 3.2,只能打開首頁,不能訪問控制器,報404
告訴你們!我是怎麽與Linux系統觸電的!
windows linux 阿裏雲 臺式機 試驗機 最開始接觸Linux是在15年來北京後,剛來北京機緣巧合,從事了實施工程師的工作。實施工作是一個面很廣的工作。業務、技術、溝通等等方方面面的。技術一直是我是的短板。剛開始,公司在要在阿裏雲上部署APP與商城。在公司,想發展,提升。就必須學
自己親自寫的兩本linux資料,免費下載,pdf文檔
post download 二本 免費下載 bsp sdn 有用 linux資料 分享 第一本是我寫的韓順平老師解說的linux視頻的筆記,該視頻原本有21講,可是我始終沒有找到當中的17、18講。可是其它部分我感覺及記錄的還是蠻認真的。該套視頻解說的非常基礎
找到一本不錯的Linux電子書,附《Linux就該這麽學》章節目錄。
amba 數據庫管理 bsp squid部署 最值 必須掌握 實踐 htm 數據庫管理系統 此書是由全國多名紅帽架構師(RHCA)基於RHEL7系統共同編寫的高質量Linux技術自學書籍,各章節知識點從實踐出發且具有較強連貫性,極其適合Linux初學者或用作Linux相關輔
找到一本不錯的Linux電子書,附《Linux就該這麽學》章節目錄
電子書 防火墻 學習方法 linux 郵件系統 此書是由全國多名紅帽架構師(RHCA)基於RHEL7系統共同編寫的高質量Linux技術自學書籍,各章節知識點從實踐出發且具有較強連貫性,極其適合Linux初學者或用作Linux相關輔助教材,專註於Linux系統與紅帽認證。目前是國內最值得去讀
linux下,手動切換jdk
nat ati span current ren linu color pat choice 1、首先將自定義的jdk目錄安裝到alternatives中 [email protected]/* */:~/srcAndroid/src4.4.4_r1$ s
angularjs中避免被轉義,HTMl標識能被識別,可以正常鏈接,下載!
strong mes logs str style content 代碼 ret .html http://www.cnblogs.com/sxz2008/p/6434036.html如果希望正常解析html代碼,如下: var app = angular.module(‘