1、TinyS3C6410Linux下LED灯驱动移植过程UT-S3C6410 ARM11 Linux 下的LED驱动一 、实验环境操作系统:fedora13交叉编译环境:arm-Linux-gcc 或以上,6410板子内核源码路径在:忘了,需要厂家给的内核源代码硬件平台:S3C6410开发板(其他类型的开发板也可以注意配置GPIO)注:交叉编译环境一定要装好,一般的开发板给的配套资料中都会有,安装过程也都有详细的过程,如果没有,亲,你只有自己解决了。也可以联系我(*),泪奔支持你们。二 、实验原理控制LED是最简单的一件事情,就像学C语言时候写的“hello world”程序一样,是一个入门的程
2、序。首先来了解一下相关的硬件知识:UT-S3C6410 LED原理图 UT-S3C6410 LED外部引脚图 从上面的原理图可以得知,LED与CPU引脚的连接方法如下,高电平点亮。LED1-GPM0LED2 -GPM1LED3-GPM2LED4-GPM3 从数据手册可以找到相应的控制方法。这里我们以LED1为例,介绍一下LED1的操作方法,其他的类似,请大家自行分析。通过上面可以得知,需要先将GPM0设置为输出方式。将寄存器GPMCON低四位配置成0001。然后将GPMDAT寄存器的第0位置1灯亮,置LED0灯亮,开发板上有四个LED所以要对GPMDAT的低四位进行操作,就可以实现对灯的亮灭操
3、作了。三、实验步骤1、编写驱动程序mini6410_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 #include #include #include #include #include #defin
4、e DEVICE_NAME ledsstatic long sbc2440_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)switch(cmd) unsigned tmp;case 0:case 1:if (arg 4) return -EINVAL;tmp = readl(S3C64XX_GPKDAT);tmp &= (1 (4 + arg);tmp |= ( (!cmd) (4 + arg) );writel(tmp, S3C64XX_GPKDAT);/printk (DEVICE_NAME: %d %d
5、n, arg, cmd);return 0;default:return -EINVAL;static struct file_operations dev_fops = .owner = THIS_MODULE,.unlocked_ioctl = sbc2440_leds_ioctl,;static struct miscdevice misc = .minor = MISC_DYNAMIC_MINOR,.name = DEVICE_NAME,.fops = &dev_fops,;static int _init dev_init(void)int ret;unsigned tmp;tmp
6、= readl(S3C64XX_GPKCON);tmp = (tmp & (0xffffU16)|(0x1111U16);writel(tmp, S3C64XX_GPKCON);tmp = readl(S3C64XX_GPKDAT);tmp |= (0xF 4);writel(tmp, S3C64XX_GPKDAT);ret = misc_register(&misc);printk (DEVICE_NAMEtinitializedn);return ret;static void _exit dev_exit(void)misc_deregister(&misc);module_init(d
7、ev_init);module_exit(dev_exit);MODULE_LICENSE(GPL);MODULE_AUTHOR(FriendlyARM Inc.);(1)把Hello,Module 加入内核代码树,并编译一般编译 2.6 版本的驱动模块需要把驱动代码加入内核代码树,并做相应的配置,如下步骤(注意:实际上以下步骤均已经做好,你只需要打开检查一下直接编译就可以了):Step1:编辑配置文件Kconfig,加入驱动选项,使之在make menuconfig 的时候出现打开 linux-2.6.38/drivers/char/Kconfig 文件,添加如图所示:#=cgf add=c
8、onfig MINI6410_LEDS tristate LED Support for Mini6410 GPIO LEDs depends on CPU_S3C6410 default y help This option enables support for LEDs connected to GPIO lines on Mini6410 boards.#=保存退出,这时在 linux-2.6.38 目录位置运行一下make menuconfig 就可以在DeviceDrivers Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选
9、择为,此意为要把该选项编译为模块方式;再按下空格会变为,意为要把该选项编译到内核中,在此我们选择,如图,如果没有出现,请检查你是否已经装载了缺省的内核配置文件,(2)Makefile文件Step2:通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini6410_leds.c编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开linux-2.6.38-cgf/drivers/char/Makefile,obj-$(CONFIG_MINI6410_LEDS) += mini6410_leds.o添加并保存退出Step3:这时回到l
10、inux-2.6.38 源代码根目录位置,执行make modules,就可以生成我们所需要的内核模块文件drivers/char/mini6410_leds.ko 了,注意:执行make modules 之前,必须先执行make zImage,只需一次就可以了。至此,我们已经完成了模块驱动的编译。注意:在编译过程中会出现drivers/char/mini6410_leds.c:31:30: fatal error: mach/gpio-bank-k.h: No such file or directorycompilation terminated.则表明自己的内核里缺相关的头文件,只要把光
11、盘里的头文件复制到相关的目录下则可以一般头文件路径会在arch/arm/mach-s3c64xx/includecp linux-2.6.38/arch/arm/mach-s3c64xx/include/mach/gpio-bank-k.h /root/mywork/linux-2.6.38-cgf/arch/arm/mach-s3c64xx/include/mach/gpio-bank-k.h(3)把Module 下载到开发板并安装使用在此使用 ftp 命令把编译出的mini6410_hello_module.ko 下载到板子中,并把它移动到/lib/modules/2.6.38-Frien
12、dlyARM 目录然后在板子中现在执行insmod mini6410_leds.ko出现如下结果:leds initialized可以看到该模块已经被装载了(注意:使用modprobe 命令加载模块不需要加“ko”尾缀)再执行以下命令,可以看到该模块被卸载#rmmod mini6410_hello_module注意: 要能够正常卸载模块, 必须把模块放入开发板的/lib/modules/2.6.38-FriendlyARM 目录2、编写测试程序光盘中的样例测试程序:mini6410_leds.c #include #include #include #include int main(int argc, char *argv)int on;int led_no;int fd;/* 检查led 控制的两个参数,如果没有参数输入则退出。*/if (argc != 3 | sscanf(argv1, %d, &led_no) != 1 | sscanf(argv2,%d, &on) != 1 |on 1 | led_no 3) fprintf(stder
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1