?? led-driver.c
字號:
/* The necessarrqy header files */#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/module.h>
#include <asm/io.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <asm/arch/hardware.h>
#include <asm/uaccess.h>
/* Deal with CONFIG_MODVERSIONS */
#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/sched.h>
#include <linux/tqueue.h>
#include <linux/interrupt.h>
#include <asm/io.h>#include <linux/string.h>
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))
#endif
unsigned int leddriver_major;void* pLedData;//************************************************************// 函數原形: write_leddriver(struct file *file,char *buf,size_t count,loff_t *f_pos)// 參數: buf : 傳入該函數的數據緩沖區指針 //************************************************************int write_leddriver(struct file *file, char *buf, size_t count,loff_t *f_pos){ int i,j; unsigned char tmp1[10]; unsigned long led_data;
if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT ) //對用戶的緩沖區判斷
return -EFAULT;
copy_from_user(tmp1,buf,4);
// memcpy(&tmp1,&led_data,4);// printk("tmp1=%d %d %d %d\n",tmp1[0],tmp1[1],tmp1[2],tmp1[3]);
led_data=tmp1[0]|(tmp1[1]<<8)|(tmp1[2]<<16)|(tmp1[3]<<24);// printk("led_data=%x\n",led_data); pLedData=ioremap(0x28400000,0x10); //地址影射
// printk("led_data=%d\n",led_data); for(i=0;i<1000000;i++) { writel((led_data),pLedData); } iounmap(pLedData); return 0; }/********************************************************函數原形:read_readmiao1(struct file *file, char *buf, size_t count,loff_t *f_pos)*參數: buf : 傳入該函數的數據緩沖區指針/*******************************************************/ int read_leddriver(struct file *file, char *buf, size_t count,loff_t *f_pos){ return 0; }/********************************************************函數原形:open_leddriver(struct inode *inode,struct file *file)*參數: *返回值 : *函數說明:/*******************************************************/int open_leddriver(struct inode *inode,struct file *file){ return 0;}/********************************************************函數原形:release_leddriver(struct inode *inode,struct file *file)*參數: *返回值 : *函數說明:/*******************************************************/int release_leddriver(struct inode *inode,struct file *file){ return 0;}/**************************************** 函數指針結構: file_operations** 說明 :***************************************/struct file_operations leddriver_fops={// read : read_leddriver, write: write_leddriver,// ioctl: ioctl_leddriver, open : open_leddriver, release: release_leddriver,};
/* Initialize the module */
int init_module()
{
char ch;
int openint0,i,j,k,n;
int result; result=register_chrdev(0,"leddriver",&leddriver_fops); //注冊一個設備,得到驅動的主設備號 if(result<0) { printk("cannot get leddriver major number\n"); //沒有成功 return result; } printk("Congraulation, led drivers are successful registed\n"); if(leddriver_major==0) { leddriver_major=result; //記錄下主設備號 } pLedData=ioremap(0x28400000,0x10); //地址影射
for(i=0;i<1000000;i++)
writel(0xffffffff,pLedData); iounmap(pLedData); return 0;}
/* Cleanup */
void cleanup_module()
{
printk("Stop read miao module\n");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -