linux下am335x点亮了

  

首先借用一张图说明linux应用程序和内核的关系

發inux下am335x点亮了“

与裸机程序不同,linux下的应用开发并不直接访问硬件,而是由应用程序调用驱动来访问硬件,这是linux的系统结构,具体可参考《嵌入式linux应用开发完全手册》。


回到am335x,已经在uboot实现领导的操作,基本原理一致,设置GPIO输出,低电平点亮了。如果想通过内核空间操作文件的方式访问GPIO,可参考BeagleBone的GPIO控制,

發inux下am335x点亮了“


linux3.2中司机/LED目录下存放有领导相关文件,在此编写了驱动模块。代码参照am335x下GPIO控制实例

添加文件leds-run。c

' ' '

# include  & lt; linux/gpio.h>   # include  & lt; linux/module.h>   # include  & lt; linux/kernel.h>   # include  & lt; linux/moduleparam.h>   # include  & lt; linux/delay.h>   # include  & lt; linux/types.h>   # include  & lt; linux/miscdevice.h>   # include  & lt; linux/device.h>   # include  & lt; linux/fs.h>   # include  & lt; linux/init.h>   # define  TEST_IO_NUM  89年   # define  NAME_MISC “GpioTest"   # define  NAME_MOUDULE “GpioTest1"   # define  USE_MISC_MODE  1   时间=static  int  major  251;   void  GpioTest(无效);   static  long  GpioIOctl (struct  file  * filp, unsigned  cmd,, unsigned  long 参数)   {   GpioTest ();   return  1;   }   void  GpioTest(空白)   {   int  iCount =, 0;   时间=(iCount  0;, iCount  & lt;=20;, iCount + +,)   {   如果(iCount % 2,==, 0)   {   gpio_direction_output (TEST_IO_NUM, 1);   printk (KERN_INFO" # # # # # # # LED  statu  is 高。\ r \ n");   }   其他的   {   gpio_direction_output (TEST_IO_NUM, 0);   printk (KERN_INFO" # # # # # # # LED  statu  is 低。\ r \ n");   }   mdelay (3000);   }   printk (KERN_INFO" # # # # # # # App  run  !“);   }   static  int  GpioOpen (struct  inode  * inode, struct  file  *文件)   {   int  iRen =, 1;   时间=iRen  gpio_request (TEST_IO_NUM,“LED");   如果(iRen  & lt;, 0)   {   printk (KERN_INFO" # # # # # # # Failed 用request 从而使!“);   其他}   {   printk (KERN_INFO" # # # # # # # Success 用request 从而LED");   }   return  iRen;   }   static  int  GpioClose (struct  inode  * inode, struct  file  *文件)   {   printk (KERN_INFO" # # # # # # # Free 从而LED");   gpio_free (TEST_IO_NUM);   return  1;   }//* * * * entry  point  for  TEST  GPIO 模块   static  const  struct  file_operations  gpio_test_driver =, {   时间=.owner  THIS_MODULE,   .unlocked_ioctl=, GpioIOctl,   时间=.llseek  no_llseek,   时间=.open  GpioOpen,   时间=.release  GpioClose,   };   # if  USE_MISC_MODE   static  struct  miscdevice  gpiotest_misc_device =, {   时间=.minor  MISC_DYNAMIC_MINOR,   时间=.name  NAME_MISC,   .fops =,, gpio_test_driver,   };   # endif   static  int  __init  GpioTestInit(空白)   {   int  iRet;   printk (KERN_INFO" # # # # # # # GpioTest  modules  is 安装。\ r \ n");   # if  USE_MISC_MODE   时间=iRet  misc_register(及gpiotest_misc_device);   if  (iRet), {   printk (KERN_INFO" # # # # # # # unable 用register  a  misc 设备\ r \ n");   return  iRet;   }   其他#   时间=iRet  register_chrdev (NAME_MOUDULE,专业,,,gpio_test_driver);   if  (iRet  & lt;, 0), {   printk (KERN_INFO" # # # # # # # unable 用register  a  chr 设备\ r \ n");   return  iRet;   }   # endif   return  iRet;   }   static  void  __exit  GpioTestExit(空白)   {   # if  USE_MISC_MODE   misc_deregister(及gpiotest_misc_device);   其他#   unregister_chrdev(主要,NAME_MOUDULE);   # endif   printk (KERN_INFO" # # # # # # # GpioTest  modules  is 退出! \ r \ n");   }   module_init (GpioTestInit);   module_exit (GpioTestExit);   MODULE_AUTHOR (“XXXXXXXXXXXX");   MODULE_LICENSE (“GPL");   MODULE_DESCRIPTION (“System  status  led");

linux下am335x点亮了