打开linux的源码目录,找到drivers/char/s3c6410-led.c
打开看一下源码,飞凌的这个led驱动程序可以运行,不过不太好,我改了一个小地方,我也看了友善的led的程序,两者如出一辙,不知道是谁copy谁的。大家有兴趣的可以看一下,ioctl中的switch语句,已经有了switch为什么还要在里面用if语句呢,看来高手也有犯小错误的时候。主要起控制led灯亮灭的是这个函数。
static long s3c6410_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)//控制函数
{
if (arg 》 4){//因为只有四个led灯,如果大于四就返回一个错误
return -EINVAL;
}
switch(cmd) { //根据命令来设置亮灭
unsigned tmp;
tmp = readl(S3C64XX_GPMDAT);
case 0: //打开
tmp &= (~(1《 break;
case 1: //关闭
tmp |= (1《 break;
default:
return -EINVAL;
writel(tmp,S3C64XX_GPMDAT);//数据写回寄存器
printk (DEVICE_NAME“: %d %d/n”, arg, cmd);
return 0;
}
}
代码中有简单的注释,这里就不多说,我们怎么来测试我们的驱动可以用了呢?
我们写一个测试程序来看一下。
写一个流水灯吧,源码发给大家。
在linux下编译执行
就可以生成ledtest,注意如果把arm-linux-gcc的路径加到PATH环境变量中去,否则会出现找到不命令的错误。
把ledtest通过串口发到开发板中,因为没有执行权限,先运行chmod 777 ledtest
然后再。/ledtest
就可以看到流水灯闪动了。
由于闪动的有点快,手机拍下来显示成两个亮了。其实是闪动的。
还有再给大家说一下怎么来把led驱动加到内核中呢,linux的编译用的是makefile管理的,初学者对于makefile的基本结构要知道一些,不用把整个makefile的文档都看一遍,但也要把知道大概, makefile的格式规则是这样的
target : prerequisites
command
我们打开char目录下的makefie看一下,
这一行是把led的驱动加入内核的关键,而我们在编译的时候要配置是加入内核还是编译成模块呢,我们运行make menuconfig的时候是怎么出现的配置的呢?这个要看我们的Kconfig文件
这个里面的FORLINX6410_LEDS和前面的Makefile中的文件
图片8.png
只差了一个前缀,这个就是我们在make menuconfig 的时候的配置选项。
进入到Device DriversàCharacter devices找到LedS driver forlinx6410
我们选上这一项就是编译进内核,如果是M,就是要编译成模块,可以动态加载,如果是空就是不编译。Make menuconfig的时候就是如何剪裁操作系统了,我们可以把不需要的或者没有必要的驱动不选上,重新编译,就可以得到自己剪裁过的内核了
驱动大体就是这样加入到内核的。不过这只是个简单的驱动,复杂的驱动也有点复杂,这里不介绍。
移植内核的过程有点复杂,不可能一两句说的清楚,大体的步骤就是先移植与arm体系结构相关的部分,先让linux在平台上跑起来,先移植nand驱动和串口驱动,这样我们可以从串口查看调试信息,以便我们进行其它驱动的移植,然后再移植各个相关的驱动。与6410相关的内核代码在源代码的arch/arm/mach-s3c64xx/文件夹下。驱动的设备驱动都在drivers目录下,char目录下是字符设备驱动,block目录下是块设备驱动程序等等,我们只要一看名字应该都知道大概是什么驱动。我们初学者大多接触的是字符设备驱动。
对于初学者不要有太多的忧虑,不要想我不是这个专业的,很多都不会,本人大学学的是电子信息工程,和嵌入式也没有太大的关系,操作系统不懂,arm结构不明白,我们可以慢慢学,没有谁一下子就把能把操作系统或者是arm说清楚的,我们多接触,一天会一点,不会想一口吃个胖子,嵌入式讲内功的,其实前边我和大家说,这个可以不用全会,那个不必全知道,是个让大家不至于一学嵌入式就被困难吓回去的做法,我是想让大家在尽短的时间内了解嵌入式的全貌,知识还是越多越好的。
打开linux的源码目录,找到drivers/char/s3c6410-led.c
打开看一下源码,飞凌的这个led驱动程序可以运行,不过不太好,我改了一个小地方,我也看了友善的led的程序,两者如出一辙,不知道是谁copy谁的。大家有兴趣的可以看一下,ioctl中的switch语句,已经有了switch为什么还要在里面用if语句呢,看来高手也有犯小错误的时候。主要起控制led灯亮灭的是这个函数。
static long s3c6410_leds_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)//控制函数
{
if (arg 》 4){//因为只有四个led灯,如果大于四就返回一个错误
return -EINVAL;
}
switch(cmd) { //根据命令来设置亮灭
unsigned tmp;
tmp = readl(S3C64XX_GPMDAT);
case 0: //打开
tmp &= (~(1《 break;
case 1: //关闭
tmp |= (1《 break;
default:
return -EINVAL;
writel(tmp,S3C64XX_GPMDAT);//数据写回寄存器
printk (DEVICE_NAME“: %d %d/n”, arg, cmd);
return 0;
}
}
代码中有简单的注释,这里就不多说,我们怎么来测试我们的驱动可以用了呢?
我们写一个测试程序来看一下。
写一个流水灯吧,源码发给大家。
在linux下编译执行
就可以生成ledtest,注意如果把arm-linux-gcc的路径加到PATH环境变量中去,否则会出现找到不命令的错误。
把ledtest通过串口发到开发板中,因为没有执行权限,先运行chmod 777 ledtest
然后再。/ledtest
就可以看到流水灯闪动了。
由于闪动的有点快,手机拍下来显示成两个亮了。其实是闪动的。
还有再给大家说一下怎么来把led驱动加到内核中呢,linux的编译用的是makefile管理的,初学者对于makefile的基本结构要知道一些,不用把整个makefile的文档都看一遍,但也要把知道大概, makefile的格式规则是这样的
target : prerequisites
command
我们打开char目录下的makefie看一下,
这一行是把led的驱动加入内核的关键,而我们在编译的时候要配置是加入内核还是编译成模块呢,我们运行make menuconfig的时候是怎么出现的配置的呢?这个要看我们的Kconfig文件
这个里面的FORLINX6410_LEDS和前面的Makefile中的文件
图片8.png
只差了一个前缀,这个就是我们在make menuconfig 的时候的配置选项。
进入到Device DriversàCharacter devices找到LedS driver forlinx6410
我们选上这一项就是编译进内核,如果是M,就是要编译成模块,可以动态加载,如果是空就是不编译。Make menuconfig的时候就是如何剪裁操作系统了,我们可以把不需要的或者没有必要的驱动不选上,重新编译,就可以得到自己剪裁过的内核了
驱动大体就是这样加入到内核的。不过这只是个简单的驱动,复杂的驱动也有点复杂,这里不介绍。
移植内核的过程有点复杂,不可能一两句说的清楚,大体的步骤就是先移植与arm体系结构相关的部分,先让linux在平台上跑起来,先移植nand驱动和串口驱动,这样我们可以从串口查看调试信息,以便我们进行其它驱动的移植,然后再移植各个相关的驱动。与6410相关的内核代码在源代码的arch/arm/mach-s3c64xx/文件夹下。驱动的设备驱动都在drivers目录下,char目录下是字符设备驱动,block目录下是块设备驱动程序等等,我们只要一看名字应该都知道大概是什么驱动。我们初学者大多接触的是字符设备驱动。
对于初学者不要有太多的忧虑,不要想我不是这个专业的,很多都不会,本人大学学的是电子信息工程,和嵌入式也没有太大的关系,操作系统不懂,arm结构不明白,我们可以慢慢学,没有谁一下子就把能把操作系统或者是arm说清楚的,我们多接触,一天会一点,不会想一口吃个胖子,嵌入式讲内功的,其实前边我和大家说,这个可以不用全会,那个不必全知道,是个让大家不至于一学嵌入式就被困难吓回去的做法,我是想让大家在尽短的时间内了解嵌入式的全貌,知识还是越多越好的。
举报