搜索
bottom↓
回复: 82

uClinux驱动编写心得(uClinux2.4+S3C44B0X)

[复制链接]

出0入0汤圆

发表于 2008-6-4 00:26:17 | 显示全部楼层 |阅读模式
uClinux驱动编写心得(uClinux2.4+S3C44B0X)
  下面的内容绝大部分不是我写的,我是根据网上前辈高手的教程一步一步来做的。但是,在编译的过程中发现资料还是有点错误和关键点的遗漏。昨晚加上今天一整天,回忆编译的过程,稍微有点理解编译的方法了。晚上改了半个小时,搞定,驱动能用了,虽然仅仅是点个led灯,但是修正编译时的错误就像侦探破案一样,成功后心情真爽啊!我把我修正后的文章重新发出来,让更多人能看到。ps今天又搜索了一整天,还是没找到更多驱动相关的资料,希望大家能够提供下。
  前期准备:
  既然要编写uClinux驱动,就要在操作系统和硬件之间打交道,我用的板子是经典的S3C44B0X,驱动教程基于uClinux2.4版本,2.6版本不太一样,还没有找到资料。
1) 需要掌握针对uClinux的打补丁、裁剪、编译全过程,自己可以编译一个完整的uClinux系统下载到开发板的flash中并正常工作。这方面的教程网上更多,我就下了数个版本。
2) 需要熟悉S3C44B0X的硬件资源,本例子很简单,要想驱动其他东西就复杂咯。

一共要编写2个C文件,一个是led.c,属于驱动文件,另外一个是ledtest.c属于用户程序,还有一个led.h头文件。
  /////////////////////led.h文件内容///////////////////////////
  /****************************************Copyright (c)**************************************************
  **              FREE
  **--------------File Info-------------------------------
  ** File Name: led.h
  ** Last modified Date:  2008-6-3
  ** Last Version: 1.0
  ** Descriptions: User Configurable File
  **----------------------------------------------------
  ** Created By:
  ** Created date:   2008-6-3
  ** Version: 1.0
  ** Descriptions: First version
  **-------------------------------------------------
  ** Modified by:MAMAJINCO
  ** Modified date:2006-9-9
  ** Version:1.0
  ** Descriptions:在此忠心感谢ZLG的模版 我的高质量编程意识起源于此
  *****************************************************/
  //防止重复包含此文件而设置的宏
  #ifndef __CONFIG_H
  #define __CONFIG_H 
  //包含必要的头文件
  #include <linux/config.h>
  #include <linux/module.h> //模块必须包含的头文件
  #include <linux/kernel.h>       /* printk()函数,用于向内核输出信息 */
  #include <linux/fs.h>           /* 很重要 其中包含了如file_opration等结构 此结构用于文件层接口 */
  #include <linux/errno.h>        /* 错误代码*/
  #include <asm/uaccess.h>
  #include <linux/types.h>
  #include <linux/mm.h>
  #include <asm/arch/s3c44b0x.h> 
  /********************************/
  /*     应用程序配置             */
  /********************************/
  //以下根据需要改动
  //定义主设备号 设备名称  
  #define LED_MAJOR_NR 231 //231~239 240~255都可以  
  #define DEVICE_NAME "led"               /* name for messaging */  
  #define SET_LED_OFF 0
  #define SET_LED_ON  1 
  #endif
  /************************End Of File
  *********************************************************/


  
  ////////////////////led.c文件内容////////////////////////////////////
  /*************Copyright (c)**************************
  **              FREE
  **--------------File Info-----------------------------------------
  ** File Name: led.c
  ** Last modified Date:  
  ** Last Version: 1.0
  ** Descriptions: User Configurable File
  **----------------------------------------------------
  ** Created By: ZLG CHENMINGJI
  ** Created date:   2006-9-9
  ** Version: 1.0
  ** Descriptions: First version
  **--------------------------------------------------------
  ** Modified by:MAMAJINCO
  ** Modified date:
  ** Version:1.0
  ** Descriptions:在此忠心感谢ZLG的模版 我的高质量编程意识起源于此
  ***********************************************************/
  #include "led.h"//包含驱动头文件
 
  /************************************************************
                function announce
  ******************************************************/
  //以下是关键函数的声明
  static int led_open(struct inode *inode, struct file *filp);  
  //打开设备时用的 linux把设备当作文件管理 设备最好在用的时候再打开 尽量不要提前
  static int led_release(struct inode *inode, struct file *filp);
  static int led_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
                  unsigned long param);   
  //控制函数 这里用于控制LED亮与灭
  int  led_init(void);//注册时用的 注意 模块注册的越早越好
  void led_cleanup(void);//卸载时用的
  
  /*************************************************************
  **                  "全局和静态变量在这里定义"         
  **        global variables and static variables define here 
  /****************************************************************/  
  static struct file_operations LED_fops =        /* 前面基础部分提到的重要结构体了*/
  {
      owner:      THIS_MODULE,  
  #if 0/*注意:#if 0-#endif里的代码是不编译的,但这里为了驱动模板讲解上的完整性仍然加上了*/
      llseek:     gpio_llseek,
      read:       gpio_read,
      write:      gpio_write,
  #endif
      ioctl:      led_ioctl,//控制函数
      open:       led_open, //打开函数,打开文件时做初始化的
      release:    led_release,//释放函数,关闭时调用
  };
                  
  /**************************************************************
  ** Function name: led_open
  ** Descriptions:  open device
  ** Input:inode:   information of device
  **       filp:    pointer of file
  ** Output 0:      OK
  **        other:  not OK
  ** Created by:    Chenmingji
  ** Created Date:  2006-9-9
  **-------------------------------------------------------------
  ** Modified by:mamajinco
  ** Modified Date: 2006-9-9
  **--------------------------------------------------------------
  **************************************************************/
  
  static int led_open(struct inode *inode, struct file *filp)
  {
   /*初始化放在OPEN里*/ 
   (*(volatile unsigned *)S3C44B0X_PCONC) &= 0xffffffc0;
   (*(volatile unsigned *)S3C44B0X_PCONC) |= 0xffffffd5; /*GPIO C口0~2 设置为输出*/  
   (*(volatile unsigned *)S3C44B0X_PUPC) &= 0xffffffc0;/*GPIO C口0~2 设置为上拉*/  
       MOD_INC_USE_COUNT;
       return 0;         
  }
    
  /*********************************************************
  ** Function name: led_release
  ** Descriptions:  release device
  ** Input:inode:   information of device
  **       filp:    pointer of file
  ** Output 0:      OK
  **        other:  not OK
  ** Created by:    Chenmingji
  ** Created Date:  2006-9-9
  **-----------------------------------------------------
  ** Modified by: mamajinco
  ** Modified Date: 2006-9-9
  **--------------------------------------------------------
  ****************************************************/ 
  static int led_release(struct inode *inode, struct file *filp)
  {
      MOD_DEC_USE_COUNT;
      return(0);
  }
  
  /****************************************************
  ** Function name: led_ioctl
  ** Descriptions:  IO control function
  ** Input:inode:   information of device
  **       filp:    pointer of file
  **       cmd:     command
  **       arg:     additive parameter
  ** Output 0:      OK
  **        other:  not OK
  ** Created by:    Chenmingji
  ** Created Date:  2006-9-9
  **-------------------------------------------------------
  ** Modified by: mamajinco
  ** Modified Date: 2006-9-9
  **----------------------------------------------------------
  ***********************************************************/  
  static int led_ioctl(struct inode *inode, struct file *filp,
                         unsigned int cmd, unsigned long arg)
  {
      if( arg > 2 )//判断IO是否属于0-2
   return -1;
  
      switch(cmd)
      {
          case 0://把ARG传来的IO口编号转换成寄存器数据,把相应IO口置低
           (*(volatile unsigned *)S3C44B0X_PDATC) |= 0x1 << arg;
  
               break;
  
          case 1://把ARG传来的IO口编号转换成寄存器数据,把相应IO口置高
    (*(volatile unsigned *)S3C44B0X_PDATC) &= 0x0 << arg;
               break;
  
          default:
    return -1;
    break;
      }
      return 0;
  }
  
  /**************************************************
  ** Function name: led_init
  ** Descriptions:  init driver
  ** Input:none
  ** Output 0:      OK
  **        other:  not OK
  ** Created by:    Chenmingji
  ** Created Date:  2006-9-9
  **------------------------------------------------
  ** Modified by: mamajinco
  ** Modified Date: 2006-9-9
  **-----------------------------------------------------
  *************************************************/  
  int led_init(void)
  {
      int  result;  
      result = register_chrdev(231,"led",  &LED_fops);
  /*关键语句 用于注册
  ** 注意!这是传统的注册方法 在2.4以上的linux版本中 加入了devfs设备文件系统 使注册更容易 但为了与大部分资料相**同 大家看的方便  这里仍然使用老方法*/
      if (result < 0) //用于异常检测
      {
          printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n", LED_MAJOR_NR ); //printk用于向内核输出信息
          return(result);
      }
      printk(KERN_INFO DEVICE_NAME ": init OK\n");   
   return(0);
  }
  
  
  /*************************************************************
  ** Function name: led_cleanup
  ** Descriptions:  exit driver
  ** Input:none
  ** Output none
  ** Created by:    Chenmingji
  ** Created Date:  2006-9-9
  **--------------------------------------------------------
  ** Modified by: mamajinco
  ** Modified Date: 2006-9-9
  **-----------------------------------------------------
  **************************************************/  
  void led_cleanup(void)
  {
      unregister_chrdev(231, "led"); //与register_chrdev配对使用 用于清楚驱动
  }
  
  /***********************************************************
  **                            End Of File
  ****************************************************/





 
  ///////////////////最后是ledtest.c文件内容///////////////////////
  
  /*********************Copyright (c)**************************
  **              FREE
  **--------------File Info----------------------------
  ** File Name: led.c
  ** Last modified Date:  2006-9-9
  ** Last Version: 1.0
  ** Descriptions: User Configurable File
  **-------------------------------------------------------
  ** Created By: ZLG CHENMINGJI
  ** Created date:   2006-9-9
  ** Version: 1.0
  ** Descriptions: First version
  **--------------------------------------------------------
  ** Modified by:MAMAJINCO
  ** Modified date:2006-9-9
  ** Version:1.0
  ** Descriptions:在此忠心感谢ZLG的模版 我的高质量编程意识起源于此
  ********************************************************/ 
  #include <stdio.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <fcntl.h>
  #include <sys/types.h>
  #include <sys/stat.h>
  
  void delay(int delay)//延时用函数
  {
   int i;
   for(;delay>0;delay--)
   {
    for(i=0 ; i < 5000 ; i ++);  
   }
  }
  
  int main()
  {
   int fd1;
   int j;
   fd1= open("/dev/led" , O_RDWR);/*打开设备,就象打开文件一样简单*/
   if(fd1 == -1)/*异常处理*/
   {
    printf ( "file can not be open" );
    return -1;
   }
   for (j =0 ; j< 10 ; j ++)/*重复10次*/
   {
    ioctl(fd1 , 1 , 0);/*GPC0上LED亮*/
    delay(1000);
    ioctl(fd1 , 0 , 0);/*GPC0上LED灭*/
    ioctl(fd1 , 1 , 1);/*GPC1上LED亮*/
    delay(1000);
    ioctl(fd1 , 0 , 1);/*GPC1上LED灭*/
    ioctl(fd1 , 1 , 2);/*GPC2上LED亮*/
    delay(1000);
    ioctl(fd1 , 0 , 2);/*GPC2上LED灭*/
    delay(1000);
   } 
   close (fd1);/*关闭设备(文件)*/
   return 0;
    
  }
  /***********************************************************
  **                            End Of File
  ****************************************************/
  
  

//////////////////////////////////////////////////
现在有了led.h led.c ledtest.c三个文件了,正式开始吧
  
  PART A 修改驱动
1) 把led.h和led.c 丢到目录uClinux-dist/linux-2.4.x/drivers/char中
2) 修改文件
===============START==============
uClinux-dist/linux-2.4.x/drivers/char/Makefile
----------------------------------------------
obj-$(CONFIG_C5471_WDT) += wdt_c5471.o之后加
obj-$(CONFIG_LED) += led.o
================END============
3) 修改文件
=================START===========
uClinux-dist/linux-2.4.x/drivers/char/Config.in
-----------------------------------------
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
   bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X之后加
   bool 'Test LED Driver' CONFIG_LED
================END=================
4) 修改文件
=================START=============
uClinux-dist/linux-2.4.x/drivers/char/mem.c
-----------------------------------------
开头的地方扎堆加
#ifdef CONFIG_LED
extern void led_init(void);
#endif

int __init chr_dev_init(void)之后加
#ifdef CONFIG_LED
led_init();
#endif
================END==============
5) 继续修改文件
=================START============
uClinux-dist/vendors/Samakmsung/44B0/Makefile
-----------------------------------------
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15\之后加
\
led,c,231,0 \
================END==============



PART B 修改用户程序
1) 把ledtest.c丢入自己建立的目录uClinux-dist/user/ledtest
2) 修改文件
================START============
uClinux-dist/user/Makefile
-----------------------------------------
扎堆加个下面
dir_$(CONFIG_USER_LEDTEST)   += ledtest
=================END===============
3) 修改文件
================START============
uClinux-dist/config/Configure.help
-----------------------------------------
扎堆加个下面
CONFIG_USER_LEDTEST
  Test the LED driver
=================END=============
4) 修改文件,就是在最后加上一段
================START================
uClinux-dist/config/Configure.in
-----------------------------------------
##############################
mainmenu_option next_comment
comment 'LED driver test '

bool 'LEDtest' CONFIG_USER_LEDTEST
endmenu

###############################
=================END=============


PART C 编译
1) make menuconfig
要选中Kernel和User那两个选项,在kernel中的能找到“Test LED Driver”选项,勾上,在user中能找到“LEDtest”,也要勾上,保存退出。
2) make clean
3) make lib_only
4) make user_only
5) make romfs
6) make image
7) make
我的led.c刚开始有不少问题,make会提示是多少行有问题,然后再回去改,还蛮不错的

好了,生成bin文件了

PART D 烧录
只是我的板子的地址,但基本上差不多,在uboot中操作
1) loadb 0x0c008000
2) 发送bin文件
3) erase 0x50000 0x1fffff
4) cp 0x0c008000 0x50000 3370d  
  //3370d根据自己载入文件的大小除以4再加2,我是cdc2e/4+2的
5) save
6) reset

如果没问题,应该能看到uClinux的界面了,下面在板子中运行
1) cd /dev
2)ls
看见里面有个LED了吧?
3) cd /proc
4)cat devices
看见驱动列表吧?
led 231也应该在里面
5)ledtest
在任何地方执行这个语句 就可以看到板子上的灯亮了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2008-6-4 08:11:58 | 显示全部楼层
很好。。。关于LINUX下整驱动的,确实很少很少啊

出0入0汤圆

 楼主| 发表于 2008-6-4 11:56:22 | 显示全部楼层
补充
PART B 修改用户程序
1) 把ledtest.c丢入自己建立的目录uClinux-dist/user/ledtest
目录里要建立makefile文件,内容如下
===============================
EXEC = ledtest
OBJS = ledtest.o

all: $(EXEC)
$(EXEC): $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:
        $(ROMFSINST) /bin/$(EXEC)
clean:
         rm -f $(EXEC) *.elf *.gdb *.o

出0入0汤圆

发表于 2008-6-7 17:07:01 | 显示全部楼层
恩,很不错的参考,不过针对驱动程序比较简单或比较少的情况可以用这种方法把驱动和内核结合在一起,但要是驱动程序比较多的话,内核就会很臃肿,这个时候采用可加载模块的方式比较好.

出0入22汤圆

发表于 2008-6-7 17:28:20 | 显示全部楼层
谢谢楼主。

出0入0汤圆

发表于 2008-6-7 19:58:31 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2008-6-7 20:01:02 | 显示全部楼层
不错!

出0入0汤圆

发表于 2008-6-7 20:16:16 | 显示全部楼层
mark and thinks!

出0入0汤圆

发表于 2008-6-7 22:12:52 | 显示全部楼层
阿虚兄弟 顶一个

出0入0汤圆

 楼主| 发表于 2008-6-10 09:43:48 | 显示全部楼层
昨天做了个中断的驱动,又发现一个错误
===========================================
PART C 编译
1) make menuconfig  
要选中Kernel和User那两个选项,在kernel中的能找到“Test LED Driver”选项,勾上,在user中能找到“LEDtest”,也要勾上,保存退出。
2) make clean
===========================================
make menuconfig下面是
make dep 然后才是
make clean 原文漏了make dep

出0入0汤圆

 楼主| 发表于 2008-6-10 09:46:06 | 显示全部楼层
【3楼】 hjhhaha
积分:24
派别:
等级:------
来自:
恩,很不错的参考,不过针对驱动程序比较简单或比较少的情况可以用这种方法把驱动和内核结合在一起,但要是驱动程序比较多的话,内核就会很臃肿,这个时候采用可加载模块的方式比较好.  
=========================================================
问下uClinux可以加载模块吗?我看到一个视频说linux推荐动态加载,uClinux一般都是编译进内核,不过也没说死,但是没有具体的操作方法

出0入0汤圆

发表于 2008-6-10 11:28:49 | 显示全部楼层
驱动模块是可以动态加载的,这方面的资料也有一些,可以看看<<linux设备驱动程序>>、<<ARM嵌入式Linux系统构建与驱动开发范例>>

出0入0汤圆

发表于 2008-6-10 17:28:25 | 显示全部楼层
做个记号!!

出0入0汤圆

发表于 2008-6-10 17:29:38 | 显示全部楼层
标记

出0入0汤圆

发表于 2008-6-10 21:16:32 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-6-10 23:38:57 | 显示全部楼层
.

出0入0汤圆

发表于 2008-12-20 20:49:40 | 显示全部楼层
好东西

出0入0汤圆

发表于 2009-1-5 17:20:02 | 显示全部楼层
太感谢哥们你了,搞了多年的MCU.编写的第一个uClinux驱动,就是看哥们你的,才成功.

出10入95汤圆

发表于 2009-1-6 22:20:14 | 显示全部楼层
记号。致敬

出0入0汤圆

发表于 2009-1-7 09:53:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-1-7 14:53:37 | 显示全部楼层
楼主你好!

能否把

5)&nbsp;继续修改文件&nbsp;

=================START============&nbsp;

uClinux-dist/vendors/Samakmsung/44B0/Makefile&nbsp;

-----------------------------------------&nbsp;

ttypc,c,3,12&nbsp;ttypd,c,3,13&nbsp;ttype,c,3,14&nbsp;ttypf,c,3,15\之后加&nbsp;

\&nbsp;

led,c,231,0&nbsp;\&nbsp;

================END==============&nbsp;



这个makefile文件传上来。&nbsp;或者发我邮件haiqun_li@126.com



谢谢!

出0入0汤圆

发表于 2009-1-8 11:30:28 | 显示全部楼层
我也是看过MAMAJINCO的blog上关于uclinux驱动,然后才搞定点亮LED的uclinux的驱动编写,可惜没有像你那样整理一下并共享给网友,赞一个.

出0入0汤圆

 楼主| 发表于 2009-1-8 12:02:40 | 显示全部楼层
这是半年前搞得,现在arm7的资料都不在了



uclinux只是过渡,现在搞linux

本贴被 laoki8888 编辑过,最后修改时间:2009-01-08,12:02:56.

出0入0汤圆

发表于 2009-3-10 11:08:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-10 12:42:11 | 显示全部楼层
标记

出0入0汤圆

发表于 2009-3-10 12:47:43 | 显示全部楼层
mark~~~~~~~~~

出0入0汤圆

发表于 2009-3-10 14:16:19 | 显示全部楼层
学习,不过现在没时间

出0入0汤圆

发表于 2009-4-24 11:40:19 | 显示全部楼层
謝謝樓主,寫的很詳細

出0入0汤圆

发表于 2009-5-8 08:58:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-5-8 09:20:33 | 显示全部楼层
顶一下楼主,楼主的钻研精神真值得我佩服

出0入0汤圆

发表于 2009-6-2 17:16:15 | 显示全部楼层
楼主,我是详细看完了你的文档,然后照着上面做了。首先说下我软硬件环境,虚拟机VM上跑的linux,用的44b0板子是恒丰锐科的(资料超烂)。也是想学习如何在uclinux下编写驱动,结果玩一个最简单的就错了。我的板子的LED是接在GPC1-3的,你那个我看程序是GPC0-2,不过我已经修改了,估计你的板子和我的区别不大,毕竟现在市场上的44b0是互相抄袭的。大同小异。

好了,现在来说我遇到的问题。都编译完了,然后在/proc/devices里可以看到led,在/bin里找到ledtest,使用./ledtest运行之。也可以,我使用了打印信息,看到程序是运行了,我追踪,结果在

------------------------------------------------------------------------------------------

printf("执行测试!\n");////////////////////////
     fd1= open("/dev/led",O_RDWR);/*打开设备,就象打开文件一样简单*/
     printf("设备打开!\n");///////////////////////////

-------------------------------------------------------------------------------------------

处就出错了

错误信息如下:

------------------------------------------------------------------------------------------

/bin> ./ledtest
执行测试!
__alloc_pages: 6-order allocation failed (gfp=0x1f0/0)

Allocation of length 171841 from process 40 failed

Buffer memory:        8kB

Cache memory:       20kB

Free pages:        1660kB (     0kB HighMem)

Zone:DMA freepages:     0kB

Zone:Normal freepages:  1660kB

Zone:HighMem freepages:     0kB

( Active: 2, inactive: 5, free: 415 )

= 0kB)

31*4kB 24*8kB 12*16kB 10*32kB 5*64kB 4*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB = 1660kB)

= 0kB)

Unable to allocate RAM for process text/data, errno 12

kmod: failed to exec /sbin/modprobe -s -k net-pf-1, errno = 12

__alloc_pages: 6-order allocation failed (gfp=0x1f0/0)

Allocation of length 171832 from process 42 failed

Buffer memory:        8kB

Cache memory:       20kB

Free pages:        1520kB (     0kB HighMem)

Zone:DMA freepages:     0kB

Zone:Normal freepages:  1520kB

Zone:HighMem freepages:     0kB

( Active: 2, inactive: 5, free: 380 )

= 0kB)

32*4kB 26*8kB 8*16kB 11*32kB 5*64kB 3*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB = 1520kB)

= 0kB)

Unable to allocate RAM for process text/data, errno 12

munmap of non-mmaped memory by process 42 (insmod): 0c670000

munmap of non-mmaped memory by process 42 (insmod): 0c631580

设备打开!
file can not be openpid 30: failed 65280

---------------------------------------------------------------------------------------------

也就是说文件没有打开,设备没有被打开

然后我追踪led.c  

--------------------------------------------------------------------------------------------

printk("进入led.c!\n");////////////////////////
     (*(volatile unsigned *)S3C44B0X_PCONC) &= 0xffffff03;  //765432-0
     (*(volatile unsigned *)S3C44B0X_PCONC) |= 0x00000054;  // 6 4 2-1  和上面一合并,就是765432-010101
     //(*(volatile unsigned *)S3C44B0X_PUPC) &= 0xff03;   //GPIO C口1~3 设置为上拉
     (*(volatile unsigned *)S3C44B0X_PUPC) |= 0x00fc;   //GPIO C口1~3 不设置为上拉
         MOD_INC_USE_COUNT;
         return 0;         

---------------------------------------------------------------------------------------------

结果压根就没有进入led.c中的led_open函数,请问这是为什么啊?

有没有遇到过,盼复!!!我是新手,谢了。

出0入0汤圆

 楼主| 发表于 2009-6-2 18:09:40 | 显示全部楼层
看看dev目录有没有led这个东西

出0入0汤圆

发表于 2009-6-2 20:55:52 | 显示全部楼层
有啊  
/dev> ls
console  cua0     cua1     kmem     led      mem      null     ptyp0   
ptyp1    ptyp2    ptyp3    ptyp4    ptyp5    ptyp6    ptyp7    ptyp8   
ptyp9    ptypa    ptypb    ptypc    ptypd    ptype    ptypf    ram0     
ram1     random   rom0     rom1     rom2     rom3     rom4     rom5     
rom6     rom7     rom8     rom9     tty      tty0     tty1     tty2     
tty3     ttyS0    ttyS1    ttyp0    ttyp1    ttyp2    ttyp3    ttyp4   
ttyp5    ttyp6    ttyp7    ttyp8    ttyp9    ttypa    ttypb    ttypc   
ttypd    ttype    ttypf    urandom  zero

出0入0汤圆

发表于 2009-6-2 20:59:02 | 显示全部楼层
冒昧的问一句 laoki8888 阿虚 ,能不能加你qq问一下,我的是249033427。不胜感激!

出0入0汤圆

发表于 2009-6-2 21:06:17 | 显示全部楼层
看看

出0入0汤圆

发表于 2009-6-2 21:38:28 | 显示全部楼层
记号,等最近的功能实现了就来移植一下

出0入0汤圆

发表于 2009-6-3 14:34:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-3 14:51:36 | 显示全部楼层
问题已经解决了,自己的失误。原来我一直盯着led.c找错误,没想到错误在led.h中。由于它之中有一个#define DEVICE_NAME "led"  /*......*/  就是这个地方  后面有几个中文空格,故导致错误。在led.c中当时是体现出来了,说是有字符问题,但是一直都是提示led.c中 printk(KERN_ERR DEVICE_NAME ":Unable to get major %d\n",LED_MAJOR_NR); 出错。我把之前的那种有中文空格的都删去了,他还是一直出错,最后我想反正是打印信息,不影响(正是这种不负责任的思想,导致走了弯路)。就把它给注释了。结果就编译过去了。而且在/proc和/dev底下都出现了led,一度让给我一种假象,以为这个驱动已经是好的了。直到我把应用程序检查了N遍,都没有问题,我又回来怀疑驱动。直接怀疑程序调用甚至是代码是不是有问题,直到刚才又重新重视了printk这个错误,才发现了led.h中的这个bug。改完之后,就ok了。(其实代码啥问题都冒得)
     总结出二个问题:
     1.怎么led.h之中有这么一个问题,编译器没有明确指出,呵呵,编译器的问题,没有办法深究了。还是找自身的问题吧。
     2.led.h是有问题的,编译led.c时实际上已经初现端倪,但是被我粗心大意错过了,导致饶了一大圈才回来。花了不少冤枉时间。不好的一面,浪费了时间;好的一面,又吸取了一次教训,积累了一点经验。一定不能粗心大意,不能放过一个问题,因为极有可能就是这个问题导致了最终的问题。

出0入0汤圆

 楼主| 发表于 2009-6-3 14:53:16 | 显示全部楼层
好像现在这种44b0也可以直接上linux了

放弃uclinux吧

出0入0汤圆

发表于 2009-6-3 15:08:04 | 显示全部楼层
啊,不是都说linux需要MMU吗?44b0上linux会不会很吃力哦!
不过谢谢 laoki8888 阿虚 的回答,有空我移植上去试一试。
由于目前有个项目上在用uclinux,暂时先凑合下,其实我现在看LDD3,上面的例子都是在linux底下的,的确是有点小郁闷。
呵呵,继续努力!!!

出0入0汤圆

发表于 2009-6-3 16:38:24 | 显示全部楼层
问问阿虚哪里看到44b0也可以直接上linux,我想看看,有链接吗?

出0入0汤圆

发表于 2009-6-10 16:50:41 | 显示全部楼层
请问楼主:
您的main函数中并没有向linux内核加led这个设备,也就是没有调用init_led函数,哪怎么能打开这个设备呢?
关于uclinux,我也正准备研究一下,但是我不知道应该有些什么准备工作呢?比如linux原理是否需要知道,makefile是否需要了解,开发板及开发环境方面能否给点帮助?
请您发到我的邮箱:zhangyu1986517@163.com
谢谢

出0入0汤圆

发表于 2009-6-11 09:07:34 | 显示全部楼层
代楼主回答问题一二,To 楼上:

问题一

向内核添加led这个设备不是说要在main函数里添加了才算添加了的,这已经是一个操作系统了,如果每一个驱动的初始化还非要在应用程序中来搞的话,那是很恐怖的,好比说你用VC编一个应用程序,想使用串口,结果你还要在程序之中对串口初始化一下(指最底层的那种,不是配置),那多麻烦。操作系统会帮你搞定这些事,你到时候只要申请资源、配置使用,如是而已。

再说,添加驱动这一部分,在下面这一部分中说的相当得清楚。你应该认真看下了哦。至于为什么这样做了,就已经初始化了,那你应该看看uclinux开机时都执行了哪些代码,这就不是一两句话能说明白的哦。你自己好好看看吧。

PART A 修改驱动
1) 把led.h和led.c 丢到目录uClinux-dist/linux-2.4.x/drivers/char中
2) 修改文件  
===============START==============
uClinux-dist/linux-2.4.x/drivers/char/Makefile
----------------------------------------------
obj-$(CONFIG_C5471_WDT) += wdt_c5471.o之后加
obj-$(CONFIG_LED) += led.o
================END============
3) 修改文件
=================START===========
uClinux-dist/linux-2.4.x/drivers/char/Config.in
-----------------------------------------
if [ "$CONFIG_CPU_S3C44B0X" = "y" ]; then
   bool 'Samsung S3C44B0X serial ports support' CONFIG_SERIAL_S3C44B0X之后加
   bool 'Test LED Driver' CONFIG_LED
================END=================
4) 修改文件
=================START=============
uClinux-dist/linux-2.4.x/drivers/char/mem.c
-----------------------------------------
开头的地方扎堆加
#ifdef CONFIG_LED
extern void led_init(void);
#endif

int __init chr_dev_init(void)之后加
#ifdef CONFIG_LED
led_init();
#endif
================END==============
5) 继续修改文件
=================START============
uClinux-dist/vendors/Samakmsung/44B0/Makefile
-----------------------------------------
ttypc,c,3,12 ttypd,c,3,13 ttype,c,3,14 ttypf,c,3,15\之后加
\
led,c,231,0 \
================END==============


问题二

关于准备工作,要准备的多了哦,你要下载一定得资料,买一些基础的书,了解下uclinux的文件结构,工作原理,这些都是必须的。Makefile可以说是Linux编译链接文件的灵魂,是你了解文件之间联系的法宝,也是Linux的一大特色和优势。那你说你还需不需要了解?开发板,现在市面上多的很,不过要论性价比,我推荐老牌名店-友善之臂,学习用,足矣。而且价格又公道,童叟无欺!至于开发环境,一个稍微正规点的开发板的资料上都会给你讲得清清楚楚。呵呵!

最后说一句,不要老是来一句,请发到我的邮箱。。。。。。之类云云。。。。
不是所有的高手每天都来浏览这些论坛的,浏览了也未必能看到你的帖子,看到了也未必想回答,回答了也未必就会发到你邮箱。。。
毕竟,天下没有免费的午餐(这倒并不是说高手都没有Linux之共享精神)。师傅领进门,修行在个人。还有,学会问问题。

PS:我说这么多,不是因为我是高手,恰恰我只是一个菜鸟,正因为我也曾走过楼上现在正走的路,所以才将个人的理解与想法拿出来共勉。如果您觉得在瞎说,没道理,那就当没看到。呵呵,请楼主及各位大牛大虾指正!

出0入0汤圆

发表于 2009-10-20 16:11:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-28 16:06:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-29 17:17:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-30 21:04:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-30 10:25:44 | 显示全部楼层
zhe me hao d dong xi kan l

出0入0汤圆

发表于 2010-4-2 14:44:06 | 显示全部楼层
mark and thanks!

出0入0汤圆

发表于 2010-4-2 16:12:38 | 显示全部楼层
不错,学习一下;

出0入0汤圆

发表于 2010-4-2 16:26:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-26 13:44:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-27 22:00:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-28 10:29:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-28 16:22:32 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-7-1 12:18:28 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-9-3 22:05:09 | 显示全部楼层
学习学习啦

出0入0汤圆

发表于 2010-9-12 00:37:00 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-9-16 16:43:43 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-9-17 17:09:14 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2010-9-26 16:12:11 | 显示全部楼层
不错

出0入0汤圆

发表于 2010-10-26 09:39:04 | 显示全部楼层
不错。有些收获

出0入0汤圆

发表于 2010-10-27 10:28:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-1 15:03:30 | 显示全部楼层
定啊。。。。。。。。。。。。。

出0入0汤圆

发表于 2011-3-1 16:14:44 | 显示全部楼层
虚哥就是强,膜拜

出0入0汤圆

发表于 2011-3-1 16:45:33 | 显示全部楼层
一直在玩ucos的人路过,羡慕嫉妒恨

出0入0汤圆

发表于 2011-3-2 14:15:38 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2011-3-4 21:44:25 | 显示全部楼层
真的是好东西啊,学了不少东西

出0入0汤圆

发表于 2011-3-7 21:37:42 | 显示全部楼层
顶了!!!!!!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2011-4-7 14:48:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-5 13:56:21 | 显示全部楼层
mark,受用

出0入0汤圆

发表于 2011-7-24 14:47:57 | 显示全部楼层
好文章~~

出0入0汤圆

发表于 2011-7-24 22:39:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-27 13:08:10 | 显示全部楼层
要顶……

出0入0汤圆

发表于 2011-9-18 15:08:32 | 显示全部楼层
MARK

出0入8汤圆

发表于 2011-9-27 22:50:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-31 22:28:07 | 显示全部楼层
收藏,学习

出0入0汤圆

发表于 2012-6-26 10:09:37 | 显示全部楼层
支持楼主!不错的东西

出0入0汤圆

发表于 2012-9-14 15:06:18 | 显示全部楼层
嗯,赞一个

出0入0汤圆

发表于 2012-10-10 16:06:44 | 显示全部楼层
现在正在折腾linux,每天都被各种问题困扰,多谢楼主分享的经验。

出0入0汤圆

发表于 2013-5-15 10:45:25 | 显示全部楼层
现在进行时,谢谢楼主分享。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 17:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表