S3C2410——LED灯实验

发布者:WanderlustHeart最新更新时间:2024-09-02 来源: cnblogs关键字:S3C2410 手机看文章 扫描二维码
随时随地手机看文章

一、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 numbern');

    //设置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 numbern');break;

      }

      return 0;

}

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

//相关头文件的引用

#include

#include

#include

#include

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 引用地址:S3C2410——LED灯实验

上一篇:s3c2410 MMU
下一篇:s3c6410裸机程序(1)

推荐阅读最新更新时间:2024-11-11 11:29

s3c2410移植MPlayer到linux2.6
我使用的linux内核为2.6.14.1 MPlayer版本为MPlayer-1.0pre7try2.bz2 目前虽然已经添加了mad的mp3库,但播放声音文件回导致mplayer错误,放视频还得禁掉声音,怪了,madplay放mp3就很好 下面介绍下整个移植过程,也是参考了网上很多文章综合而来的 ================================================================= 1)编译器最好选择3.3.2 ,我使用3.4.1会出现snow.c编译错误,找不到解决办法 解压3.3.2到/usr/local/arm/下 并export PATH=http://www.eda-chin
[单片机]
Linux驱动:s3c2410/s3c2440 ts驱动分析
前言 前面结合“平台总线-设备-驱动”模型分析了ts(触摸)驱动的加载过程,现在进入驱动程序分析下其具体的实现。涉及到输入子系统、s3c2440的ADC转换和触摸控制器。 涉及的寄存器 image.png 调用probe函数 根据上一篇的分析,驱动层通过platform_driver_register注册后,会调用到该驱动层的probe函数。 s3c2410ts_probe函数分析 1. 硬件寄存器设置 获取设备参数 struct s3c2410_ts_mach_info *info; info = ( struct s3c2410_ts_mach_info *)pdev- dev.platform_data;
[单片机]
基于S3C2410及嵌入式Linux的氢气浓度的检测系统的解决方案
氢气是一种无色无味、携带极不方便、极易泄漏的气体,在室温和标准大气压下,氢气与空气的混合比例达到4.1%~74.1%时遇明火极易爆炸。为了减小使用氢气的安全隐患,开发出一套安全、可靠、灵敏度高的氢气浓度监测系统具有十分重要的意义。 1 系统总体结构设计 采集到的氢传感信号经过低噪声放大电路进行放大处理,并在低通滤波器滤除信号中的高频噪声。然后,经A/D转换器送入ARM处理器S3C2410,ARM 处理器再调用应用程序对采集到的数据进行数字处理,最后实时显示浓度值,并在浓度超出限定值时做出报警处理。整个系统框图如图1所示。 2 系统硬件结构设计 本系统中所选氢气传感器为瑞士Membrapor生产的H2/C-1000。它的
[单片机]
基于<font color='red'>S3C2410</font>及嵌入式Linux的氢气浓度的检测系统的解决方案
基于嵌入式系统的远程参数测量的方法和实现
简介: 目前嵌入式系统发展非常迅速,各类基于 ARM 处理器的应用开发更是如火如荼,这主要是由于嵌入式系统的高性价比和较短的开发周期短,并且可以实现于多种多样的应用系统中。本文介绍了基于三星公司的 ARM9 嵌入式芯片 S3C2410 构建的测量监控系统,以该 ARM 芯片为主 CPU,实现了交流、直流电压、电流的测量等,将测量的结果存储于本地 MIB 数据库中,并通过 IP 网络协议实现远程访问监控。 1. 概述 目前嵌入式系统发展非常迅速,各类基于 ARM 处理器的应用开发更是如火如荼,这主要是由于嵌入式系统的高性价比和较短的开发周期短,并且可以实现于多种多样的应用系统中。本文介绍了基于三星公司的 ARM9 嵌入式芯片
[单片机]
基于嵌入式系统的远程参数测量的方法和实现
基于S3C2410A芯片和Flash存储器实现嵌入式工控量热仪的设计
1、引言 现在大多数的发电厂、煤炭矿厂以及各大小级别实验室中所使用的工控量热仪都是这样的一个框架:完成仪器试验测试控制的下位机控制模块;提供人机交互,传输和接收命令、数据的上位机模块;以及两模块间的连接通信设备。在此系统中下位机通常使用的是单片机来完成对试验仪器的控制,并负责从通信设备 usb68013接收到数据,提取相应的试验控制命令来控制仪器试验。这里主要讨论的是系统上位机的构建和实现,对下位机不做进一步的讨论了。那么对于系统的上位机通常的做法就是使用 pc机,当然,通用 pc机有着丰富的资源,不管是它的 cup时钟频率、内存资源、以及对系统各种软硬件管理的能力等,都有着其它替代品不可比拟的优势。但是,使用 pc作为设备的上位
[单片机]
基于<font color='red'>S3C2410</font>A芯片和Flash存储器实现嵌入式工控量热仪的设计
S3C2410(ARM9)的启动方式
1、Nand Flash启动 为了从Nand Flash启动,S3C2410配置了一个叫做Steppingstone的4KB内部SRAM缓冲器,当系统被配置为从Nand Flash启动时(配置由硬件工程师在电路板设置),Nandflash控制器会自动的将Nand Flash前4KB代码将会被自动装入内部 RAM(Steppingstone)中,并把0x0地址设置为内部RAM的起始地址(存储器映射),然后CPU开始从内部RAM的0x0地址启动,这个过程不需要程序的干涉。通常nandflash前4KB的代码会将nandflash中的CPU启动初始化代码拷贝到SDRAM中,然后跳到SDRAM中开始执行。所以程序员需要做的就是将最核心
[单片机]
ucos在s3c2410上运行过程整体剖析之基础知识-c语言和堆栈
我们知道C语言是一种高级语言,所谓高级语言就是要经过翻译才能在具体平台上运行的程序。而编译程序是一种比较繁琐的程序,它要把高级语言编译和链接后,成为能够在具体平台运行的程序。这其中有很多知识是和操作系统和具体硬件平台相关的,如果你想弄清楚编译程序请学习编译原理,有一本书可以参考《linkers_and_loaders》。 我们这里只是说明一下C语言运行的环境以及和栈的关系。让我们从汇编语言和底层硬件来了解C语言的一些概念和C语言是如何利用栈来进控制过程调用的。 先讲一下栈: 栈是这样一种结构:本事是一段连续的内存空间,怎么使用这样一种内存空间才算是起到了栈的实际作用那,首先要规定这一段连续空间的基地址,然后就从这个地址开始依次
[单片机]
ucos在<font color='red'>s3c2410</font>上运行过程整体剖析之基础知识-c语言和堆栈
移植嵌入式Linux到ARM处理器S3C2410:BootLoader
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。   BootLoader 的实现依赖于CPU的体系结构,因此大多数 BootLoader 都分为stage1 和stage2 两大部分。依赖
[单片机]
移植嵌入式Linux到ARM处理器<font color='red'>S3C2410</font>:BootLoader
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved