S3C2410——LED灯实验

发布时间:2024-09-02  

一、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文件可执行权限

实验现象:



文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>