⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hpi.c

📁 linux下hpi口驱动程序
💻 C
字号:
#include "hpi.h"

int fdrv_open(struct inode *inode, struct file *filp);
int fdrv_release(struct inode *inode, struct file *filp) ;
ssize_t fdrv_write(struct file *filp, const int *buf, size_t count, loff_t *offp) ;
ssize_t fdrv_read(struct file *filp, int *buf, size_t count, loff_t *offp) ;
int fdrv_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long addr);
loff_t fdrv_seek(struct file *filp,loff_t off, int whence);

struct file_operations fdrv_fops=
{
	owner:		THIS_MODULE,
	read:		fdrv_read,
	write:		fdrv_write,
	open:		fdrv_open,
	release:	fdrv_release,
	llseek:	fdrv_seek,
       ioctl:       fdrv_ioctl,
};

loff_t fdrv_seek(struct file *filp,loff_t off, int whence) {
	hpi_RegAddr_temp = hpi_RegAddr + off/4;    	return hpi_RegAddr_temp;
}
int fdrv_open(struct inode *inode, struct file *filp) 
{ 
	MOD_INC_USE_COUNT; 
	return 0; 
} 
int fdrv_release(struct inode *inode, struct file *filp) 
{ 
	MOD_DEC_USE_COUNT; 
	return 0; 
} 

ssize_t fdrv_write(struct file *filp, const int *buf, size_t count, loff_t *offp) 
{ 	
	int i,temp;	
	temp = hpi_RegAddr_temp;	for(i=0;i<count;i++){
		*(hpi_RegAddr_temp++)= *(buf++); 
	}
	hpi_RegAddr_temp=temp;
	return count; 
} 

ssize_t fdrv_read(struct file *filp, int *buf, size_t count, loff_t *offp) 
{ 
	int i,temp;	
	temp = hpi_RegAddr_temp;	for(i=0;i<count;i++){
		*(buf++)= *(hpi_RegAddr_temp++); 
	}
	hpi_RegAddr_temp=temp;
	return count; 
} 

int fdrv_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long addr)
{
	return -EINVAL;	
}
static int __init init_hpi(void)
{ 
        AT91_SYS->EBI_SMC2_CSR[7] = 0x22003488;
//-----------------------------------------------------------------------------------------------------------------
	if (!request_mem_region(HPI_PHYSICAL_REG_ADDR,HPI_PHYSICAL_REG_SIZE, "HPI_DRIVER"))
    		printk("Error request mem \n");
	hpi_RegAddr  = (unsigned int*) ioremap_nocache(HPI_PHYSICAL_REG_ADDR,HPI_PHYSICAL_REG_SIZE);
	
	printk("HPI:Phys Reg address:%X  \n", hpi_RegAddr);
	
	if (!hpi_RegAddr)
    		printk("HPI_init: ioremap() returned NULL\n");
    		
//-----------------------------------------------------------------------------------------------------------------
	register_chrdev(MAJOR_NUM, "HPI", &fdrv_fops); 
	printk("hpi device installed.\n"); 
	return 0; 
} 

//void cleanup_module( void ) 
static void __exit exit_hpi(void)
{ 
printk("HPI device uninstalled.\n"); 
} 

module_init(init_hpi);
module_exit(exit_hpi);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -