【OK210试用体验】入门篇(4)编程入门(NFS登录、驱动入门) - 在线问答 - 电子威廉希尔官方网站 论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】入门篇(4)编程入门(NFS登录、驱动入门)

gjianw217 ( 楼主 ) 2015-8-1 22:39:56  只看该作者 倒序浏览
本帖最后由 gjianw217 于 2015-8-3 10:04 编辑

前面分别介绍了
   【OK210试用体验】的第一篇:开箱验板
   【OK210试用体验】的第二篇:板载资源
   【OK210试用体验】的第三篇:开发环境(软件安装,开发环境,烧写系统)
   今天是【OK210试用体验】的第四篇:编程入门的介绍,主要包括以下内容:
一 NFS环境配置及登录
二 驱动环境搭建
三 下阶段安排


一 NFS环境配置及登录
    还记得在第三篇中介绍NFS的搭建吗?NFS主要用来通过网线来实现代码的上传,无需通过手动的方式将程序烧写到SD卡中,方便程序的开发及调试,这节简单回顾一下NFS的搭建过程,然后通过实际操作来演示NFS的登录。
(一)NFS搭建:
1 在Ubuntu下的设置
1)NFS服务安装

Ubuntu上默认是没有安装NFS服务器的,首先要安装NFS服务程序,执行如下命令:
    sudo apt-get install nfs-kernel-server
ps: (安装nfs-kernel-server时,apt会自动安装nfs-common和portmap)
2)NFS服务配置
  在终端执行如下命令,打开配置文件
  sudo vim /etc/exports
  在文件的最下面输入如下
  /home/ok210/nfs *(rw,sync,no_root_squash)
  然后保存退出。
ps:
   /home/ok210/nfs表示共享目录,即我们在上节创建的nfs目录,用来存放调试的程序代码
   *:表示主机(NFS客户端)的ip地址(本机终端ifconfig命令就可以获得本机的ip地址),在此表示任意的IP的地址
   rw:读/写权限,只读权限的参数为ro;
   sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。
   no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有root的权限。

3)重新编译内核
ok210默认的Linux内核是不支持NFS服务器的,所以需要重新编译内核,选择其支持NFS服务,具体见上节的内核烧写部分。
2 在OK210下的设置
1)设置IP地址

使用NFS服务器,首先是使Ubuntu和OK210内核支持NFS服务其次是使两设备相互可以ping通。默认一般两设备的IP是ping不通的。现假设Ubuntu的IP(使用ifconfig查看)地址为192.168.1.102,那么需要将OK210的IP地址设置为同一网段,即可设置为192.168.1.x(x表示除102,1以外的其他数值,但要小于255)
打开串口终端,输入如下命令进行设置

ifconfig down
ifconfig eth0 192.168.1.113 netmask 255.255.0.0
route add default gw 192.168.1.1
ifconfig up
ps:也可将上述代码写到板子/etc/init.d/rcS文件的最下面,这样就不用每次挂载时执行上述代码,而是OK210在启动时,自动挂载。
2)挂载NFS
首先使用网线连接OK210和电脑,使Ubuntu和OK210能够实现网络互联,首先检查是否可以ping通,比如出现如下信息,说明可以ping通.

接着执行命令:
mount -n -o nolock 192.168.1.102:/home/ok210/nfs /mnt
3)NFS测试
在串口终端进入/mnt目录,即可以看到在Ubuntu的/home/ok210/nfs下的文件,如下所示,即表示NFS服务成功设置.



二 驱动环境搭建
Linux驱动的编写,大致分为两个过程,第一个过程为测试阶段,即为某一具体的设备,添加必要的驱动模块,为了节省编译时间,需要将代码单独放在一处,在编译时,只需要要调用内核的头文件即可;第二个过程为布置阶段,即为某一具体设备,添加完整、可靠的驱动模块,即该过程将驱动模块编译到内核镜像文件中,它需要将驱动模块的代码,添加到内核源码树中,下面将逐一介绍
(一)阶段一

1 新建一目录,并编写测试代码
  1. cd /home/ok210/nfs/drivers/demo
  2. sudo vim demo.c
复制代码
  1. // /home/ok210/nfs/drivers/demo/demo.c
  2. #include "linux/init.h"
  3. #include "linux/module.h"

  4. static int hello_init(void)
  5. {
  6.         printk(KERN_ALERT"Hello World linux-driver-modulen");//注意,必须是KERN_ALEAT及以上级别,不然不会打印
  7.        return 0;
  8. }

  9. static int hello_exit(void)
  10. {
  11.         printk(KERN_ALERT"Goodbye linux-driver-modulen");
  12.         return 0;
  13. }

  14. module_init(hello_init);
  15. module_exit(hello_init);

  16. MODULE_LICENSE("GPL");
  17. MODULE_AUTHOR("gjianw217@163.com");
复制代码
ps:
(1)mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录。
(2)init.h 定义了驱动的初始化和退出相关的函数,几乎每个linux驱动都有个module_init(与module_exit的定义在Init.h (includelinux) 中)。
(3)module.h 定义了内核模块相关的函数、变量及宏。 如上面的MODULE_LICENSE("GPL")和 MODULE_AUTHOR("gjianw217@163.com")。其
MODULE_LICENSE指定许可,必须指定;MODULE_AUTHOR,声明作者;还有MODULE_DESCRIPTION,对这个模块作一个简单的描述,这个描述是"human-readable"的;MODULE_VERSION,模块的版本;MODULE_ALIAS,模块的别名;MODULE_DEVICE_TABLE,告诉用户空间这个模块支持什么样的设备等。

2 添加编译文件Makefile
sudo  vim Makefile
  1. #demo Makefile
  2. ARCH=arm
  3. CROSS_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
  4. APP_COMPILE=/home/ok210/arm-2009q3/bin/arm-none-linux-gnueabi-
  5. #obj-m := app-drv.o
  6. obj-m := demo.o
  7. #KDIR := /path/to/kernel/linux/
  8. KDIR := /home/ok210/android-kernel-samsung-dev/
  9. PWD := $(shell pwd)
  10. default:
  11.     make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
  12. app:app.c
  13.     $(APP_COMPILE)gcc -o app app.c
  14. clean:
  15.     $(MAKE) -C $(KDIR) M=$(PWD) clean
复制代码
ps:
(1)这个Makefile算是一个通用的模板,其中CROSS_COMPILE和
APP_COMPILE=arm-linux-指定交叉编译器的位置,obj-m指定驱动模块的目标文件(如将驱动模块命令为app-drv.c,则此处应该为app-drv.o);KDIR指定内核的位置。
(2)当执行make时,进行内核模块的编译;当执行make app时,进行应用测试程序的编译;当执行make clean时,删除编译的过程文件

3 编译并加载到板上
   sudo make

4  驱动模块的测试
以上3步都是在ubuntu下执行的,接下来在OK210完成。打开串口终端SecureCRT,进入NFS挂载目录,执行如下程序,
  1. cd /mnt/drivers/demo/
  2. insmod demo.ko
  3. lsmod   demo.ko
  4. rmmod demo.ko
复制代码
最后的结果如下所示,表明成功。

三 下阶段安排
这样驱动模块的基本环境及驱动开发的基本流程介绍完毕,阶段二的介绍,参考附录部分。自此【OK210试用体验】入门篇的4篇博文已完成:

【OK210试用体验入门篇(1):开箱验板【OK210试用体验入门篇(2):板载资源
   
【OK210试用体验入门篇(3):开发环境(软件安装,开发环境,烧写系统)
[url=https://bbs.elecfans.com/jishu_503321_1_1.html][/url]【OK210试用体验】入门篇(4):编程入门(NFS登录、驱动入门)

接下来进行第二阶段的检验,即
【OK210试用体验】功能篇,功能篇现打算从驱动入手,应用提现的原则进行。结合项目要求,主要从以下几个方面进行介绍:
(1)LED显示
(2)Key响应
(3)ADC采集
(4)DS18B20温度检测
(5)IRAD红外探测
(6)PWM驱动
(7)串口通信


同时也
欢迎大家关注本人的微信公众号【口袋物联】,微信号为koudaiwulian。进行交流学习,相互提高。


附录:
1 将驱动代码按类型放到内核源码树相应目录下(drivers/demo/demo.c)
  1. //driver/demo/demo.c
  2. #include "linux/init.h"
  3. #include "linux/module.h"

  4. static int hello_init(void)
  5. {
  6.         printk(KERN_ALERT"Hello World linux-driver-modulen");
  7.         return 0;
  8. }

  9. static int hello_exit(void)
  10. {
  11.         printk(KERN_ALERT"Goodbye linux-driver-modulen");
  12.         return 0;
  13. }

  14. module_init(hello_init);
  15. module_exit(hello_init);

  16. MODULE_LICENSE("GPL");
  17. MODULE_AUTHOR("lpj");
复制代码
2 在当前目录下,分别添加编译文件driver/demo/Makefile文件里,
  1. #driver module demo
  2. obj-$(CONFIG_HELLODRV) += hello.o
复制代码
在driver/demo/Kconfig文件里
  1. menu USER_DEVICE_DRIVERS//4中可以看到它
  2. config HELLODRV
  3. tristate "Hello"
  4. help
  5. This is a demo driver programming.
  6. endmenu
复制代码
3 修改上层目录文件,将其添加到内核中
driver/Makefile文件里
obj-$(CONFIG_HELLODRV)+=demo
在文件里
driver/Kconfig 里
source drivers/demo/Kconfig
在arch/arm/Kconfig文件里
source "drivers/demo/Kconfig"
4进行系统配置并编译
make menuconfigmake
5加载内核镜像文件到板上,使用命令检查
lsmod dmesg

11个回复

abclixu123 发表于 2015-8-1 23:50:04
楼主写的好好,楼主以前是不是就学过啊,感觉写出来都是娓娓道来啊。
gjianw217 发表于 2015-8-2 00:21:13
abclixu123 发表于 2015-8-1 23:50
楼主写的好好,楼主以前是不是就学过啊,感觉写出来都是娓娓道来啊。

谢谢!以前接触过,借这次机会,把自己知道的分享给大家,望大家少走弯路,也算是对以前学到知识的总结吧!
星夜之北 发表于 2015-8-2 10:56:52
    请问自带的内核是完全没有安装nfs吗?我使用NFS4的时候显示的是protocol not support,但是在mount 加入VER=2参数的时候,显示的是connect refused, 改了半天也没改通。尝试把nfs-common移植到arm上也失败了。
gjianw217 发表于 2015-8-2 11:34:32
星夜之北 发表于 2015-8-2 10:56
请问自带的内核是完全没有安装nfs吗?我使用NFS4的时候显示的是protocol not support,但是在mount 加入VER=2参数的时候,显示的是connect refused, 改了半天也没改通。尝试把nfs-common移植到arm上也失败了。

应该是的,因为我在安装NFS的时候,内核中没有选择NFS,故需要自己手动加上!
gjianw217 发表于 2015-9-28 08:45:03
xianyoudian 发表于 2015-9-27 22:24
请问一下,我在板子上挂载NFS一直提示权限错误,该怎么解决

你重新编译内核了吗?我不知道你具体怎么做的,你可以讲一下你的操作流程吗?
h1654155906.7524 发表于 2015-9-28 21:20:11
本帖最后由 qq448309212947 于 2015-9-28 21:21 编辑

为什么我make会出错

root@wang-X550CC:/home/ok210/nfs/led# make
make -C /usr/android-kernel-samsung-dev M=/home/ok210/nfs/led ARCH=arm CROSS_COMPILE=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- modules
make[1]: Entering directory '/usr/android-kernel-samsung-dev'
scripts/Makefile.build:44: /home/ok210/nfs/led/Makefile: 没有那个文件或目录
make[2]: *** No rule to make target '/home/ok210/nfs/led/Makefile'。 停止。
Makefile:1302: recipe for target '_module_/home/ok210/nfs/led' failed
make[1]: *** [_module_/home/ok210/nfs/led] Error 2
make[1]: Leaving directory '/usr/android-kernel-samsung-dev'
makefile:11: recipe for target 'default' failed
make: *** [default] Error 2

gjianw217 发表于 2015-9-28 21:54:15
qq448309212947 发表于 2015-9-28 21:20
为什么我make会出错

root@wang-X550CC:/home/ok210/nfs/led# make

不清楚你具体怎么操作,但你可从如下几点分析:(1)你的Makefile文件在home/ok210/nfs目录吗?(2)你的Makefile文件书写正确吗?命令用Tab开头。(3)你的内核文件编译过了吗?
gjianw217 发表于 2015-9-28 22:03:15
xianyoudian 发表于 2015-9-28 12:09
我就是按照你上面说的方法,重新编译了内核。

选择支持NFS服务了吗?
h1654155906.7524 发表于 2015-9-29 17:01:19
gjianw217 发表于 2015-9-28 21:54
不清楚你具体怎么操作,但你可从如下几点分析:(1)你的Makefile文件在home/ok210/nfs目录吗?(2)你的Makefile文件书写正确吗?命令用Tab开头。(3)你的内核文件编译过了吗?

1.makefile和.c都在nfs里面
2.tab都加了
3.内核编译过了

scripts/Makefile.build:44: /home/ok210/nfs/app/Makefile: 没有那个文件或目录

这个.build是什么意思?
gjianw217 发表于 2015-9-30 01:01:14
xianyoudian 发表于 2015-9-29 21:13
请问 rmmod 移除驱动显示的不是Goodbye 是什么原因

这个我也不清楚,可能是飞凌的一个bug,我在本论坛和飞凌的论坛找过答案,但没有找到解决的方法!如果你找到了,麻烦告知我一下!
gjianw217 发表于 2015-9-30 01:02:16
qq448309212947 发表于 2015-9-29 17:01
1.makefile和.c都在nfs里面
2.tab都加了
3.内核编译过了

不好意思,你百度一下吧,我没有遇到过!
您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /7 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-11-10 21:52 , Processed in 0.597735 second(s), Total 44, Slave 35 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表