主题 : mini2440开发入门时的疑问?(实例……) 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 12616
精华: 0
发帖: 56
金钱: 285 两
威望: 57 点
综合积分: 112 分
注册时间: 2010-01-10
最后登录: 2013-12-31
楼主  发表于: 2010-01-18 11:26

 mini2440开发入门时的疑问?(实例……)

7.2.1 LED 测试程序

     程序源代码说明:
       驱动源代码所在目录                      /opt/FriendlyARM/mini2440/linux-2.6.29/drivers/char
       驱动程序名称                               mini2440_leds.c
       设备类型                                    misc
       设备名                                     /dev/leds
       测试程序源代码目录                         /opt/FriendlyARM/mini2440/examples/leds
       测试程序名称                               led.c
       测试程序可执行文件名称                     led
       说明:LED 驱动已经被编译到缺省内核中,因此不能再使用insmod 方式加载。  

测试程序清单:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/ioctl.h>

    int main(int argc, char **argv)
    {
     int on;
     int led_no;
     int fd;

    /* 检查led 控制的两个参数,如果没有参数输入则退出。*/
     if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 || sscanf(argv[2],"%d", &on) != 1 ||
         on < 0 || on > 1 || led_no < 0 || led_no > 3) {
        fprintf(stderr, "Usage: leds led_no 0|1\n");
        exit(1);
     }

    /*打开/dev/leds 设备文件*/
     fd = open("/dev/leds0", 0);

     if (fd < 0) {
         fd = open("/dev/leds", 0);
     }
     if (fd < 0) {
         perror("open device leds");
         exit(1);
     }

    /*通过系统调用ioctl 和输入的参数控制led*/
     ioctl(fd, on, led_no);
    /*关闭设备句柄*/
     close(fd);
     return 0;
    }

       你可以按照上面的 hello 程序的步骤手工编译出 led 可执行文件,然后下载到开发板运
行它。


我的疑问是:
                       上面红色部分的程序说明中的驱动程序mini2440_led.c文件和测试程序led.c有什么联系,  LED工作时这些文件到底是怎么相互联系的,还有向开发板下裸机程序,只能用JTAG吗?别的办法怎么下?  能不能用USB?                                                    
不抱怨,不放弃!
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-01-18 13:09

上面红色部分的程序说明中的驱动程序mini2440_led.c文件和测试程序led.c有什么联系, LED工作时这些文件到底是怎么相互联系的

硬件测试程序和硬件驱动程序交互的不外乎是驱动程序放出的接口,这个接口包括设备节点,设备文件操作/IO控制等。led.c中都有反映:
复制代码
  1. fd = open("/dev/leds0", 0);

首先,led设备驱动注册了一个字符型设备,注意它的名字不一定是你这里看到的leds0, 但它的主、次设备号(major/minor number)一定和这个例子中的/dev/leds0设备节点相同。事实上,只要你知道这个字符型设备的major和minor号,你可以在用"mknod /dev/name_of_device c <major> <minor>" 命令创建任意名字的节点来代表这个设备。内核会根据这个节点的major/minor号来匹配到正确的驱动。这也是你为什么看到这个程序里会有一段莫名其妙的出错处理:
复制代码
  1. if (fd < 0) {
  2.          fd = open("/dev/leds", 0);
  3.      }

友善之臂自己也搞不清这个设备应该叫什么?

复制代码
  1. ioctl(fd, on, led_no);

其次,这个驱动程序“肯定”定义了值为“0”和“1”两个ioctl命令,分别用来对应控制相应led(由传给驱动的led_no值决定)的关和开
两个状态。ioctl是一个通用的用来和设备驱动沟通的接口。通过驱动程序自定义的控制命令,调用ioctl()接口的程序可以让驱动程序执行任何预定义好的任务。注意这里的fd参数一定是前面对相应设备调用open()所返回的描述符(句柄)。

事实上,字符型设备驱动通常都定义有一个file_operations结构,里面就包含了open, close, ioctl, read, write等系统调用的处理函数。当用户空间的测试程序调用某一个系统调用时,驱动中相对应的处理函数就会被执行以完成设备特定的任务。
关于字符型设备驱动的概念,看Linux Device Driver 第三版的相应章节。


还有向开发板下裸机程序,只能用JTAG吗?别的办法怎么下?  能不能用USB?

裸机程序(或许应该叫非操作系统程序)用什么下载取决于开发板中**现有的**程序,如果开发板中已经有一个可以支持USB Device controller的程序在运行,当然可以通过USB下载任何东西。supervivi本身就是这样一个裸机程序,不是吗?
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 11414
精华: 0
发帖: 15
金钱: 85 两
威望: 23 点
综合积分: 30 分
注册时间: 2009-12-07
最后登录: 2010-03-10
2楼  发表于: 2010-01-19 17:24
对于如何运行编译好的程序,建议首先通过nfs启动(使用远程的文件系统)
启动成功后,不必管板子了,就在nfs宿主机上进行开发编译,然后将结果放到挂载的文件系统上。你可以通过串口看到远程文件系统中的所有文件。那么你就可以在串口下运行编译的结果了。

这样不用每次通过usb等方式下载目标文件了。

快捷很多,不是吗?
Eddy Lau (Sun Boy)
级别: 圣骑士
UID: 11202
精华: 1
发帖: 364
金钱: 1885 两
威望: 380 点
综合积分: 748 分
注册时间: 2009-11-30
最后登录: 2010-04-12
3楼  发表于: 2010-01-19 21:07
引用第2楼zwinger于2010-01-19 17:24发表的  :
对于如何运行编译好的程序,建议首先通过nfs启动(使用远程的文件系统)
启动成功后,不必管板子了,就在nfs宿主机上进行开发编译,然后将结果放到挂载的文件系统上。你可以通过串口看到远程文件系统中的所有文件。那么你就可以在串口下运行编译的结果了。

这样不用每次通过usb等方式下载目标文件了。

.......


他们说的是裸机程序的传送, 并非在操作系统下的程序传送.

為什麼生世間上 此間許多哀與傷 為什麼爭鬥不絕 歡欣不永享 
問為何人存隔膜 顏面無真相 問那天可找得到 理想中的烏托幫 
级别: 侠客
UID: 11182
精华: 0
发帖: 69
金钱: 350 两
威望: 70 点
综合积分: 138 分
注册时间: 2009-11-29
最后登录: 2011-11-27
4楼  发表于: 2010-01-20 15:55

 回 1楼(kasim) 的帖子

K大,太崇拜你了,讲的真好

无条件,极其的崇拜你。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
5楼  发表于: 2010-01-20 16:13

 回 4楼(圣斗士沙加) 的帖子

想要支持我的话,多来论坛做贡献就可以了
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 126
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2008-02-20
最后登录: 2010-02-02
6楼  发表于: 2010-01-21 01:50
路过。。。。。
级别: 新手上路
UID: 13277
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2010-01-21
最后登录: 2010-01-26
7楼  发表于: 2010-01-21 15:41
学习了,谢谢你们!
生生不息
级别: 新手上路
UID: 13227
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
综合积分: 16 分
注册时间: 2010-01-20
最后登录: 2010-06-01
8楼  发表于: 2010-01-24 16:55

 回 4楼(圣斗士沙加) 的帖子

我刚来论坛 两次看到你针对同一个人发类似的帖子了
真晕
arm卒
级别: 新手上路
UID: 68274
精华: 0
发帖: 32
金钱: 165 两
威望: 33 点
综合积分: 64 分
注册时间: 2012-04-20
最后登录: 2014-04-09
9楼  发表于: 2012-05-20 21:00
受教了,新手入门