1. 程式人生 > >Linux Driver,Go!

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 DriverGo

第一個驅動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 UTCCST時間及修改時間

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(‘