首先借用一张图说明linux应用程序和内核的关系
与裸机程序不同,linux下的应用开发并不直接访问硬件,而是由应用程序调用驱动来访问硬件,这是linux的系统结构,具体可参考《嵌入式linux应用开发完全手册》。
回到am335x,已经在uboot实现领导的操作,基本原理一致,设置GPIO输出,低电平点亮了。如果想通过内核空间操作文件的方式访问GPIO,可参考BeagleBone的GPIO控制,
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点亮了