⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ep93xx_sir.c

📁 一个2.4.21版本的嵌入式linux内核
💻 C
字号:
/* * SIR IR port driver for the Cirrus Logic EP93xx. * * SIR on the EP93xx hangs off of UART2 so this is emplemented * as a dongle driver. * * Copyright 2003 Cirrus Logic * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <linux/module.h>#include <linux/delay.h>#include <linux/tty.h>#include <linux/sched.h>#include <linux/init.h>#include <net/irda/irda.h>#include <net/irda/irmod.h>#include <net/irda/irda_device.h>#include <asm/io.h>#include <asm/hardware.h>#include <asm/hardware/serial_amba.h>#undef DEBUG//#define DEBUG 1#ifdef DEBUG#define DPRINTK( x... )  printk( ##x )#else#define DPRINTK( x... )#endif/* * We need access to the UART2 control register so we can * do a read-modify-write and enable SIR. */static void ep93xx_sir_open(dongle_t *self, struct qos_info *qos);static void ep93xx_sir_close(dongle_t *self);static int  ep93xx_sir_change_speed(struct irda_task *task);static int  ep93xx_sir_reset(struct irda_task *task);static struct dongle_reg dongle = {    Q_NULL,    IRDA_EP93XX_SIR,    ep93xx_sir_open,    ep93xx_sir_close,    ep93xx_sir_reset,    ep93xx_sir_change_speed};static void ep93xx_sir_open(dongle_t *self, struct qos_info *qos){    unsigned int uiTemp;    DPRINTK("----------------\n ep93xx_sir_open \n-----------------\n");        /*      * Set UART2 to be an IrDA interface     */    uiTemp = inl(SYSCON_DEVCFG);    SysconSetLocked(SYSCON_DEVCFG, (uiTemp | SYSCON_DEVCFG_IonU2) );        /*     * Set the pulse width.     */    //uiTemp = inl(UART2ILPR);	outl( 3, UART2ILPR );    /*     * Set SIREN bit in UART2 - this enables the SIR encoder/decoder.     */    uiTemp = inl(UART2CR);    outl( (uiTemp | AMBA_UARTCR_SIREN), UART2CR );    /*     * Enable Ir in SIR mode.     */    /* Write the reg twice because of the IrDA errata.  */	outl( IrEnable_EN_SIR, IrEnable );	outl( IrEnable_EN_SIR, IrEnable );        MOD_INC_USE_COUNT;}static void ep93xx_sir_close(dongle_t *self){    unsigned int uiTemp;    DPRINTK("----------------\n ep93xx_sir_close \n-----------------\n");    /*     * Disable Ir.     */     /* for now, don't write irda regs due to errata. */	//outl( IrEnable_EN_NONE, IrEnable );    /*      * Set UART2 to be an UART     */    uiTemp = inl( SYSCON_DEVCFG );    SysconSetLocked(SYSCON_DEVCFG, (uiTemp & ~(SYSCON_DEVCFG_IonU2)) );    MOD_DEC_USE_COUNT;}/* * Function ep93xx_sir_change_speed (task) * *   Change speed of the EP93xx I/R port. We don't have to do anything *   here as long as the rate is being changed at the serial port *   level.  irtty.c should take care of that. */static int ep93xx_sir_change_speed(struct irda_task *task){    DPRINTK("----------------\n ep93xx_sir_change_speed \n-----------------\n");    irda_task_next_state(task, IRDA_TASK_DONE);    return 0;}/* * Function ep93xx_sir_reset (task) * *      Reset the EP93xx IrDA. We don't really have to do anything. * */static int ep93xx_sir_reset(struct irda_task *task){    DPRINTK("----------------\n ep93xx_sir_reset \n-----------------\n");    irda_task_next_state(task, IRDA_TASK_DONE);    return 0;}/* * Function ep93xx_sir_init(void) * *    Initialize EP93xx IrDA block in SIR mode. * */int __init ep93xx_sir_init(void){    DPRINTK("----------------\n ep93xx_sir_init \n-----------------\n");	return irda_device_register_dongle(&dongle);}/* * Function ep93xx_sir_cleanup(void) * *    Cleanup EP93xx IrDA module * */static void __exit ep93xx_sir_cleanup(void){    DPRINTK("----------------\n ep93xx_sir_cleanup \n-----------------\n");    irda_device_unregister_dongle(&dongle);}MODULE_DESCRIPTION("EP93xx SIR IrDA driver");MODULE_LICENSE("GPL");        #ifdef MODULEmodule_init(ep93xx_sir_init);module_exit(ep93xx_sir_cleanup);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -