AT91SAM9260开发板驱动编写

发布者:中华古风最新更新时间:2022-07-07 来源: csdn关键字:AT91SAM9260  开发板  驱动编写 手机看文章 扫描二维码
随时随地手机看文章

一、编写目的

根据“1.AT91SAM9260建立开发环境.doc”搭建好开发环境后,接下来就是进行各个硬件驱动的调试了。本文档用于记录硬件驱动的调试过程,方便日后快速参考设计相关驱动。


二、驱动移植

1. RTC驱动(PCF8563)

本核心板上使用的RTC芯片型号为PCF8563。LINUX内核对其驱动已经有完整的支持,因此只需要进行相关配置即可。


a) 修改内核中的RTC配置


         Device Drivers  ---> Real Time Clock  ---> 


        < >   AT91SAM9x/AT91CAP9 RTT as RTC  //取消内部RTC设置


        <*>   Philips PCF8563/Epson RTC8564    //打开外部IIC RTC配置


b) 修改板级配置文件


        # gedit ./arch/arm/mach-at91/board-sam9260ek.c


static struct i2c_board_info __initdata ek_i2c_devices[] = {


{


I2C_BOARD_INFO("pcf8563", 0x51),   //add


/* delete


I2C_BOARD_INFO("24c512", 0x50),


.platform_data = &at24c512,


*/


},


/* more devices can be added using expansion connectors */


};


 


c) 设置 系统时钟并写到RTC上(设置为2014年7月8日 02:43:00)


        # date -s "2014-07-08 02:43:00"


        # hwclock -w


2. Led驱动

        LINUX内核对于LED有完善的架构支持,可以在内核配置时打开相关配置项。


a) 修改内核中的配置


        Device Drivers  ---> [*] LED Support  --->


                [*]   LED Class Support


                <*>   LED Support for GPIO connected LEDs


                [*]     Platform device bindings for GPIO LEDs


                [*]   LED Trigger support


                <*>   LED Timer Trigger


                <*>   LED Heartbeat Trigger 


                <*>   LED backlight Trigger 


                <*>   LED GPIO Trigger


                <*>   LED Default ON Trigger


b) 修改板级配置文件


        # gedit ./arch/arm/mach-at91/board-sam9260ek.c


/*


 * LEDs


 */


static struct gpio_led ek_leds[] = {


{


.name = "ds1",


.gpio = AT91_PIN_PC6,


.active_low = 1,


.default_trigger = "timer",


},


{


.name = "ds2",


.gpio = AT91_PIN_PC7,


.active_low = 1,


.default_trigger = "timer",


},


{


.name = "ds3",


.gpio = AT91_PIN_PC9,


.default_trigger = "heartbeat",


}


};


 


c) 测试驱动


        由于使用了LINUX的LED子系统作为LED驱动架构,如下图所示,设备文件的路径在/sys/class/leds/dsx目录下。


 


使用以下命令可以控制LED的亮、灭:


        # echo 1 > /sys/class/leds/ds1/brightness   //亮


        # echo 0 > /sys/class/leds/ds1/brightness   //灭


3. 按键驱动

a) 修改内核中的配置


        Device Drivers  ---> Input device support  --->


                <*>   Event interface


        Device Drivers  ---> Input device support  ---> [*]   Keyboards  --->


                <*>   GPIO Buttons 


b) 修改板级配置文件


        # gedit ./arch/arm/mach-at91/board-sam9260ek.c


/*


 * GPIO Buttons


 */


#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)


static struct gpio_keys_button ek_buttons[] = {


{


.gpio = AT91_PIN_PC10,


.code = BTN_1,


.desc = "Button 1",


.active_low = 1,


.wakeup = 1,


.debounce_interval = 20,   /* 去抖动间隔,单位微毫秒*/  


},


{


.gpio = AT91_PIN_PC11,


.code = BTN_2,


.desc = "Button 2",


.active_low = 1,


.wakeup = 1,


.debounce_interval = 20,   


},


{


.gpio = AT91_PIN_PC13,


.code = BTN_3,


.desc = "Button 3",


.active_low = 1,


.wakeup = 1,


.debounce_interval = 20,   


},


{


.gpio = AT91_PIN_PB30,


.code = BTN_4,


.desc = "Button 4",


.active_low = 1,


.wakeup = 1,


.debounce_interval = 20,  


},


};


static struct gpio_keys_platform_data ek_button_data = {


.buttons = ek_buttons,


.nbuttons = ARRAY_SIZE(ek_buttons),


};


 


static struct platform_device ek_button_device = {


.name = "gpio-keys",


.id = -1,


.num_resources = 0,


.dev = {


.platform_data = &ek_button_data,


}


};


 


static void __init ek_add_device_buttons(void)


{


at91_set_gpio_input(AT91_PIN_PC10, 1); /* btn1 */


at91_set_deglitch(AT91_PIN_PC10, 1);


at91_set_gpio_input(AT91_PIN_PC11, 1); /* btn2 */


at91_set_deglitch(AT91_PIN_PC11, 1);


at91_set_gpio_input(AT91_PIN_PC13, 1); /* btn3 */


at91_set_deglitch(AT91_PIN_PC13, 1);


at91_set_gpio_input(AT91_PIN_PB30, 1); /* btn4 */


at91_set_deglitch(AT91_PIN_PB30, 1);


 


platform_device_register(&ek_button_device);


}


#else


static void __init ek_add_device_buttons(void) {}


#endif


c) 测试驱动


        该按键驱动使用了LINUX输入子系统框架,在打开了事件接口配置后,在/dev/input/event0设备文件中可读取按键的事件值。在控制台上测试可以使用以下命令。


                # hexdump /dev/input/event0


        此时按下按键,将会有数据输出,如下图所示。其中每一次按键动作输出两行数据,从图中分析可知K1~K4的键值分别为101~104。


4. NAND FLASH驱动

a) 修改内核中的配置


        Device Drivers  --->  <*> Memory Technology Device (MTD) support  


                [*]   MTD partitioning support


                <*>   Direct char device access to MTD devices


                -*-   Common interface to block layer for MTD 'translation layers


                <*>   Caching block device access to MTD devices


        Device Drivers  --->  <*> Memory Technology Device (MTD) support  ---> <*>   NAND Device Support 


                <*> Support for NAND Flash / SmartMedia on AT91 and AVR32


                ECC management for NAND Flash / SmartMedia on AT91 / AVR32 (Software ECC)  --->


                        (X) Software ECC


b) 测试nand驱动


        从启动信息中可以看出已经成功识别了改NAND FLASH了,如下图所示。

        使用flash_eraseall、 nanddump、nandwrite 这三个工具对NAND进行操作(mtd-utils工具/http://pan.baidu.com/s/1mgG8dbq)。以下测试方法是在Linux下将uImage镜像烧写至nand中,通过是否能正常启动Linux来检验Nand驱动是否正确。


        目前开发板的NAND中已经烧写了Bootstrap和u-boot,使用nanddump指令可以读取这两个分区的数据,并与BIN文件进行对比,对比结果正确。


                # nanddump /dev/mtd0  -s 0x00000000 -l 0x00000200 -p  //bootstrap的分区


                # nanddump /dev/mtd1  -s 0x00000000 -l 0x00000200 -p  //u-boot的分区


 


        使用nandwrite烧写uImage到NAND中,修改U-BOOT启动命令后,让其从NAND读取内核,经验证可以正常启动LINUX内核,说明NAND驱动可以使用。


                # flash_eraseall /dev/mtd4


                # nandwrite -a -p  /dev/mtd4 /uImage


                # setenv bootcmd 'nand read 0x22000000 0xA0000 0x200000; bootm'


5. LCD1602驱动

        LCD1602属于一个简单的字符设备,因此这里不对其驱动代码进行详细说明。这部分文字主要说明在LINUX内核中加入新设备驱动的操作,驱动以模块化的方式进行加载。


a) 复制驱动源码至LINUX内核源码目录(使用以前开发过的驱动)


        # cp at91_lcd.c ./drivers/char


b) 修改./drivers/char目录下的Kconfig文件,增加LCD1602相关配置菜单


        # gedit ./drivers/char/Kconfig


config MSM_SMD_PKT


bool "Enable device interface for some SMD packet ports"


default n


depends on MSM_SMD


help


  Enables userspace clients to read and write to some packet SMD


  ports via device interface for MSM chipset.


 


config AT91_LCD


        tristate  "LCD12232 interface"


        default y


        help


          ------------ No help! ----------------------------


 


endmenu


c) 修改./drivers/char目录下的Makefile文件,增加编译选项


        # gedit ./drivers/char/Makefile


        obj-$(CONFIG_AT91_LCD)          += at91_lcd.o


d) 进入menuconfig配置菜单,进行驱动配置


         Device Drivers  ---> Character devices  --->


                  LCD12232 interface (NEW)


e) 编译内核模块


        # make ARCH=arm CROSS_COMPILE=arm-linux- modules


        编译成功后,将./drivers/char目录下的at91_lcd.ko文件复制到目标板的文件系统中,并在目录板的控制台上使用insmod指令加载驱动模块,使用lsmod指令可以查看已经加载的模块,使用rmmod命令删除模块。注意,模块文件必须放在/lib/modules/2.6.39目录下,否则不能正常卸载。


        # cp drivers/char/at91_lcd.ko /opt/AT91SAM9260EK/4.FS/NFS/lib/modules/2.6.39/


        # insmod /lib/modules/2.6.39/at91_lcd.ko


        # lsmod


        # rmmod at91_lcd


f) 生成设备文件


        # mknod /dev/at91_lcd c 217 0


 

        加载驱动模块与生成设备文件的命令可以放到/etc/init.d/rcS文件中,让其开机自动执行。


g) 测试程序


#include        //标准输入输出定义


#include         //Unix标准函数定义


#include        //字符串处理函数定义


#include         //文件控制定


 


#define DEV_LCD "/dev/at91_lcd"


 


int clearLCD(int fd);


 


int fd_lcd;


 


int main(void)


{


char bufLcd[124]; 


 


fd_lcd = open(DEV_LCD, O_RDWR);


 


if (fd_lcd < 0)


{


printf("Open "%s" fail!n", DEV_LCD);


}


 


clearLCD(fd_lcd);


 


bufLcd[0] = 0; // 列


bufLcd[1] = 0; //行


strcpy(&bufLcd[2], "----Welcome!----");


write(fd_lcd, bufLcd, strlen(&bufLcd[2]) + 2);


bufLcd[0] = 0; // 列


bufLcd[1] = 1; //行


strcpy(&bufLcd[2], "---LSHICEMAN!---");


write(fd_lcd, bufLcd, strlen(&bufLcd[2]) + 2);

[1] [2]
关键字:AT91SAM9260  开发板  驱动编写 引用地址:AT91SAM9260开发板驱动编写

上一篇:linux-at91——sama5d3.dtsi
下一篇:NAND_FLASH(K9F1208U0C)驱动分析

推荐阅读最新更新时间:2024-11-07 15:13

TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录
之前也学习过LDE闪烁程序,一般通过如下方式实现: 主要思想是通过操作寄存器地址的方式操作寄存器,这种实现方式的优点就是简单容易理解,但是具有一定的局限性,一般在较大的工程中不会这样实现,因为通过直接操作地址的方式实现,必定会频繁查询数据手册,查询相应寄存器地址,还有就是程序中会出现大量地址,可读性差不利于程序移植和优化。 通过学习,了解了一种通用的程序设计方式,特此记录 先说下大概思想: 1)引入GPIO基地址概念,建立GPIO结构体,这样每一个GPIO都可以通过”基地址+偏移地址“的思想查找到,避免了频繁操作地址的弊端。 2)位操作思想,不能为了实现某一个功能,影响其他功能,因此位操作的实现方式成为了程序设计中
[单片机]
stm32开发板开发笔记(5)-2.4寸26万色TFT触摸屏模块
因为产品要用到显示屏和触摸,就买了一个2.4寸的彩色触摸屏模块。 原理图: 显示屏的驱动芯片是ILI9325 ILI9325 is a 262,144-color one-chip SoC driver for a-TFT liquid crystal display with resolution of 240RGBx320 dots, comprising a 720-channel source driver, a 320-channel gate driver, 172,800 bytes RAM for graphic data of 240RGBx320 dots, and power supply
[单片机]
stm32<font color='red'>开发板</font>开发笔记(5)-2.4寸26万色TFT触摸屏模块
So easy!Zephyr操作系统+Arduino开发板变成一款心率监测器
“大健康”概念提出以后,作为医院外补充医疗的可穿戴设备掀起一股发展热潮,心率监测仪作为一款常见的监测设备很受欢迎。它不仅价格便宜,而且体积小携带方便,随时随地都能测试,并给用户提供实时监测结果,让用户及时了解健康状况并采取合适的治疗方式。那么对于开发者来说,如何快速开发一款心率监测仪?今天,我们就手把手教你采用Zephy操作系统在 Arduino 101 开发板上搭建一款心率监测仪。 先来了解一下心率检测仪的组成部分,一般包括硬件部分和软件部分。硬件部门主要完成的功能包括数据采集、数据传输和数据显示,软件部分主要进行数据转换和分析。我们采用的Arduino 101开发板上有一个英特尔居里模块,英特尔Quark SE处理器有两个核:
[嵌入式]
基于AT89S51单片机开发板的设计
1 引言 单片机系统传统的编程方式是将单片机先从电路板上取下,放入专用的编程器进行编程,再放人电路板进行调试。其缺点是频繁的拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大大降低了开发效率。ISP技术是未来发展的方向,其优势是无需编程器就可进行单片机的实验和开发,单片机器件可直接焊接到电路板上,调试结束即为成品,免去调试时由于频繁插入取出对器件和电路板造成的损坏和带来的不便。 ISP可降低研发成本;缩短从设计、制造到现场调试的时间,简化生产流程,大大提高工作效率;在试验新品或学生试验等常需用不同的程序调试器件的场合中,在线编程技术尤为重要。 设计AT89S51 单片机开发板 ,采用ISP下载线实现在Keil C
[模拟电子]
基于AT89S51单片机<font color='red'>开发板</font>的设计
警惕“沉默性缺氧”,米尔基于全志T507-H核心板的监护仪方案
警惕“沉默性缺氧”,米尔基于全志T507-H核心板的监护仪方案 新冠病毒感染期间多位专家提醒,需警惕老人“沉默性缺氧”。北京医院呼吸与危重症医学科主任李燕明介绍,由于老年病人感染新冠病毒后对缺氧反应较为迟钝,有可能会发生“沉默性缺氧”。家人可能觉得老人的呼吸状态似乎还是挺平稳的,但是血氧饱和度可能已经处于较低水平了。对于老年人需要密切监测自己身体的整体情况,包括心率、血压、呼吸、血氧饱和度等,出现恶化及时就诊。就诊越早,救治的成功率也就越大! 监护仪,是监测我们生命信号的守护仪。 监护仪是一种能测量病人动态生理参数,并可与已知设定值进行比较,如果出现异常可发出警报的装置或系统。随着医疗行业的飞速发展,国内医院加快了
[医疗电子]
警惕“沉默性缺氧”,米尔基于全志T507-H核心板的监护仪方案
瑞萨推出全新低功耗RL78原型开发板,简化IoT终端设备设计
全新原型开发板与Bluetooth® Low Energy扩展板功能接口支持广泛的功能扩展 全球领先的半导体解决方案供应商瑞萨电子株式会社推出全新低成本且功能丰富的RL78/G14快速原型开发板,以实现物联网终端设备的快速产品开发。凭借更快的原型开发与更低的成本,用户能够灵活地响应技术和市场的迅速变化,缩短新品上市时间。此外,瑞萨同时推出RL78/G1D BLE模块扩展板,用户可将其与全新原型板结合使用,轻松添加Bluetooth® Low Energy无线通信功能。 全新原型开发板基于RL78/G14微控制器(MCU),该微控制器提供了低功耗RL78产品家族中最丰富的功能集,适用于便携式设备中的电机控制、IoT传感
[嵌入式]
瑞萨推出全新低功耗RL78原型<font color='red'>开发板</font>,简化IoT终端设备设计
米尔电子2023年度大事记丨2023砥砺奋进,2024扬帆远航
有人说,2023年是经济下行的一年 有人说,2023年是充满挑战的一年 也有人说,2023年是充满希望的一年 于米尔来说 2023年是砥砺奋进的一年 这一年 我们用汗水书写辉煌 我们用奋斗书写芳华 跟随小编来盘点2023年米尔大事记 展望全新的2024  新品发布,助力开发 2023年米尔电子激昂前进,开发了很多新的平台方案,共计推出了核心板开发板10款,成为覆盖全面,品质优良的嵌入式CPU模组供应商。  外资平台,集齐四大半导体原厂的主流MPU,成为外资工业处理器核心板最全供应商: 米尔是目前国内唯一一家能全面提供主流外资半导体厂商入门级及中高端MPU的芯片厂家,可以给客户提供一站式的选型
[嵌入式]
米尔电子2023年度大事记丨2023砥砺奋进,2024扬帆远航
linux-2.6.32在mini2440开发板上移植 SD卡驱动移植
编者:这个驱动还是比较复杂的,先移植着,以后在分析吧。 SD卡驱动移植 1 在内核中注册SD 设备驱动 Linux-2.6.32.2 已经自带了S3C2440 芯片的SD 卡驱动,我们只需在初始化代码中加入SD 平台设备结构就可以,打开arch/arm/mach-s3c2440/mach-mini2440.c,在nand flash 平台结构后面添加如下红色代码: ;在mini2440.c 的顶部添加SD 卡设备结构所需的头文件 #include linux/mmc/host.h #include plat/mci.h static struct platform_device mini2440_device_eth = { .n
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved