09计科A23430110陈南博实训九.docx
- 文档编号:23557349
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:25
- 大小:590.90KB
09计科A23430110陈南博实训九.docx
《09计科A23430110陈南博实训九.docx》由会员分享,可在线阅读,更多相关《09计科A23430110陈南博实训九.docx(25页珍藏版)》请在冰豆网上搜索。
09计科A23430110陈南博实训九
上海第二工业大学计算机科学与技术系
学生实训报告
课程名称
嵌入式操作系统课程设计
实训类别
验证型
实训项目名称
驱动环境的建立
班级
09计科A2
姓名
陈南博
学号
20113430110
实训时间
2012年12月26日
实训地点
15号楼507
指导教师
崔莉莉
组号
同组学生信息(请填写在下方)
班级
姓名
学号
一、实训内容、结果与分析
实验七驱动程序结构实验
dri_arh模块加载实验
实验代码如下:
#include
#include
#include
#include
#include
#include
staticint__initdri_arch_init_module(void)
{
printk("Thisisasimpledriver-module!
\r\n");
return0;
}
staticvoid__exitdri_arch_cleanup_module(void)
{
printk("Goodbyedriver-module!
\r\n");
}
module_init(dri_arch_init_module);
module_exit(dri_arch_cleanup_module);
编译make,使用vi编辑器编辑Makefile文件,添加如下内容:
CC=/opt/xscalev1/bin/arm-linux-gcc
INCLUDEDIR=/root/xsbase/Xsbase270_Linux_F/Kernel/linux-2.4.21-emdoor/include
CFLAGS=-D__KERNEL__-DMODULE-Wall-O2
CFLAGS+=-I..-I$(INCLUDEDIR)
DEBUG=
TARGET=dri_arch
OBJS=$(TARGET).o
SRC=dri_arch.c
All:
dri_arch.o
dri_arch.o:
dri_arch.c
$(CC)$(CFLAGS)$(DEBUG)-c-odri_arch.odri_arch.c
clean:
rm-rf*.o
下载目标代码到目标板,具体的操作参考使用手册相关部分
挂载目标代码,并查看输出调试信息,本次相关操作均要求到下载的当前目录(含dri_arch.o)
$insmoddri_arch.o(挂载dri_arch)
$lsmod(查看当前已挂载模块,会看到dri_arch)
$dmesg(查看模块输出信息:
Thisisasimpledriver-module!
)
$rmmoddri_arch(卸载dri_arch)
$lsmod(查看当前已挂载模块,不再看到dri_arch)
$dmesg(查看模块输出信息:
Goodbyedriver-module!
)
【思考题】
1、分析如何解决模块加载过程中的内核版本的兼容问题
可以在模块程序中的include
2、任选某个linux内核设备驱动程序进行分析,总结编写设备驱动程序的架构。
实验8IO口驱动实验
IO实验主要是有关LED与八段数码管、键盘、步进电机的模块接口编程。
通过编程对IO设备进行定义、初始化、配置、使用等操作。
1、分析LED显示模块驱动程序,画出一个设备程序的主要组成部分框图;
2、根据键盘模块驱动程序,画出采用中断编写设备驱动程序的主要组成部件框图;
图8-4阵列键盘接口
图8-5单按键键盘接口
3、根据实验原理中八段数码显示的编译和加载过程,将8LED和键盘驱动模块编译并加载
到目标平台的内核中;然后将测试程序下载到目标平台,测试设备驱动模块的正确性。
【思考题】
1、利用qt或C语言编写一个步进电机驱动模块的用户程序;
#include
#include
#include
#include
#include"system.h"
#include"altera_avalon_pio_regs.h"
#include"altera_avalon_timer_regs.h"
#include"alt_types.h"
#include"sys/alt_irq.h"
#defineMOTOA(1<<0)//STEP_MOTOR_PIO[0]
#defineMOTOB(1<<1)//STEP_MOTOR_PIO[1]
#defineMOTOC(1<<2)//STEP_MOTOR_PIO[2]
#defineMOTOD(1<<3)//STEP_MOTOR_PIO[3]
#defineMOTOCON0x0f//MOTO控制字
#defineTRUE1
#defineFALSE0
/******************************************************************
*与硬件相关的宏定义,用户根据实际情况修改
******************************************************************/
//用户添加并命名的外设基地址,在SYSTEM中定义,用户需要根据不同的命名来修改此处
#ifndefSTEP_MOTOR_PIO_BASE//这是STEPMOTORPIO核的基地址
#defineSTEP_MOTOR_PIO_BASE0xffffffff//user'sdefinitionhere
#endif
#ifSTEP_MOTOR_PIO_BASE==0xffffffff
#error"NodefinitionofSTEP_MOTOR_PIOcore...\n"
#endif
#definePIOSET(PIN)IOWR_ALTERA_AVALON_PIO_DATA(\
(STEP_MOTOR_PIO_BASE),(PIN))//方便修改置位端口
#ifndefLED_PIO_BASE//这是LED_PIO核的基地址
#defineLED_PIO_BASE0xffffffff//user'sdefinitionhere
#endif
#ifLED_PIO_BASE==0xffffffff
#error"NodefinitionofLED_PIOcore.\n"
#endif
//流水灯花样,低电平点亮,调用时候用了取反操作
constalt_u32LED_TBL[]={
0x00,0xFF,//全部熄灭后,再全部点亮
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加
0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开
0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81//从两边叠加后递减
};
voidInitPIO(void);
/***********************************************/
staticvoidTimer_ISR_Init(void);//初始化中断
/***********************************************/
voidMOTO_Mode1(alt_u32time);//AD-DC-CB-BA
voidMOTO_Mode2(alt_u32time);//AB-BC-CD-DA-AB
voidMOTO_Mode3(alt_u32time);//A-AB-B-BC-C-CD-D-DA-A
voidMOTO_Mode4(alt_u32time);//流水灯
intmark=1;
alt_u8key_state;
/********************************************************************
*名称:
main()
*功能:
控制步进电机运行。
*********************************************************************/
intmain(void)
{
printf("\n陈南博09计科A220113430110期末作业!
\n");
//设置Timer中断
Timer_ISR_Init();
InitPIO();
while
(1)
{
usleep(10000);
}
return0;
}
/***********************************************/
staticvoidTimer_Irq_Handler(void*context,alt_u32id)
{
key_state=IORD_ALTERA_AVALON_PIO_DATA(KEY_PIO_BASE);
printf("in");
if(key_state==0x01)
mark=1;
if(key_state==0x02)
mark=2;
if(key_state==0x04)
mark=3;
if(key_state==0x08)
mark=4;
switch(mark){
case1:
MOTO_Mode1(300000);
printf("4拍反转");break;
case2:
MOTO_Mode2(150000);
printf("4拍正转");break;
case3:
MOTO_Mode3(725000);
printf("8拍正转");break;
case4:
MOTO_Mode4(15000);
printf("流水灯");break;}
//清除Timer中断标志寄存器
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0);
}
/************************************************/
staticvoidTimer_ISR_Init(void)//初始化中断
{
//清除Timer中断标志寄存器
IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_BASE,0);
//注册Timer中断
alt_irq_register(TIMER_IRQ,NULL,Timer_Irq_Handler);
//允许Timer中断
//IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_BASE,0x01);
}
/********************************************************************
*名称:
InitPIO()
*功能:
初始化步进电机对应的控制端口为输出,
*入口参数:
无
*出口参数:
无
********************************************************************/
voidInitPIO(void)
{//LED和步进电机对应的控制端口为输出
IOWR_ALTERA_AVALON_PIO_DIRECTION(STEP_MOTOR_PIO_BASE,MOTOCON);
//禁止所有PIO中断
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(STEP_MOTOR_PIO_BASE,0x00);
//清清边沿捕获寄存器
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(STEP_MOTOR_PIO_BASE,0x00);
}
/********************************************************************
*名称:
MOTO_Mode1()
*功能:
双四拍步进电机控制程序
*入口参数:
alt_u32time延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************/
voidMOTO_Mode1(alt_u32time)//AD-DC-CB-BA
{
/*A*/
PIOSET(MOTOA|MOTOD);
alt_busy_sleep(time);
/*B*/
PIOSET(MOTOD|MOTOC);
alt_busy_sleep(time);
/*C*/
PIOSET(MOTOC|MOTOB);
alt_busy_sleep(time);
/*D*/
PIOSET(MOTOB|MOTOA);
alt_busy_sleep(time);
}
/********************************************************************
*名称:
MOTO_Mode2()
*功能:
双四拍步进电机控制程序
*入口参数:
alt_u32time延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************/
voidMOTO_Mode2(alt_u32time)//AB-BC-CD-DA-AB
{
/*AB*/
PIOSET(MOTOA|MOTOB);
alt_busy_sleep(time);
/*BC*/
PIOSET(MOTOB|MOTOC);
alt_busy_sleep(time);
/*CD*/
PIOSET(MOTOC|MOTOD);
alt_busy_sleep(time);
/*DA*/
PIOSET(MOTOD|MOTOA);
alt_busy_sleep(time);
}
/********************************************************************
*名称:
MOTO_Mode3()
*功能:
单双八拍步进电机控制程序
*入口参数:
alt_u32time延时参数,值越大,延时越久
*出口参数:
无
*********************************************************************/
voidMOTO_Mode3(alt_u32time)//A-AB-B-BC-C-CD-D-DA-A
{
/*A*/
PIOSET(MOTOA);
alt_busy_sleep(time);
/*AB*/
PIOSET(MOTOA|MOTOB);
alt_busy_sleep(time);
/*B*/
PIOSET(MOTOB);
alt_busy_sleep(time);
/*BC*/
PIOSET(MOTOB|MOTOC);
alt_busy_sleep(time);
/*C*/
PIOSET(MOTOC);
alt_busy_sleep(time);
/*CD*/
PIOSET(MOTOC|MOTOD);
alt_busy_sleep(time);
/*D*/
PIOSET(MOTOD);
alt_busy_sleep(time);
/*DA*/
PIOSET(MOTOD|MOTOA);
alt_busy_sleep(time);
}
2、在编译设备驱动模块时,应该注意哪些问题?
编译进内核和编译成模块,是在配置LINUX内核时选的,修改MAKEFILE好像不行吧?
还有,不管是编译进内核还是编译成模块,你都得把驱动放在内核源码包里面进行编译,因为有调用关系。
3、根据实验原理中硬件接口和系统提供的PXA27x文档资料,请分析键盘驱动程序,指出下列程序段中数字94、95等和GPIO_ALT_FN_1_IN、GPIO_ALT_FN_2_OUT所表示的意义;
…
set_GPIO_mode(94|GPIO_ALT_FN_1_IN);
set_GPIO_mode(95|GPIO_ALT_FN_1_IN);
set_GPIO_mode(98|GPIO_ALT_FN_1_IN);
set_GPIO_mode(99|GPIO_ALT_FN_1_IN);
set_GPIO_mode(100|GPIO_ALT_FN_1_IN);
set_GPIO_mode(101|GPIO_ALT_FN_1_IN);
set_GPIO_mode(102|GPIO_ALT_FN_1_IN);
set_GPIO_mode(103|GPIO_ALT_FN_2_OUT);
set_GPIO_mode(104|GPIO_ALT_FN_2_OUT);
set_GPIO_mode(105|GPIO_ALT_FN_2_OUT);
set_GPIO_mode(108|GPIO_ALT_FN_2_OUT);
…
单按键键盘的控制信号线KP-DKIN1~2,KP-DKIN5~6分别由CPU的通用IO口GPIO94~95和GPIO98~99控制。
实验10USB驱动配置实验
1、利用makemenuconfig编译Linux内核,启用Linux内核对USB主机控制器的支持,写出编译过程以及需要选择的支持项;
要启用LinuxUSB支持,首先进入"USBsupport"节并启用"SupportforUSB"选项(对应模块为usbcore.o)。
如图10-2所示
图10-2USBsupport配置界面
接下来需要配置用于系统的正确USB主控制器驱动程序(USBHostControllerDrivers),如图10-3所示。
用于USB主控制器驱动模块主要有:
增强型主机控制器接口EHCI驱动模块(对应模块为ehci-hcd.o)、通用型主机控制器接口UHCI驱动模块(对应模块为usb-uhci.o)、开放式主机控制器接口OHCI驱动模块(对应模块为usb-ohci.o)。
图10-3USB配置界面
要理解"EHCI"及其同类是什么,首先要知道每块支持插入USB设备的主板或PCI卡都需要有USB主控制器芯片组。
这个特别的芯片组与插入系统的USB设备进行相互操作,并负责处理允许USB设备与系统其它部分通信所必需的所有低层次细节。
LinuxUSB驱动程序有三种不同的USB主控制器选项是因为在主板和PCI卡上有三种不同类型的USB芯片。
增强型主机控制器接口EHCI驱动程序设计成为实现新的高速USB2.0协议的芯片提供支持,开放式主机控制器接口OHCI驱动程序用来为非PC系统上的(以及带有SiS和ALi芯片组的PC主板上的)USB芯片提供支持。
通用型主机控制器接口UHCI驱动程序用来为大多数其它PC主板(包括Intel和Via)上的USB实现提供支持。
在USB主机控制器的配置中,只需选择与希望启用的USB支持的类型所对应的USB主机控制器驱动程序即可。
为保险起见,可以启用"EHCI"、"UHCI"(两者中任选一种,它们之间没有明显的区别)和"OHCI"。
启用了"USBsupport"和适当的USB主控制器驱动程序后,然后启用"PreliminaryUSBdevicefilesystem",和启用所有特定的且将与Linux一起使用的实际USB外围设备的驱动程序。
例如,为了启用对USB游戏控制器和USB存储器设备的支持,应启用"USBHumanInterfaceDevice(fullHID)support"。
和"USBMassStoragesupport",然后启用主"Inputcoresupport"节下的"Inputcoresupport"和"Joysticksupport"。
一旦使用新的已启用USB的内核重新引导后,若/proc/bus/usb下没有相应USB设备信息,应输入以下命令将USB设备文件系统手动挂装到/proc/bus/usb:
[root@localhostxbase]$mount–tusbdevfsnone/proc/bus/usb
为了在系统引导时自动挂装USB设备文件系统,请将none/proc/bus/usbusbdevfsdefaults00添加到/etc/fstab中的/proc挂装行之后。
2、利用手动和自动将USB各驱动模块添加到Linux内核中,写出添加过程;
3、在目标板上使用USB存储器,写出使用分区和格式化USB存储器的过程及方法;
Linux下U盘的使用
如果需要在装有Linux操作系统的目标平台中USB存储器,必须在利用makemenuconfig编译Linux内核时启用USB存储器和SCSI的支持。
SCSIsupport--->
<*>SCSIsupport?
<*>SCSIdisksupport
(40)MaximumnumberofSCSIdisksthatcanbeloadedasmodules
USBsupport--->
<*>USBMassStoragesupport
在目标平台中使用U盘,应按照分区、格式化、装载和使用四个大步骤进行操作。
(1)分区
现结合具体过程讲解几个常用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 A23430110 陈南博实训九
![提示](https://static.bdocx.com/images/bang_tan.gif)