| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | 
您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> Vxworks >> 文章正文 用户登录 新用户注册
vxworks程序示例和源码解释         ★★★ 【字体:
vxworks程序示例和源码解释
作者:佚名    文章来源:21control    点击数:    更新时间:2005-12-22
这里是一些程序示例和源码解释.一些相关程序代码会陆续补上.<br> <br> 系统初始化<br> <br> 系统初始化对不同的CPU,基本步骤是类似的.<br> <br> 系统初始化的主要步骤如下<br> <br> 启动 <br> 关闭中断 <br> 放boot type到堆栈 <br> 清空缓存 <br> VxWorks 系统的 PowerPC BSP,系统开机后执行的第一个函数 romInit(),在ROM的起点,这里是使用的PowerPC汇编语言<br> <br> /* 定义内部函数 internals */<br> .globl romInit /* start of system code */<br> .globl _romInit /* start of system code */<br> <br> /* 定义外部函数 externals */<br> .extern romStart /* system initialization routine */<br> <br> .text<br> .align 2<br> <br> /*******************************************************************************<br> * <br> * romInit ( int startType /@ only used by 2nd entry point @/ )<br> */<br> <br> romInit:<br> _romInit:<br> bl cold    /* 冷启动 */<br> bl warm    /* 热启动 */<br> <br> cold:<br> li p5, BOOT_COLD<br> bl start /* skip over next instruction */<br> <br> warm:<br> or p5, p0, p0 /* startType to p5 */<br> <br> start:        /* 此处是系统启动开始 */<br> <br> /* 屏蔽MSR中CE,EE位,关闭所有的外部中断<br> /*<br> * Disable external interrupts <br> */<br> <br> mfmsr p0 /* p0 = msr */<br> INT_MASK (p0, p1) /* mask EE and CE bit */<br> ori p1,p1,_PPC_MSR_ME /* enable machine checks */<br> mtmsr p1 /* msr = p1 */<br> isync<br> <br> /* 下面两步是按照硬件定义初始化一些SPR,DCR寄存器,置0或置1<br> <br> /* SPR是特殊功能寄存器,DCR为设备控制寄存器,还有MSR机器状态寄存器,这些是PowerPC内核中很重要的寄存器<br> <br> /* 初始化SPR,DCR寄存器置0<br> * Initalize registers that need to be set to zero.<br> */<br> <br> addi r4,r0,0x0000<br> mtspr SGR,r4 /* 解锁所有存储区域 SPR 中 SGR 位置0 */<br> mtspr ESR, r4 /* SPR中的错误状态位 ESR 清0 */<br> mtspr TCR, r4 /* 关闭所有的 timers */<br> mtspr PIT, r4 /* 清0 PIT timer */<br> mtdcr UICER, r4 /* 关闭中断控制器(UIC)中的所有中断 */<br> mtspr XER, r4 /* 清0 integer exception 寄存器 */<br> <br> /* 初始化另一些SPR,DCR寄存器置1<br> * Initalize registers that need to be cleared with 0xFFFFFFFF.<br> */<br> <br> addis r4,r0,0xffff<br> ori r4,r4,0xffff<br> mtspr TSR, r4 /* timer  */<br> mtspr DBSR, r4 /* 调试状态位置1 */<br> mtdcr UICSR, r4 /* 清除中断控制器(UIC)中的所有 pending 中断 */<br> mtdcr dmasr, r4 /* DMA状态寄存器置1 */<br> <br> /* PowerPC405用两个缓存,一个是16K指令缓存(ICU),一个是6K数据缓存(DCU),下面是清空着两个缓存,并根据硬件设置缓存 */<br> <br> /* 清空指令缓存 */<br> /*BESR type regs ZZZZZZZZZZZZ <br> * Invalidate the entire instruction cache. This can be done<br> * with a single iccci instruction in the processor core.<br> */<br> <br> iccci r0, r0<br> <br> /*清空数据缓存<br> * Invalidate the entire data cache.<br> * The 405 processor core in the 405GP has 128 congruence classes.<br> * Each cache line in the 405 processor is 32 bytes.<br> */<br> <br> /*<br> * Turn the instruction cache on for faster boot-up.<br> * Also, the icache is needed to help initialize Bank 0<br> * of the EBC to speed up accesses to flash.<br> * address space 0x00000000-0x07ffffff is cached<br> * address space 0xf8000000-0xffffffff is cached<br> */<br> <br> lis p0, HIADJ(_PPC403_ICCR_DEFAULT_VAL)<br> addi p0, p0, LO(_PPC403_ICCR_DEFAULT_VAL)<br> mtspr _PPC403_ICCR, p0<br> isync<br> <br> /* 初始化外部总线控制器(EBC),跳转指令BL,执行extBusCntlrInit<br> * /<br> <br> bl extBusCntlrInit<br> <br> /*<br> * Now that the EBC Bank 0 has been set up, turn the I-cache off if<br> * i-cache was not specified in config.h. It is also invalidated<br> * again.<br> */<br> <br> #ifndef USER_I_CACHE_ENABLE<br> li p0, 0 /* clear p0 */<br> mtspr _PPC403_ICCR, p0 /* turn off i-cache */<br> isync<br> iccci r0, r0 /* invalidate the I-cache again */<br> #endif<br> <br> /* 初始化和SDRAM相关的IIC(inter-integrated circut)寄存器IIC0,<br> * Initialize IIC0 for use in automatic SDRAM configuration<br> */<br> <br> #ifdef LOCAL_MEM_AUTOSIZE<br> bl iic0Init<br> #endif<br> <br> /* 初始化SDRAM,BL跳转执行sdramInit<br> * Configure the SDRAM controller only if this is a cold boot.<br> * If the SDRAM controller is reinitialized on a warm boot, the<br> * boot line will get wiped out because of the ECC SDRAM memory<br> * initialization.<br> */<br> <br> li p0, BOOT_COLD<br> and. p0, p0, p5 /* p5 is saved at the entry of romInit */<br> beq skip<br> <br> bl sdramInit<br> <br> skip:<br> <br> /*<br> * Clear the CPU reservation bit<br> */<br> <br> li r0, 0<br> lwarx p0, r0, r0<br> stwcx. p0, r0, r0<br> <br> #ifdef PPC405GP_REVA<br> /* 设置中断向量表到0x0000 */<br> li p0, 0x2100/4<br> mtctr p0<br> lis p0, WALNUT_EVPR_VAL<br> li p1, 0x0000<br> zeroOut:<br> stw p1,0x0(p0)<br> addi p0, p0, 4<br> bdnz zeroOut<br> #endif<br> <br> <br> /* 初始化堆栈<br> /* Initialize the stack pointer (r1)  */<br> <br> lis sp, HIADJ(STACK_ADRS)<br> addi sp, sp, LO(STACK_ADRS)<br> <br> #if FALSE /* SDA not supported */<br> /* initialize r2 and r13 according to EABI standard */<br> <br> lis r2, HIADJ(_SDA2_BASE_)<br> addi r2, r2, LO(_SDA2_BASE_)<br> lis r13, HIADJ(_SDA_BASE_)<br> addi r13, r13, LO(_SDA_BASE_)<br> #endif<br> <br> /* 得到C程序romStart()在ROM中的地址,保证romInit执行结束后,系统跳转执行romStart()<br> <br> /* calculate C entry point: routine - entry point + ROM base */<br> <br> lis p1, HIADJ(romStart) /* p1 = romstart */<br> addi p1, p1, LO(romStart)<br> <br> lis p2, HIADJ(romInit) /* p2 = romInit */<br> addi p2, p2, LO(romInit)<br> <br> <br> /* ROM_TEXT_ADRS为ROM的入口地址,在文件makefile定义,为0xfff80100<br> lis p3, HIADJ(ROM_TEXT_ADRS) /* p3 = ROM_TEXT_ADRS */    <br> addi p3, p3, LO(ROM_TEXT_ADRS)<br> <br> subf p1, p2, p1 /* p1 = p1 - p2 */<br> add p1, p1, p3 /* p1 = p1 + p3 */<br> /* p1中是romStart()的地址,这里把这个地址放到连接寄存器LR中.         mtlr p1 /* link register = C entry point */     <br> <br> or p0, p5, p5 /* p0 = startType */<br> addi sp, sp, -FRAMEBASESZ /* get frame stack */<br> <br> <br> /* 跳转到LR中romStart()的地址,执行romStart()<br> blr /* branch to link register */             <br> <br> 硬件中断<br> <br> 中断的产生和VxWorks系统的中断操作:<br> <br> 一般中断的产生是由硬件定义的,如串口中断的定义: <br> <br> 1.接收中断:当接收中断使能,接收数据存储器 RxData 存在有效数据,则产生中断. <br> 2.发送中断:当发送中断使能,发送数据存储器 TxData 为空,则产生中断. <br>  <br> <br> <br> 硬件发送中断产生逻辑示意<br>  <br> <br> 硬件接收中断产生逻辑示意<br>  <br>   <br> 所以要产生一个串口中断,主要有两步: <br> <br> 1.使能这两个串口中断,RX Enable,TX Enable,函数intEnable(). <br> 2.用intConnect()登记中断号,和相应的中断例程ISR. <br> <br>  <br> <br>     程序示例<br> <br> 在VxWorks系统上登记,使能串口中断<br> <br>     intConnect((VOIDFUNCPTR *)5,ComISR,0);         //登记中断服务程序ComISR()到外部中断号5,<br> <br>     intEnable((VOIDFUNCPTR *)5);                   //使能外部中断5<br> <br>     <br> //enable 使能 UART1 这里直接用32位地址表示了<br>     *(unsigned long *)0x20000014 &= ~0x01000100;  //INT_FORCE     use pending<br>     *(unsigned long *)0x20000010 = 0x01000100;     //INT_PENDING    clear<br>     *(unsigned long *)0x20000018 = 0x01000100;    //INT_MASK only enable UART1 RX<br> <br> <br> //control register 使能 RX TX<br>     *(unsigned long *)0x20000068 = 0x00070007;    //RX and TX ENABLE<br> <br> //divider register,baut rate 19200    设置波特率<br>     *(unsigned long *)0x2000006c = 59;    <br> <br> <br> //完成, 这样当串口有中断发生时,硬件系统会自动跳转到中断号5的地址0x18,调用程序ComISP().<br> <br> 注意:中断程序不能单步执行,或跟踪调试,中断服务程序中与函数库或系统有关的函数不可用如print()等,因为中断调用时,所有其它的任务都被挂起停止运行.<br> <br> VxWorks系统的网络驱动(END)<br> <br> VxWorks网络配置参见VxWorks网络驱动配置及分析<br> <br>     VxWorks系统网络驱动在BSP中完成,写驱动时应参考BSP develop kit,在VxWorks中叫做END( Enhanced Network Driver),编写程序使用由VxWorks定义的MUX接口<br> <br> MUX是数据链路层和网络协议层之间的接口<br> <br> 主要调用过程和步骤如下:<br> <br> VxWorks系统执行的第一个任务target\config\all\usrConfig.c文件中 usrRoot()=======>><br> <br> target\src\config\usrNetwork.c文件(该文件初始化TCP/IP)中 usrNetInit(BOOT_LINE_ADRS)(该函数作用是添加MUX END)========>><br> <br> pcooki = pCookie = muxDevLoad(pDevTbl->unit,.....)其中pDevTbl在BSP网络配置文件configNet.h中定义.END_TBL_ENTRY endDevTbl[]={...},该表定义了网络设备的具体参数,在这里调用了网络驱动<br> <br> END_TBL_ENTRY endDevTbl [] =<br> {<br> {0, IBM_EMAC_LOAD_FUNC, IBM_EMAC_LOAD_STR_0, TRUE, NULL, FALSE},<br> {0, END_TBL_END, NULL, 0, NULL, FALSE},<br> };<br> 其中IBM_EMAC_LOAD_FUNC就是 ibmEmacEndLoad()<br> <br> ========>>muxDevStart(pcooki)==========>>ibmEmacEndLoad()<br> <br>  <br> <br> ibmEmacEndLoad()初始化系统为网络驱动运行做准备<br> <br> MUX调用ibmEmacStart()<br> <br> ibmEmacStart() 登记中断服务程序ibmEmacInit(),启动设备运行在中断模式下.<br> <br> LOCAL STATUS ibmEmacStart ( EMAC_DRV_CTRL * pDrvCtrl )<br> {<br> int rc;<br> <br> SYS_INT_CONNECT (pDrvCtrl, ibmEmacInt, pDrvCtrl, &rc);<br> SYS_OUT_LONG(pDrvCtrl, EMAC_ISR, 0xFFFFFFFF);<br> SYS_INT_ENABLE ();<br> <br> /* Allow MAL EOB and Descriptor error interrupts */<br> <br> malChannelIntMaskSet(MAL_TX_TYPE, pDrvCtrl->txChn0MalChannel,<br> MAL_EOB_INT_EN | MAL_DE_INT_EN | MAL_SERR_INT_EN);<br> <br> malChannelIntMaskSet(MAL_RX_TYPE, pDrvCtrl->rxChn0MalChannel,<br> MAL_EOB_INT_EN | MAL_DE_INT_EN | MAL_SERR_INT_EN);<br> <br> return (OK);<br> }<br> <br> 中断服务程序ibmEmacInit() 处理EMAC控制器的中断,主要是 TX,RX状态错误<br> <br> LOCAL void ibmEmacInt ( EMAC_DRV_CTRL * pDrvCtrl )<br> {<br> UINT isrReg;<br> <br> /* Read the EMAC interrupt status register */<br> <br> SYS_IN_LONG(pDrvCtrl, EMAC_ISR, isrReg);<br> pDrvCtrl->errorEmac = isrReg;<br> <br> /*<br> * Check to see if there was a TX error. If there was, the Dead bit<br> * will be set. Clear the status bits for the TX error, and clear the dead<br> * bit. Keep count of these errors in the main device structure.<br> */<br> <br> if (isrReg & EMAC_ISR_TX_INTS)<br> {<br> pDrvCtrl->intErrorTX++;<br> SYS_OUT_LONG(pDrvCtrl, EMAC_ISR, EMAC_ISR_TX_INTS);<br> }<br> <br> /*<br> * Check to see if there was a RX error. Clear the status bits for the RX<br> * error. Keep count of these errors in the main device structure.<br> */<br> <br> if (isrReg & EMAC_ISR_RX_INTS)<br> {<br> pDrvCtrl->intErrorRX++;<br> SYS_OUT_LONG(pDrvCtrl, EMAC_ISR, EMAC_ISR_RX_INTS);<br> }<br> <br> return;<br> }<br> <br>            (未完)     <br> <br> Cillus网卡CS8900A Linux驱动<br> <br> 下面是我为一个网友解释的CS8900A网卡驱动文件中的部分函数,操作系统为ucLinux,CPU是国内常用的Motorola龙珠系列MC68EZ328(16M),相比PowerPC和ARM来说,它的结构简单,不带MMU,较易理解<br> <br> CS8900A是一个16位网卡,支持ISA总线,10-BastT.<br> <br> static inline void outw(unsigned short value,unsigned int addr) <br> {             <br> unsigned short newvalue; <br> unsigned char *_src=(unsigned char*)(&value),*_dest=(unsigned char*)(&newvalue);<br> <br> //这里为什么要交换一下?<br> <br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这里不是交换,而是赋值,将16位分成两个8位的数组,分别赋值,16位寄存器是只有后8位可读写,<br> //前8位是寄存器ID,所以这里吧后8位放在前面"_dest[0]=_src[1];"<br> //然后通过I/O口,赋给相应的存储器,即"*(volatile unsigned short*)addr=newvalue;"<br> ///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <br> <br> _dest[0]=_src[1];    <br> _dest[1]=_src[0];    <br> *(volatile unsigned short*)addr=newvalue;<br> }<br> <br> static int cs89x0_probe1(struct device *dev, int ioaddr)<br> {<br>     struct net_local *lp;<br>     static unsigned version_printed = 0;<br>     int i;<br>     unsigned rev_type = 0;<br> <br>     irq2dev_map[0] = dev;<br> <br>     /* set up the chip select */<br>     <br> <br>     //下面这一段该怎么理解?看不懂阿<br>     <br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这里是对CPU进行操作,对cs89进行初始化,我没有见到你的硬件原理图,我只能按CPU<br> //的结构定义来解释一下,你要想搞清楚,只有看硬件原理图,还要参考CPU的硬件手册<br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     <br>     <br>     <br> <br> //连通PORT F I/O功能管脚1,SEL1(-IRQ5/PF1),<br>     *(volatile unsigned char *)0xfffff42b |= 0x02; /* output /sleep */<br> //设置PORT F 管脚0为输出,输出高电平<br>     *(volatile unsigned short *)0xfffff428 |= 0x0101; /* not sleeping */<br> <br> //连通PORT F 中断功能管脚1,SEL1(-IRQ5/PF1)<br>     *(volatile unsigned char *)0xfffff42b &= ~0x02; /* input irq5 */<br> //PORT F 管脚1,SEL1(-IRQ5/PF1) 为输入方式,置低电平有效    <br>     *(volatile unsigned short *)0xfffff428 &= ~0x0202; /* irq5 fcn on */<br>     <br> //在寄存器CSGBB中定义片选及cs89的基地址为:0x10000000.++++非常重要+++++++     <br>     *(volatile unsigned short *)0xfffff102 = 0x8000; /* 0x04000000 */<br> //在寄存器CSB中,片选使能,cs89地址空间大小(1M),数据线宽16位,6个等待周期,FLASH...,<br> //非保护存储空间(128K)......        <br>     *(volatile unsigned short *)0xfffff112 = 0x01e7; /* 128k, 2ws, FLASH, en */<br>     <br> //对PORT G操作........    <br>     *(volatile unsigned int *)0xfffff430 = 0x023c3d0a;<br>     <br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这是I/O模式的主要的两个PORT口,一个是地址口,一个是数据口,这里对0x22操作,<br> //中断IRQ0<br> ///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     <br>     *(volatile unsigned short*)0x1000030a=0x2200;<br>     *(volatile unsigned short*)0x1000030c=0;<br>     <br> <br>     //*(volatile unsigned short *)0xfffff302 |= 0x0080;<br>     <br>     ......................<br> <br>     .....................<br> <br> void<br> reset_chip(struct device *dev)<br> {<br>     int reset_start_time;<br>     writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);<br> <br>     /* wait 30 ms */<br>     current->state = TASK_INTERRUPTIBLE;<br>     current->timeout = jiffies + 3;<br>     schedule();<br> <br>     /* Wait until the chip is reset */<br>     <br>     //这里jiffies说是timestamp,时间标记,这个变量和current<br>     //都在哪里定义?<br>     //jiffies主要起什么作用?<br> ////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这里是个延时等待,reset以后必须有等待,以便reset彻底完成,在reset过程中所有寄存器是关闭的<br> //不但对cs89,对其他芯片也是一样的<br> ///++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  reset_start_time = jiffies;<br>     while( (readreg(dev, PP_SelfST) & INIT_DONE) == 0 && jiffies - reset_start_time< 2);<br> }<br> <br> static int<br> net_open(struct device *dev)<br> {<br>     struct net_local *lp = (struct net_local *)dev->priv;<br>     int result = 0;<br>     int i;<br> <br>     write_irq(dev, lp->chip_type, 0);<br> <br>     irq2dev_map[/* FIXME */ 0] = dev;<br>     writereg(dev, PP_BusCTL, 0); /* ints off! */<br> <br> //这里和上面那个一样,怎么看懂?<br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这里也是CPU对CS89操作,我也根据CPU硬件手册给你大概说一下 <br> ///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> <br> //中断信号,正电平触发(POL5)<br>     *(volatile unsigned short *)0xfffff302 |= 0x0080; /* +ve pol irq */<br> <br> //调整PORT G的输入输出状态,及设置管脚相应的电平信号     <br>     *(volatile unsigned int *)0xfffff430 = 0x023c3d0a;    /* low -> high */<br>     *(volatile unsigned int *)0xfffff430 = 0x023e3d0a;<br>     *(volatile unsigned int *)0xfffff430 = 0x023c3d0a;    /* high -> low */<br> <br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //这是I/O模式的主要的两个PORT口,一个是地址口,一个是数据口,这里对0x22操作,<br> //中断IRQ0<br> ///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++     <br>     *(volatile unsigned short *)0x1000030a = 0x2200;    /* index window, REG index : 0022h */<br>     *(volatile unsigned short *)0x1000030c = 0x0000;    /* data window, REG data : 0000h,irq0 */<br>     <br> .........................<br> <br> .........................<br> <br> static void<br> net_rx(struct device *dev)<br> {<br>     struct net_local *lp = (struct net_local *)dev->priv;<br>     int ioaddr = dev->base_addr;<br>     struct sk_buff *skb;<br>     int status, length;<br> <br> //下面两行怎么右边是一样的?<br> //是作者写错了吗?<br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++|<br> //不是,这是一个包中前后不同的两个数据,前一个数据是该数据包的状态,后一个是数据包的长度<br> ////++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>     status = inw(ioaddr + RX_FRAME_PORT);<br>     length = inw(ioaddr + RX_FRAME_PORT);<br>     if ((status & RX_OK) == 0) {<br>         lp->stats.rx_errors++;<br>         if (status & RX_RUNT) lp->stats.rx_length_errors++;<br>         if (status & RX_EXTRA_DATA) lp->stats.rx_length_errors++;<br>         if (status & RX_CRC_ERROR) if (!(status & (RX_EXTRA_DATA|RX_RUNT)))<br>             /* per str 172 */<br>             lp->stats.rx_crc_errors++;<br>         if (status & RX_DRIBBLE) lp->stats.rx_frame_errors++;<br>         return;<br>     }<br> <br> ......................<br> <br> static int<br> set_mac_address(struct device *dev, void *addr)<br> {<br>     int i;<br>     if (dev->start)<br>         return -EBUSY;<br>     <br>     if(get_arena_addr())<br>         {<br>             memcpy(dev->dev_addr,0x1100000,6);<br>         }<br>     else<br>     {<br>     //这里的00hhcnl和前面<br> //出现的00hhcn是什么意思?<br> ////+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br> //注意:在这里他更改了网卡的MAC值,随便给了一个值"0x00,0x00,'h',h','c','n'",<br> //不过这个48位值必须是世界唯一的,或者用网卡自带的也可以.我不能确定是否eeprom中有信息,<br> //你可以用示波器量一下EEDI管脚,若为高电平,则EEPROM用到了,否则,他们根本没有用EEPROM.<br> ///++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ <br>         unsigned char mac[]={0,0,'h','h','c','n'};<br>         memcpy(dev->dev_addr,mac,6);<br>     }<br>     printk("%s: Setting MAC address to ", dev->name);<br>     for (i = 0; i < 6; i++)<br>         printk(" %2.2x", dev->dev_addr[i] = ((unsigned char *)addr)[i]);<br>     printk(".\n");<br>     /* set the Ethernet address */<br>     for (i=0; i < ETH_ALEN/2; i++)<br>         writereg(dev, PP_IA+i*2, dev->dev_addr[i*2] | (dev->dev_addr[i*2+1] << 8));<br> <br>     return 0;<br> }<br> <br> LCD 与触摸屏<br> <br> Modem拨号<br> <br> Modem拨号程序步骤如下 <br> <br> <br> 1. off hook,发出摘机命令(ATH1\r), <br>    等待modem返回状态,如果是"OK",则表示成功.进行第二步. <br> 2. on hook 发出挂机命令(ATH\r), <br>    等待modem返回状态,如果是"OK",则表示成功.进行第三步. <br> 3. off hook,dialing,摘机拨号(ATDT....\r), <br>    等待modem返回状态,如果是"CONNECT",则表示成功.进行第四步. <br> 4. send data,发送数据. <br> <br> 最好按上述步骤一步一步调,并要等待正确的返回值后再进行下一步. <br> <br> 具体程序例子如下,拨号: <br> <br> // 清空接收FIFO <br>     REG(FCR, nsChan) |=FCR_RXCLR; <br> // 等待,直到清空为止 <br>     while((REG(FCR, nsChan) & FCR_RXCLR) != 0x00); <br> // 拨号     <br>     while(atdt1[i]!=0) <br>     { <br> // 检查发送FIFO是否准备好,为空 <br>      while((REG(LSR, nsChan) & LSR_THRE) == 0x00); <br> // 在发送FIFO中放入数据 <br> REG(THR, nsChan) = atdt1[i]; <br> i++; <br>     } <br>      <br> // 等待是否有数据到达,即modem返回数据. <br> while((REG(LSR, nsChan) & LSR_DR) == 0x00); <br> // 接收数据并判断返回值 <br> response[i-19]=REG(RBR,nsChan); <br>     if(response[0]!=0x43) <br>         .................. <br>     else <br>         ..................     <br> // 如果返回值是"connect",     <br>     while(*data!=0) <br>     { <br>      while((REG(LSR, nsChan) & LSR_THRE) == 0x00); <br> REG(THR, nsChan) = *data++; <br>     } <br> 其他步骤基本一样. <br> <br> <br>  这是在ARM7上做的modem驱动,硬件设计方法是modem集成在主板上,没有用串口,modem是用片选地址直接对硬件操作的.<br> <br> RTC<br>
文章录入:fengfeiyi    责任编辑:fengfeiyi 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 嵌入式Linux开发工具选择和应…

  • 一步一步的制作arm-linux 交…

  • 高可用性系统的硬件和软件设…

  • 利用电子邮件实现与网络嵌入…

  • 什么样的处理器会引领嵌入式…

  • 配合Tornado使用的Wind Powe…

  • 嵌入式Internet技术及其应用…

  • 嵌入式Internet技术及其应用…

  • 嵌入式Internet技术及其应用…

  • 嵌入式Internet技术及其应用…

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)