S3C2410——LED灯实验
一、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灯实验的更多相关文章
- 利用DoHome APP和音箱控制LED灯实验参考步骤
准备材料: Arduino Uno 一块 Arduino 扩展板 购买链接 DT-06模块一个 购买链接 安卓手机一个 小度音箱一个 小灯珠一个 杜邦线若干 1.DT-06固 ...
- Arduino uno LED灯实验
http://jingyan.baidu.com/article/a65957f4e358d924e67f9bad.html
- 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯
关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...
- CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)
目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...
- 30个物联网传感器小实验:三行代码点亮LED灯
30个物联网传感器小实验:三行代码点亮LED灯 三行代码点亮LED灯 LED灯闪烁 LED灯调亮度 LED淡入淡出 不写一行代码点亮LED灯 全彩RGB灯 面包板 30个物联网传感器小实验:三行代码点 ...
- 嵌入式实验一:LED灯点亮
实验一:LED灯程序 一. 实验环境 开发机环境 操作系统:ubuntu 12.04 交叉编译环境:arm-linux-gcc 4.3.2 6410板子内核源码:linux-3.0.1 目 ...
- zju(5)LED控制实验
1.实验目的 1.学习和掌握如何将一个驱动程序添加到Kconfig,编译到内核. 二.实验内容 1.编写EduKit-IV试验箱Linux操作系统下LED灯的驱动: 2.编写EduKit-IV试验箱L ...
- Beaglebone Black - 控制 BBB 板上的 LED 灯
BBB 的板上有五个 LED 灯,一个电源,四个其他指示灯,usr0 至 usr3 .这次学习是控制 usr0 至 3 让它们亮着,熄灭,闪.算是个 Hello World 实验.非常简单. 需要的材 ...
- TI-RTOS 控制LED灯
TI将FreeRtos放在自家芯片上,于是得到了TI-RTOS,两者的区别我还不太清楚,近日因为项目需要,开始试用TI-RTOS,先来一个点灯的实验吧,算是 hello world. 这次手上的板子是 ...
随机推荐
- 算法导论 - 基础知识 - 算法基础(插入排序&归并排序)
在<算法导论>一书中,插入排序作为一个例子是第一个出现在该书中的算法. 插入排序: 对于少量元素的排序,它是一个有效的算法. 插入排序的工作方式像许多人排序一手扑克牌.开始时,我们手中牌为 ...
- 序列化多表操作、请求与响应、视图组件(子类与拓展类)、继承GenericAPIView类重写接口
今日内容概要 序列化多表操作 请求与相应 视图组件 内容详细 1.序列化多表操作 模型类 models.py中 # 新建django项目 # 创建表 模型类models.py中: from djang ...
- canvas动画—圆形扩散、运动轨迹
介绍 在ECharts中看到过这种圆形扩散效果,类似css3,刚好项目中想把它用上,but我又不想引入整个echart.js文件,更重要的是想弄明白它的原理,所以自己动手.在这篇文章中我们就来分析实现 ...
- Codepen 每日精选(2018-4-20)
按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以打开原始页面. 图书打开的交互效果https://codepen.io/jcoulterde... 进度条交互效果http ...
- ES6-11学习笔记--Generator
基本使用 function后面加个*号 function* foo() { for (let i = 0; i < 3; i++) { yield i; // yield不能作为构造函数去使用, ...
- C#编写程序,用 while 循环语句实现下列功能
编写程序,用 while 循环语句实现下列功能:有一篮鸡蛋,不止一个,有人两个两个数,多余一个,三个三个数,多余一个,再四个四个地数,也多余一个,请问这篮鸡蛋至少有多少个. 代码: using Sys ...
- onActivityResult执行两次问题
差点被坑死 记一次onActivityResult被调用两次的坑
- 【Android开发】分割字符串工具类
public class TextUtils { public static String[] results; /** * 分隔符:"." * * @param resource ...
- C++中的算法头文件<algorithm>,<numeric>和<functional>
算法部分主要由头文件<algorithm>,<numeric>和<functional>组成.<algorithm>是所有STL头文件中最大的一个,它是 ...
- IO流入门
@ 目录 总结内容 1. IO流是什么 2. 字符流和字节流 3. File常用API(前面类型为返回类型) 4. 编码转换 5. IO流实现流程 6. 输入输出流简单实现 7. 输入输出流简单实现 ...