一、S3C2410输入/输出的原理

Linux主要有字符设备、块设备和网络设备3类驱动程序,我们一般编写的驱动都是字符设备驱动程序。

二、程序部分

编写程序控制3个LED灯,代码分为2个部分:控制LED的驱动程序、调用驱动程序的应用程序

1. 控制LED的驱动程序

(1) 常量和结构体的定义:

//定义设备名字,分配设备号时使用
#define DEVICE_NAME "UP-LED"
//定义次设备号
#define LEDRAW_MINOR 0
//定义端口C配置寄存器
#define GPCCON (*(volatile unsigned int *)S3C2410_GPCCON)
//定义端口C数据寄存器
#define GPCDAT (*(volatile unsigned int *)S3C2410_GPCDAT)
//定义字符设备结构体
struct cdev *mycdev;
//定义设备号变量,由主设备号和次设备号组成
dev_t devno;
//文件操作结构体定义使用设备的文件操作
static struct file_operations led_fops = {
owner: THIS_MODULE,
ioctl: led_ioctl, //只定义ioctl一个
};

(2) 驱动加载时的代码:

//定义加载驱动时执行的函数
module_init(led_init);
static int __init led_init(void)
{
int result,err;
//分配字符设备号
result=alloc_chrdev_region(&devno,LEDRAW_MINOR,1,DEVICE_NAME);
if(result < 0)
printk(KERN_ERR "can't get device number \n");
else
printk("get device number\n");
//设置GPC5、GPC6、GPC7为输出状态
GPCCON=(GPCCON|0x5400)&0xffff57ff;
//分配字符设备结构体
mycdev = cdev_alloc();
//初始化结构体,关联文件操作
cdev_init(mycdev,&led_fops);
//将字符设备驱动注册到内核
err=cdev_add(mycdev,devno,1);
if (err < 0)
printk(KERN_ERR "can't add led device");
return 0;
}

(3) 定义控制LED的文件操作:

static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
unsigned long arg)
{ switch(cmd){
case 1:
if(arg==1) GPCDAT=GPCDAT&0xffffffdf;//第一个led亮
if(arg==0) GPCDAT=GPCDAT|0x20; //第一个led灭
break;
case 2:
if(arg==1) GPCDAT=GPCDAT&0xffffffbf;//第二个led亮
if(arg==0) GPCDAT=GPCDAT|0x40; //第二个led灭
break;
case 3:
if(arg==1) GPCDAT=GPCDAT&0xffffff7f;//第三个led亮
if(arg==0) GPCDAT=GPCDAT|0x80; //第三个led灭
break;
default:
printk("error cmd number\n");break;
}
return 0;
}

2. 调用驱动程序的应用程序

//相关头文件的引用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
int main(int argc, char **argv)
{ //相关常量变量定义
int on;
int led_number;
int fd;
//读入命令行参数
sscanf(argv[1], “%d”, &led_number);
sscanf(argv[2],"%d", &on);
//打开设备文件
fd = open("/dev/leds", 0);
if (fd < 0) {
perror("open device /dev/leds");
exit(1);
}
//根据参数操作设备
ioctl(fd, led_number, on);
usleep(1000);
//关闭设备文件
close(fd);
return 0;
}

3. makefile文件

ARGET = test_led
CROSS_COMPILE = arm-linux
CC = $(CROSS_COMPILE)gcc
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /root/kernel/linux-2.6.24.4
PWD := $(shell pwd)
all: $(TARGET) modules
$(TARGET):
$(CC) -o $(TARGET) $(TARGET).c
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ *.ko Module.symvers *.mod.c $(TARGET)
.PHONY:modules clean
else
obj-m := led.o
endif

三、实验过程

在主机(虚拟机)上进行交叉编译:

根据makefile编译得到可执行文件test_led。

在主机上输入下面两行代码,将下面的两个文件上传到tftp服务器

cp led.ko /tftpboot/
cp test_led /tftpboot/

利用xshell超级终端,在目标机上接收led.ko和test_led文件,并且加载驱动程序

手动创建led设备节点,并给test_led文件可执行权限

实验现象:





S3C2410——LED灯实验的更多相关文章

  1. 利用DoHome APP和音箱控制LED灯实验参考步骤

    准备材料: Arduino Uno 一块 Arduino 扩展板        购买链接 DT-06模块一个       购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...

  2. Arduino uno LED灯实验

    http://jingyan.baidu.com/article/a65957f4e358d924e67f9bad.html

  3. 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯

    关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...

  4. CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)

    目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...

  5. 30个物联网传感器小实验:三行代码点亮LED灯

    30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...

  6. 嵌入式实验一:LED灯点亮

    实验一:LED灯程序 一. 实验环境 开发机环境 ​ 操作系统:ubuntu 12.04 ​ 交叉编译环境:arm-linux-gcc 4.3.2 ​ 6410板子内核源码:linux-3.0.1 目 ...

  7. zju(5)LED控制实验

    1.实验目的 1.学习和掌握如何将一个驱动程序添加到Kconfig,编译到内核. 二.实验内容 1.编写EduKit-IV试验箱Linux操作系统下LED灯的驱动: 2.编写EduKit-IV试验箱L ...

  8. Beaglebone Black - 控制 BBB 板上的 LED 灯

    BBB 的板上有五个 LED 灯,一个电源,四个其他指示灯,usr0 至 usr3 .这次学习是控制 usr0 至 3 让它们亮着,熄灭,闪.算是个 Hello World 实验.非常简单. 需要的材 ...

  9. TI-RTOS 控制LED灯

    TI将FreeRtos放在自家芯片上,于是得到了TI-RTOS,两者的区别我还不太清楚,近日因为项目需要,开始试用TI-RTOS,先来一个点灯的实验吧,算是 hello world. 这次手上的板子是 ...

随机推荐

  1. Redis6.0配置文件翻译(Google手动翻译)

    原文链接(一般情况下你打不开这个网页):https://raw.githubusercontent.com/redis/redis/6.0/redis.conf Redis配置文件 请注意,为了读取配 ...

  2. Auth0案例学习(SpringMVC形式)

    官方SpringMVC示例Github:https://github.com/auth0-samples/auth0-spring-mvc-sample/tree/master/01-Login Ma ...

  3. 机器学习之linear_model (线性回归算法模型)

    1.matplotlib 首先看一下这个静态图绘制模块 静态图形处理 数据分析三剑客 Numpy : 主要为了给pandas提供数据源 pandas : 更重要的数据结构 matplotlib : 静 ...

  4. yum下载安装git服务

    yum install git 安装成功后,配置 用户 邮箱信息 注: youxiu326 github账号名称 youxiu326@163.com    github账号对应邮箱 git confi ...

  5. 在IE中设置在序列化没有版本号就提示

  6. 罗振宇2022"时间的朋友"跨年演讲

    罗振宇2022"时间的朋友"跨年演讲 行就行,不行我再想想办法. 原来,还能这么干! 堆资源不是解决问题的唯一道路,还是那句话:"处于困境中的人往往只关注自己的问题.而解 ...

  7. pydev+eclipse写python代码

    首先,下载pydev:PyDev for Eclipse - Browse /pydev at SourceForge.net (建议下载到本地,之前看其他文章时,进行了如下安装: 启动 Eclips ...

  8. java中的访问控制有什么用?如何用法?请举例

    9.访问控制 [新手可忽略不影响继续学习] 访问控制有什么用?在软件公司里是这么用的,我们想像一种场景,在你的类中,你编了三个私有方法,马克-to-win,别人当然都用不了,但在类外,你也是用不了的, ...

  9. js判断json数据是否存在某字段的方法

    方式一 !("key" in obj) if("name" in json){//json就是数组,name是你要找的值 console.log("有 ...

  10. 动态修改svg的颜色,svg做背景色时候修改颜色

    svg修改背景色可以使用fill属性来修改,但是我现在需要动态改变svg的颜色,例如我hover的时候 现在发现一种兼容性还不错的方法是css属性mask 类似于给路径填充上颜色,结合backgrou ...