mini2440LED驱动程序开发

发布者:skyshoucang最新更新时间:2022-05-17 来源: eefocus关键字:mini2440  LED  驱动程序开发 手机看文章 扫描二维码
随时随地手机看文章

/*********************************************************实验源代码  ********************************************************************/


一、源代码:


/***********************mini2440_leds.c***********************


*******************************************************************/


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include    //2.6.32.2内核版本要求


#define DEVICE_NAME "leds"

//定义GPIO管脚

static unsigned long led_table [] = {

 S3C2410_GPB(5),  //不能是S3C2410_GPB5;  因为没有这样定义,可以通过#define S3C2410_GPB5 S3C2410_GPB(5)

 S3C2410_GPB(6),

 S3C2410_GPB(7),

 S3C2410_GPB(8),

};

//设置管脚模式

static unsigned int led_cfg_table [] = {

 S3C2410_GPIO_OUTPUT, //随内核版本中定义类型的变化,

 S3C2410_GPIO_OUTPUT,

 S3C2410_GPIO_OUTPUT,

 S3C2410_GPIO_OUTPUT,

};

//ioctl函数实现

static int sbc2440_leds_ioctl(

 struct inode *inode,

 struct file *file,

 unsigned int cmd,

 unsigned long arg)

{

 switch(cmd) {

 case 0:

 case 1:

  if (arg > 4) {

   return -EINVAL;

  }

  s3c2410_gpio_setpin(led_table[arg], !cmd);

  return 0;

 default:

  return -EINVAL;

 }

}

//dev_fops操作指令集

static struct file_operations dev_fops = {

 .owner =THIS_MODULE,

 .ioctl =sbc2440_leds_ioctl,

};

//第三步:混杂设备定义

static struct miscdevice misc = {

 .minor = MISC_DYNAMIC_MINOR,

 .name = DEVICE_NAME,

 .fops = &dev_fops,

};

//第二步:gpio模式选择,设定管脚

//   注册混杂设备

static int __init dev_init(void)

{

 int ret;


 int i;

 

 for (i = 0; i < 4; i++) {

  s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

  s3c2410_gpio_setpin(led_table[i], 0);

 }


 ret = misc_register(&misc);


 printk (DEVICE_NAME"tinitializedn");


 return ret;

}


static void __exit dev_exit(void)

{

 misc_deregister(&misc);

}

//第一步:module_init(dev_init);

//    module_exit(dev_exit);

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");


/**************************Makefile文件************************


*


*****************************************************************/


ifneq ($(KERNELRELEASE),)


obj-m := mini2440_leds.o


else

 KDIR:=/home/kernel/linux-2.6.32.2

all:

 make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean:

 rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*


endif


二、测试LED驱动的APP程序

/*******************************app_leds.c***************************************


*AUTHOR  DREAM


*


**********************************************************************************/


#include

#include

#include

#include

#include "memdev.h"  /* 包含命令定义 */

int main(int argc, char **argv)

{

 int on;

 int fd;

 if (argc != 2 || sscanf(argv[1],"%d", &on) != 1 ||on < 0 || on > 1 ) {

  fprintf(stderr, "Usage:%s 0|1n",argv[0]);

  exit(1);

 }

 fd = open("/dev/leds", 0);

 if (fd < 0) {

  perror("open device leds");

  exit(1);

 }

 /*通过ioctl来控制流水灯*/

 if(on){

  printf("start liushuideng !n");

  ioctl(fd,  MEMDEV_IOCON, 0);

 }

 else {

  printf("turn off all leds!n");

  ioctl(fd,  MEMDEV_IOCOFF, 0);

 }

 close(fd);

 return 0;

}


三、遇到的问题

1、

[root@localhost LED]# make

make -C /home/kernel/linux-2.6.32.2 M=/home/nfsshare/root_qtopia/Drive/LED modules ARCH=arm CROSS_COMPILE=arm-linux-

make[1]: Entering directory `/home/kernel/linux-2.6.32.2'

  CC [M]  /home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.o

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:29: error: 'S3C2410_GPB5' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:30: error: 'S3C2410_GPB6' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:31: error: 'S3C2410_GPB7' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:32: error: 'S3C2410_GPB8' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:36: error: 'S3C2410_GPB5_OUTP' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:36: error: initializer element is not constant

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:36: error: (near initialization for 'led_cfg_table[0]')

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:37: error: 'S3C2410_GPB6_OUTP' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:37: error: initializer element is not constant

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:37: error: (near initialization for 'led_cfg_table[1]')

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:38: error: 'S3C2410_GPB7_OUTP' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:38: error: initializer element is not constant

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:38: error: (near initialization for 'led_cfg_table[2]')

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:39: error: 'S3C2410_GPB8_OUTP' undeclared here (not in a function)

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:39: error: initializer element is not constant

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:39: error: (near initialization for 'led_cfg_table[3]')

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c: In function 'sbc2440_leds_ioctl':

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:54: error: implicit declaration of function 's3c2410_gpio_setpin'

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c: In function 'dev_init':

/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.c:80: error: implicit declaration of function 's3c2410_gpio_cfgpin'

make[2]: *** [/home/nfsshare/root_qtopia/Drive/LED/mini2440_leds.o] 错误 1

make[1]: *** [_module_/home/nfsshare/root_qtopia/Drive/LED] 错误 2

make[1]: Leaving directory `/home/kernel/linux-2.6.32.2'

make: *** [all] 错误 2

错误原因:内核版本不对,没有S3C2410_GPB5的类型定义 需要修改为S3C2410_GPB(5)


内核版本定义如下:


/* arch/arm/mach-s3c2410/include/mach/gpio-nrs.h

 *

 * Copyright (c) 2008 Simtec Electronics

 * http://armlinux.simtec.co.uk/

 * Ben Dooks

 *

 * S3C2410 - GPIO bank numbering

 *

 * This program is free software; you can redistribute it and/or modify

 * it under the terms of the GNU General Public License version 2 as

 * published by the Free Software Foundation.

*/


#ifndef __MACH_GPIONRS_H

#define __MACH_GPIONRS_H


#define S3C2410_GPIONO(bank,offset) ((bank) + (offset))


#define S3C2410_GPIO_BANKA   (32*0)

#define S3C2410_GPIO_BANKB   (32*1)

#define S3C2410_GPIO_BANKC   (32*2)

#define S3C2410_GPIO_BANKD   (32*3)

#define S3C2410_GPIO_BANKE   (32*4)

#define S3C2410_GPIO_BANKF   (32*5)

#define S3C2410_GPIO_BANKG   (32*6)

#define S3C2410_GPIO_BANKH   (32*7)


/* GPIO bank sizes */A

#define S3C2410_GPIO_A_NR (32)

#define S3C2410_GPIO_B_NR (32)

#define S3C2410_GPIO_C_NR (32)

#define S3C2410_GPIO_D_NR (32)

#define S3C2410_GPIO_E_NR (32)

#define S3C2410_GPIO_F_NR (32)

#define S3C2410_GPIO_G_NR (32)

#define S3C2410_GPIO_H_NR (32)


#if CONFIG_S3C_GPIO_SPACE != 0

#error CONFIG_S3C_GPIO_SPACE cannot be zero at the moment

#endif


#define S3C2410_GPIO_NEXT(__gpio)

 ((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 0)


#ifndef __ASSEMBLY__


enum s3c_gpio_number {

 S3C2410_GPIO_A_START = 0,

 S3C2410_GPIO_B_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_A),

 S3C2410_GPIO_C_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_B),

 S3C2410_GPIO_D_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_C),

 S3C2410_GPIO_E_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_D),

 S3C2410_GPIO_F_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_E),

 S3C2410_GPIO_G_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_F),

 S3C2410_GPIO_H_START = S3C2410_GPIO_NEXT(S3C2410_GPIO_G),

};


#endif /* __ASSEMBLY__ */


/* S3C2410 GPIO number definitions. */


#define S3C2410_GPA(_nr) (S3C2410_GPIO_A_START + (_nr))

#define S3C2410_GPB(_nr) (S3C2410_GPIO_B_START + (_nr))

#define S3C2410_GPC(_nr) (S3C2410_GPIO_C_START + (_nr))

#define S3C2410_GPD(_nr) (S3C2410_GPIO_D_START + (_nr))

#define S3C2410_GPE(_nr) (S3C2410_GPIO_E_START + (_nr))

#define S3C2410_GPF(_nr) (S3C2410_GPIO_F_START + (_nr))

#define S3C2410_GPG(_nr) (S3C2410_GPIO_G_START + (_nr))

#define S3C2410_GPH(_nr) (S3C2410_GPIO_H_START + (_nr))


/* compatibility until drivers can be modified */


//宏定义了GPA和GPE


#define S3C2410_GPA0 S3C2410_GPA(0)

#define S3C2410_GPA1 S3C2410_GPA(1)

#define S3C2410_GPA3 S3C2410_GPA(3)

#define S3C2410_GPA7 S3C2410_GPA(7)


#define S3C2410_GPE0 S3C2410_GPE(0)

#define S3C2410_GPE1 S3C2410_GPE(1)

#define S3C2410_GPE2 S3C2410_GPE(2)

#define S3C2410_GPE3 S3C2410_GPE(3)

#define S3C2410_GPE4 S3C2410_GPE(4)

#define S3C2410_GPE5 S3C2410_GPE(5)

#define S3C2410_GPE6 S3C2410_GPE(6)

#define S3C2410_GPE7 S3C2410_GPE(7)

#define S3C2410_GPE8 S3C2410_GPE(8)

#define S3C2410_GPE9 S3C2410_GPE(9)

#define S3C2410_GPE10 S3C2410_GPE(10)


#define S3C2410_GPH10 S3C2410_GPH(10)


#endif /* __MACH_GPIONRS_H */


2、问题二


[root@localhost LED]# make

make -C /home/kernel/linux-2.6.32.2 M=/home/nfsshare/root_qtopia/Drive/LED modules ARCH=arm CROSS_COMPILE=arm-linux-

[1] [2] [3]
关键字:mini2440  LED  驱动程序开发 引用地址:mini2440LED驱动程序开发

上一篇:LCD深度剖析
下一篇:mini2440裸机之MMU(二)(mmu.c)

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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