搜索
bottom↓
回复: 4

linux底下点亮ok6410第一个LED灯

[复制链接]

出0入0汤圆

发表于 2013-4-11 19:54:05 | 显示全部楼层 |阅读模式
本帖最后由 天下无伤 于 2013-4-11 19:55 编辑

环境及工具:

 linux-2.6.36内核  硬件平台ok6410   

测试基本流程:

  pc与ok6410通过nfs文件系统成功连接后,编译驱动和app程序即可测试

  1://建立nfs文件系统,让板子能和pc机建立通信。
  2:#make     //编译驱动程序
  3:#arm-linux-gcc  LED_APP.c  -o  LED_APP   //编译app程序
  4:将测试程序拷贝到的是nfs下的文件系统中的/home/yufeng/nfs
  5:板子连接好NFS文件系统,并打开PC机下的串口终端, 启动后加载驱动模块   

              #insmod LED.ko

  6:创建设备文件   #mknod  /dev/my_led  c   240  0
  7:测试  ./LED_APP



遇到的问题: 

 提示ioctl错误,原因是2.6.3以后的内核file_opretione 将ioctl改为了Ulockl_ioctl,

 提示KELLOC 错误,原因添加LINUX_TBLS.H

  提示arm-linux-gcc 找不到,原因交叉编译环境及超级用户权限问题

   以上导致make编译不过,

   提示MODULE   LICENSE错误,原因是要定义MODULE_LICENSE("GPL" ); ,看了OK6410内核驱动模块是GPL

  这里就改为GPL,如果不是,加载时会提示错误。




先粘贴代码

1驱动程序LED.C

#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* copy_to_user,copy_from_user */
#include <linux/miscdevice.h>
#include <linux/pci.h>
#include <mach/map.h>
#include <mach/regs-gpio.h>
#include <mach/gpio-bank-m.h>
#include <plat/gpio-cfg.h>


MODULE_LICENSE("GPL" );


#define LED_MAJOR 240

int led_open (struct inode *inode,struct file *filp)

{
unsigned tmp;  
         tmp = readl(S3C64XX_GPMCON);  
tmp = (tmp & ~(0x7U<<1))|(0x1U);  
         writel(tmp, S3C64XX_GPMCON);
printk("#########open######\n");
return 0;
}

ssize_t led_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
{
printk("#########read######\n");
return count;
}


ssize_t led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
{
char wbuf[10];
unsigned tmp;  
printk("#########write######\n");
copy_from_user(wbuf,buf,count);
switch(wbuf[0])
{
  case 0:  //off
   tmp = readl(S3C64XX_GPMDAT);  
                    tmp |= (0x1U);  
                    writel(tmp, S3C64XX_GPMDAT);
   break;
  case 1:  //on
   tmp = readl(S3C64XX_GPMDAT);  
                    tmp &= ~(0x1U);  
                    writel(tmp, S3C64XX_GPMDAT);
   break;
  default :
   break;
}
return count;
}

int led_release (struct inode *inode, struct file *filp)
{
printk("#########release######\n");
return 0;
}

struct file_operations led_fops ={
.owner = THIS_MODULE,
.open = led_open,
.read = led_read,
.write = led_write,
.release = led_release,
};

int __init led_init (void)
{ int rc;
printk ("Test led dev\n");
rc = register_chrdev(LED_MAJOR,"led",&led_fops);
if (rc <0)
{
  printk ("register %s char dev error\n","led");
  return -1;
}
printk ("ok!\n");
return 0;
}

void __exit led_exit (void)
{
unregister_chrdev(LED_MAJOR,"led");
printk ("module exit\n");
return ;
}

module_init(led_init);
module_exit(led_exit);




LED_APP.C测试程序

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main (void)
{
int fd;
char buf[10]={0,1};
fd = open("/dev/my_led",O_RDWR);
if (fd < 0)
{
  printf ("Open /dev/my_led file error\n");
  return -1;
}
while(1)
{
  write(fd,&buf[0],1);
  sleep(1);
  write(fd,&buf[1],1);
  sleep(1);
}
close (fd);
return 0;

}


makefile 文件

ifneq ($(KERNELRELEASE),)

obj-m := LED.o

else

KDIR := /home/share/source/linux-3.0.1/
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*

endif

出0入0汤圆

发表于 2013-4-11 19:54:59 | 显示全部楼层
恭喜楼主,加油!

出0入0汤圆

发表于 2013-10-23 08:27:33 | 显示全部楼层
多谢楼主。。。。

出0入0汤圆

发表于 2013-10-24 11:00:03 | 显示全部楼层
LINUX作为嵌入式软件发展的主导,本小虾也来学习学习,并做了长久计划  共勉啊 楼主

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-10 04:04

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

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