zoukankan      html  css  js  c++  java
  • driver基础

    驱动测试时,linux驱动常以模块方式插入内核。
    应包含头文件:linux/kernel.h,linux/module.h

    设备驱动的一般结构:
    Soc(主芯片->设备控制器->外设引脚)
    --------------------------------
    设备相关芯片(DM9000/MM8960/MAX3232)
    --------------------------------
    设备插接件(RJ45/Speaker/DB9)

    系统中的每个设备由“设备特殊文件”来代表,通过/dev访问驱动程序,/dev目录下的文件可用来访问驱动程序。
    /dev/ttySAC0  板上串口设备
    /dev/tty0-6   虚拟控制台
    /dev/zero     软件设备
    /dev/null     空设备
    /dev/urandom  随机数字
    /dev/dsp      音频声卡

    常用设备文件操作方法:
    1)重定向符 > 写设备
    echo data > /dev/ttyS0
    cat sunflower.bmp > /dev/fb0
    cat ringing.wav > /dev/dsp
    2)cat 读设备
    cat /dev/ttyS0 (pc linux)
    cat /dev/ttySAC0 (板子 linux)
    3)dd 读写设备
    将文件写入串口中
    dd if=1.txt of=/dev/ttySAC0
    写入0x00到2.txt中,每次读写的数据量是512个字节,写入2次
    dd if=/dev/zero of=2.txt count=2 bs=512
    随即显示
    dd if=/dev/urandom of=/dev/fb0
    播放1.wav文件
    dd if=1.wav of=/dev/dsp

    MMU/CORE/SOC/SDRAM之间的关系
    ProcessCore = ALU + Register(PC, R0-R15, CPSR)
    CORE = ProcessCore + MMU + CP15 + cache
    SOC = CORE + SFR + iROM + iRAM
    SOC <=bus=> SDRAM

    CP15为协处理器,管理MMU

    无论在用户应用程序,还是内核模块中,打印出的变量(全局和局部)、函数名都是虚拟地址。
    裸板编程中用到的地址,从数据手册中得到的地址,都是没有启用mmu的,代表的都是物理地址。
    LDR/STR命令中,涉及到的内存地址,从本质上说,都是虚拟地址。
    当MMU没有启用时,上面的虚拟地址等于物理地址;如果启用MMU,这些虚拟地址就会映射为不同的物理地址。

    内核空间和用户空间:
    1.x86 linux内存设计
      0-3G用户空间(0x0-0xC0000000)
      3G-4G系统空间(0xC0000000-0xFFFFFFFF)
    2.ARM linux内存设计
      0-(3G-16M) 用户空间(0x0-0xBF000000)
      (3G-16M)-3G 内核模块(0xBF000000-0xC0000000)
      3G-4G 系统空间

    linux驱动用虚拟地址,而不是物理地址,其运行于内核态(3G-4G)。
    物理地址映射为虚拟地址,采用mmap()或ioremap()函数。
    #include <asm/io.h>
    volatile unsigned int *V_ULCON0;
    volatile unsigned int *V_UCON0;
    V_ULCON0 = ioremap(0xE2900000, 4);
    V_UCON0 = ioremap(0xE2900004, 4);

    //****紧挨着的物理地址可同时映射
    volatile unsigned int *V_ULCON0;
    volatile unsigned int *V_UCON0;
    volatile unsigned char *v_base;

    v_base = ioremap(0xE2900000, 8);
    V_ULCON0 = v_base;
    V_UCON0 = v_base + 4;

    V_ULCON0 = 0x3;
    V_UCON0 = 0x5;


    驱动卸载时要解除映射。
    iounmap(v_base);


    常用网站:
    http://lxr.free-electrons.com/在线阅读linux内核源码,查找内核符号的定义和引用。
    http://kernelbook.sourceforge.net/kernel-api.html/查找哪些函数可以在模块中使用。

    交互式传输文件方法:
    1.串口(通过xmodem协议)
      开发板上输入rx hello
      pc机:ctrl+a z =>s发送文件(minicom)
      minicom的设置采用命令:sudo minicom -s
    2.nfs开发板上挂在共享文件
      mount -t nfs -o tcp,nolock  192.168.103.200:/home/akaedu/rootfs /mnt
      注:192.168.103.200为PC ip地址。
    3.ftp下载
      ftp登录后put上传。
      ftp登录后PC机上目录切换采用命令lcd。

    ftp脚本:
    ftp.sh

    #! /bin/sh
    DIR=$1
    FILE=$2
    ftp -i -in <<!
    open 192.168.0.200 21
    user username password
    cd /home
    lcd $DIR
    binary
    put $FILE
    bye
    !

    应用:
    ./ftp.sh para1 para2
    参数para1为文件所在目录
    参数para2为文件名
    ./ftp.sh ./   hello

    可将ftp.sh移动至/bin目录下,方便操作。


  • 相关阅读:
    storyboard上添加scrollView(container)
    RESideMenu第三方storyboard的使用方法
    素材网
    iOS 播放音频的几种方法
    正则表达之----验证数字的正则表达式集
    ios汉字转拼音首字母
    iOS-常见问题
    iOS 开发之 点击tabbarItem添加是否跳转登录页面判断
    实验六——bookstore系统模块测试缺陷报告
    作业五
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/5572890.html
Copyright © 2011-2022 走看看