实验七 I/O口驱动实验
一、实验目的:
1、了解PXA270 微处理器GPIO 的功能
2 、熟悉PXA270 微处理器GPIO 驱动程序的编写方法
3、掌握驱动程序的加载过程和方法
二、实验环境(软件与硬件):
软件环境:VMware Workstation
硬件环境: pc机、arm机
三、实验过程和结果(包括编写的程序与结果,结果要截图)
第1步:利用vi编辑器, 驱动代码;
(1)增加驱动所需的头文件和变量
#include <linux/>
#include <linux/>
#include <asm/>
#include <asm/>
#include <linux/>
MODULE_LICENSE("GPL");
char LED_MODULE=0;
#define DEVICE_NAME "xsb_seg"
#define SEG_CS1 0x10300000
#define SEG_CS2 0x10400000
static char LED[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7F, 0x6F};
unsigned long *CS1_Address, *CS2_Address;
struct seg
{
char LED1_Val;
char LED2_Val;
char LED3_Val;
char LED4_Val;
char negative;
};
(2)同时更新所有七段数码光驱动管显示函数
static void Updateled(struct seg *seg_7)
{
unsigned short buff=0x00;
buff=seg_7->LED1_Val;
buff=buff|( seg_7->LED2_Val <<8);
writew(buff,CS1_Address);
buff=0x00;
buff=seg_7->LED3_Val;
buff=buff|( seg_7->LED4_Val<<8);
writew(buff,CS2_Address);
return;
}
(3)写具体某位七段数码光驱动管显示函数
void value_seting(struct seg *seg_7, char position, char value)
{
if (seg_7->negative==0)
value=~value & ~(0x1<<7);
else
value=(0x1<<7)|value;
if (position==1)
seg_7->LED1_Val=value;
else if(position==2)
seg_7->LED2_Val=value;
else if(position==3)
seg_7->LED3_Val=value;
else if(position==4)
seg_7->LED4_Val=value;
}
(4)实现七段数码光驱动写操作函数
static ssize_t XSB_Seg_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
{
int i;
struct seg *seg_7=file->private_data;
char led_forall[4];
printk(KERN_EMERG "The Module is written,XSB_Seg_write\n");
if(count!=4)
{
printk(KERN_EMERG "the count of input is not 4!!");
return 0;
}
if(copy_from_user(led_forall, buffer, 4))
{
for(i=1;i<=4;i++)
{
value_seting(seg_7, i, LED[led_forall[i-1]]);
}
Updateled( seg_7 );
}
return 0;
}
(5)实现七段数码管驱动IOCTL操作函数
static int XSB_Seg_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
嵌入式实验报告 IO口驱动实验 来自淘豆网m.daumloan.com转载请标明出处.