冰帝 发表于 2015-6-16 21:30:50

Linux驱动开发笔记-第一天基础知识

Linux驱动开发笔记-第一天基础知识

为了能把学过的东西做好记录,今天开始把笔记发上论坛,以便以后参考。
实战:
硬件:TQ210开发板
软件:官方提供的uboot,kernel,rootfs(busybox)源码
目标:让系统在开发板跑起来!
步骤:
uboot:
1.解压uboot源码
tar -jxvf uboot-xxx.tar.bz2
tar -zxvf uboot-xxx.tar.gz
2.进入uboot源码根目录,进行配置
make distclean //清除源码之前的配置信息
make xxxx_config //针对具体的开发板进行配置,来自Makefile
3.修改Makefile
ARCH=arm
CROSS_COMPILE=arm-linux-
4.make all //编译,生成u-boot.bin,烧写验证即可
5.目标:一定要有串口信息,一定要有网络功能或者USB(便于调试)
6.提高:最好还是掌握uboot的启动流程!

kernel:
1.解压内核源码
   tar -jxvf linux-xxx.tar.bz2
   或者
   tar -zxvf linux-xxxx.tar.gz
2.进入内核源码,进行配置
make xxxx_defconfig
或者
cp arch/arm/configs/xxxx_defconfig .config

修改Makefile
ARCH=arm
COSS_COMPILE=arm-linux-

3. 一定做三个检查
   make menuconfig
   System type->
      1.检查是否支持当前ARM架构
                2.检查是否支持当前处理器(S5PV210)
      3.检查是否支持当前开发板(CW210,smdkv210...)
4.make zImage / make uImage
5.用新内核来引导系统
6.如果出现问题:
   时钟
   串口的初始化一定要关注
答案:在平台代码(arch/arm/mach-s5pv210/mach-cw210.c)(切记一定要多看!)

rootfs(体力活):
1.通过配置编译busybox
2.创建必要的目录
mkdir etc lib dev proc sys(5大必须目录)
3.部署库(在交叉编译器中)
1.拷贝所有的库,缺点是浪费闪存空间
2.通过命令超找需要的库
    arm-linux-readelf -a 应用程序 | grep "Shared"
    别忘记拷贝动态链接库(ld-*)
4.添加必要的系统启动的配置文件,在etc中
5.首先通过nfs或者ramdisk进行验证

交叉编译器:最好使用官方提供的编译器!
面试题:
1.请描述uboot的作用或者你对它的认识。
   1.硬件初始化
   2.uboot的终极作用,引导内核并且给内核传递参数
2.产生嵌入式linux系统的启动流程。

uboot的启动参数:
bootcmd:加载并且启动内核
               setenv bootcmd tftp 50008000 zImage \; bootm 50008000
               或者
               setenv bootcmd nand read 50008000 200000 500000 \; bootm               50008000

bootargs:内核就是一个大程序而已,执行最后需要挂接一种根文件系统,将权限
               交给用户,挂接文件系统的类型需要bootargs来指定
                setenv bootargs root=/dev/nfs nfsroot=.....
                或者
                setenv bootargs root=/dev/mtdblock2....
                或者
                setenv bootargs root=/dev/ram ....

内核配置编译案例:
硬件背景:开发板上有个LM77温度传感器芯片
软件要求:实现LM77的驱动程序
解决方案:
1.看内核是否支持或者已有了这款芯片的驱动
进入内核源码执行
make menuconfig
2.搜索LM77关键字,得到一下信息:
   Symbol: SENSORS_LM77 [=m]                                                            │
│ Prompt: National Semiconductor LM77                                                    │
│   Defined at drivers/hwmon/Kconfig:509                                                 │
│   Depends on: HWMON [=y] && I2C [=y]                                                   │
│   Location:                                                                            │
│   -> Device Drivers                                                                  │
│       -> Hardware Monitoring support (HWMON [=y])
3.既然有LM77的配置选项信息,表明内核肯定就有对应的驱动程序,
请问驱动的源码在哪里?
4.答案:
   1.打开drivers/hwmon/Kconfig,找到对应的LM77配置信息处
   config SENSORS_LM77 就可以得到对应给Makefile使用得配置项:
   CONFIG_SENSORS_LM77
   2.打开Makefile,找到CONFIG_SENSORS_LM77,就可以找到如下信息:
   obj-$(CONFIG_SENSORS_LM77) += lm77.o
   3.就可以找到对应的源码为lm77.c

问:如果找到了lm77.c源码,如何找对应的内核配置信息?

*:把源码和内核源码编译在一起
M:把源码编译成模块,和内核分开编译
---------------------------------------------------------------------------------
案例:要求开发板采用官方内核
内核版本:Kernel_2.6.35.7_CW210_for_Linux_v1.0.tar.gz
开发板目前情况:u-boot-1.3.4,rootfs已经跑起来!
实验步骤:
1.修改/opt目录的用户和组的信息,将其修改为tarena用户
   sudo chown tarena /opt -R
   sudo chgrp   tarena /opt -R
2.解压官方内核,解压到/opt/
   tar -zxvf Kernel_2.6.35.7_CW210_for_Linux_v1.0.tar.gz -C /opt
3.进入opt目录,修改内核源码目录的名称
   cd /opt
   mv cw210_kernel_2.6.35.7 kernel //重命名为kernel目录
4.进入内核源码根目录/opt/kernel,进行配置
   cp config_CW210_linux_V1.0 .config
5.执行make menuconfig 做三个检查
   System Type->
         ARM system type (Samsung S5PV210/S5PC110)--->   
         Board selection (SMDKV210)--->   
6.make zImage
7.cp arch/arm/boot/zImage /tftpboot
注意:uboot的bootcmd必须设置为网络启动方式
            setenv bootcmd tftp 50008000 zImage \; bootm 50008000
注意:采用网络文件系统的启动方式(NFS)
            setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/opt/rootfs
            ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0::eth0:on                      init=/linuxrc console=ttySAC0,115200
问:init=/linuxrc能不能不写,或者写错init=tarena
问:console=ttySAC0能不能不写或者写错console=ttySAC,看看出错的信息!

8.网络文件rootfs拷贝到/opt/目录
   cp /home/tarena/workdir/rootfs/rootfs /opt -frd
9.修改exports添加NFS共享目录
   sudo vim /etc/exports在文件最后添加信息如下:
   /opt/rootfs *(rw,sync,no_root_squash)
10.重启nfs网络服务
    sudo /etc/init.d/nfs-kernel-server restart
    sudo /etc/init.d/tftpd-hpa restart

加载模块问题:
/ # modinfo hellokernel.ko
modinfo: can't open '/lib/modules/2.6.35.7-Concenwit/modules.dep': No such file or directory

解决方法:
1.进入内核源码目录/opt/kernel
1.1.执行模块编译命令
make modules
1.2.执行模块安装命令
make modules_install INSTALL_MOD_PATH=/opt/
结果是在/opt目录下面会新生成一个新目录lib
2.将生成的lib下所有的东西拷贝到开发板使用的rootfs/lib下即可
mv /opt/lib/* /opt/rootfs/lib
3.在用modinfo查看模块信息
页: [1]
查看完整版本: Linux驱动开发笔记-第一天基础知识