这几天导师有一个基于嵌入式的心电采集系统的实验课要开,让我帮忙设计。系统涉及到SPI驱动的开发,这里把代码贴出来供大家参考交流。
开发板型号:small2440
Linux内核版本:linux-2.6.38
文件系统:yaffs2
交叉编译器版本:arm-linux-gcc-4.3.3
/*******************************************
*文件描述:small2440开发板spi驱动,用于和stm32
* 进行通信,接收stm32采集的心电数据,
* stm32的AD位数为12位。
*作者:GYL
*日期:2015年5月5日
********************************************/
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/cdev.h>
#include <linux/pci.h>
#include <asm/uaccess.h>
#define MY_MAJOR 0 //主设备号
#define MY_MINOR 0 //从设备号
#define DEVICE_NAME "small2440_spi" //设备名
static int spi_major = MY_MAJOR;
static struct cdev *spiCdev = NULL; //字符设备结构体
static struct class *myclass = NULL; //设备类结构体
/*****************************************************/
static int __init spi_init(void);
static void __exit spi_exit(void);
static int spi_open(struct inode *,struct file *);
static int spi_release(struct inode *,struct file *);
static ssize_t spi_write(struct file *filp,const char *buf,size_t count,loff_t *f_ops);
static ssize_t spi_read(struct file *filp,char *buf,size_t count,loff_t *f_ops);
static long spi_ioctl(struct file *filp,unsigned int cmd,unsigned long data);
static void __iomem *base_addr0;
static void __iomem *base_addr1;
static void __iomem *base_addr2;
#define S3C2440_GPG 0x56000060
#define S3C2440_CLK 0x4C00000C
#define S3C2440_SPI1 0x59000020
#define GPGCON (*(volatile unsigned long *)(base_addr0 + 0x00))
#define GPGDAT (*(volatile unsigned long *)(base_addr0 + 0x04))
#define GPGUP (*(volatile unsigned long *)(base_addr0 + 0x08))
#define CLKCON (*(