测试在目标机上动态加载驱动。(驱动控制GPIO4~7)
程序分为app.c , drv.c
drv.c:
-----------------
drv.c需要COPY到内核的/driver/char下,并配置内核支持字符驱动。编译内核,
drv.c对GPIO进行初始化,注册主设备号,通过对GPFDAT进行移位操作,控制LED亮、灭。
cp /driver/char/drv.ko 到目标机,在目标机上动态加载驱动,insmod drv.ko
在目标机上创建节点 mknod -m 666 /dev/GPIO c 252 0
-----------------
//#define MODULE
//#define __KERNEL__
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
//#define __KERNEL__
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <asm/uaccess.h>
#include <asm/io.h>
//#include <asm/arch/S3C2410.h>
#include <asm/arch-s3c2410/regs-gpio.h>
#include <linux/fcntl.h>
#define GPF4_ON 0x4800
#define GPF5_ON 0x4802
#define GPF6_ON 0x4803
#define GPF7_ON 0x4804
#define GPF4_OFF 0x4801
#define GPFDAT *(volatile unsigned int *)S3C2410_GPFDAT
#define GPFCON *(volatile unsigned int *)S3C2410_GPFCON
//static int GPIO_TEST_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned int arg);
static int major=252;
char GPIO_TEST_name[]="GPIO_TEST";
static int GPIO_TEST_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned long arg)
{
int retv;
unsigned int data;
switch(cmd)
{
case GPF4_ON:
GPFDAT=GPFDAT|(1<<7);
GPFDAT=GPFDAT&(~(1<<4));break;
//s3c2410_gpio_setpin(S3C2410_GPF4,0);
case GPF5_ON:
GPFDAT=GPFDAT|(1<<4);
GPFDAT=GPFDAT&(~(1<<5)); break;
case GPF6_ON:
GPFDAT=GPFDAT|(1<<5);
GPFDAT=GPFDAT&(~(1<<6)); break;
case GPF7_ON:
GPFDAT=GPFDAT|(1<<6);
GPFDAT=GPFDAT&(~(1<<7));
break;
// case GPF4_OFF:
//GPFDAT=GPFDAT|(1<<4);
//s3c2410_gpio_setpin(S3C2410_GPF4,1);
//break;
default:
break;
}
return 0;
}
static struct file_operations GPIO_TEST_fops=
{
ioctl : GPIO_TEST_ioctl
};
static int __init GPIO_TESTdrv_init_module(void)
{
int retv;
retv=register_chrdev(major,GPIO_TEST_name,&GPIO_TEST_fops);
if(retv<0)
{
printk("<1>register fail!/n");
return retv;
}
if(major==0)
major=retv;
printk("major=%d/n",major);
printk("<1>GPIO_TESTdrv!!!!!!!!!!!!!!!!!!!!!!!!!/n");
GPFDAT=(GPFDAT&(~(3<<8)))+(1<<8);
GPFDAT=GPFDAT|(1<<4);
//s3c2410_gpio_pullup(S3C2410_GPF4,1);
//s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
//s3c2410_gpio_setpin(S3C2410_GPF4,1);
return 0;
}
static void __exit GPIO_TESTdrv_cleanup(void)
{
int retv;
retv=unregister_chrdev(major,GPIO_TEST_name);
if(retv<0)
{
printk("<1>unreginster fail!/n");
return;
}
printk("<1>GPIO_TESTdrv:good_bye!/n");
}
module_init(GPIO_TESTdrv_init_module);
module_exit(GPIO_TESTdrv_cleanup);
//lhtMODULE_LICENSE("GPL");
=======
app.c:
-----------
在主机上对app.c交叉编译,生成的可执行文件放到目标板的文件系统下
app.c实现打开设备节点,通过ioctl给设备节点发信号,并且延时,实现流水灯
启动目标机后,动态加载驱动,执行app即可实现流水灯。
-----------
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <sys/ioctl.h>
#define GPF4_ON 0x4800
#define GPF5_ON 0x4802
#define GPF6_ON 0x4803
#define GPF7_ON 0x4804
#define GPF4_OFF 0x4801
int main(void)
{
int fd;
int *arginfo=(int *)malloc(4);
printf("entered main/n");
if((fd=open("/dev/GPIO_TEST",O_RDWR))==-1)
{
perror("open eror");
exit(1);
}
printf("open ok/n");
while(1)
{
// ioctl(fd,GPF4_OFF,arginfo); //GPF0 1
// sleep(1);
ioctl(fd,GPF4_ON,arginfo); //GPF0 0
sleep(1);
ioctl(fd,GPF5_ON,arginfo);
sleep(1);
ioctl(fd,GPF6_ON,arginfo);
sleep(1);
ioctl(fd,GPF7_ON,arginfo);
sleep(1);
}
close(fd);
return 0;
}
#(粗体部分修改)为新增代码,原程序实现单LED闪烁
分享到:
相关推荐
三星arm9处理器,s3c2410的开关量书输入输出(gpio)的驱动
Windows CE下操作GPIO的方法(以ARM S3C2410为例) PDF文档
第3章_ARM体系结构编程3.ppt 第4章_ARM_Realview_MDK集成开发环境.ppt 第5章_GPIO编程.ppt 第5章_嵌入式系统引导程序2.ppt 第6章__详细设计(软件工程).ppt 第7章_串行通信接口.ppt 第8章_定时器.ppt 第11章_温度监测...
s3c2410的GPIO驱动程序和测试程序,linux2.6.14下的
ARM s3c2410 GPIO输入实验
列举s3c2410_gpio_cfgpin等内核导出函数的原型和使用方法
简单程序,让初学着,如何通过用户程序控制GPIO上的LED
gpio相关宏的介绍
s3c2410led驱动及测试程序,大家一起学习一下
网上收集的一些linux应用开发实验,基于S3C2410的实验,有I2C,LCD等
1_S3C2410-GPIO_步进电机实验.pptx
GPIO编程,GPIO 功能介绍,S3C2410X芯片详解,电路连接,寄存器设置,程序的编写
描述S3C2410的中断原理和实现技巧,对GPIO/EINT的有特别的描述
三星S3c2410的GPIO控制程序,里面全是源代码~
S3C2410的中文数据手册 找了好久希望大家喜欢
wince下s3c2410的gpio驱动
S3C2410基础试验源代码:AD/DA、RTC、IIS、LED、Touch、Ucosport、WDT、GPIO、TIME、ledary、uart、vgatest、IICEEPROM等
| | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA...
这个是ARM的GPIO源代码,对学习ARM很有帮助,好东西大家一起分享哈
ARM GPIO控制,用于控制ARM的GPIO的输入输出