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

📄 tda7540.c

📁 基于tda7540芯片的FM芯片
💻 C
字号:
#include "tda7540.h"static int am_fm_tuner_major = AM_FM_TUNER_MAJOR;static struct cdev am_fm_tuner_cdev;/*global variable for device*/u8 defReg[]={    0xd9,0x0,0x0,0x0,0x0,0x9f,0x8f,0x0,0x60,0xf8,		//Reg0-9    0x08,0x40,0xf3,0xaf,0x25,0x80,0xf8,0xc0,0x26,0xd9,		//Reg10-19    0x00,0x07,0x04,0x7e,0x46,0xbe,0xe7,0x7f,0x6c,0xdc,		//Reg20-29    0x25,0xdd,0x04,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe};	static 	u8 tv1_65,tv1_76,tv1_87;static	u8 tv2_65,tv2_76,tv2_87;static	u8 iq_65,iq_76,iq_87;static 	u8	curband,ifc1;static 	u8	tunermod;    static void initTuner(){    u8 addr = 0x0;        for(addr = 0; addr < 40;addr++)    {        i2c_write(addr,defReg[addr]);    }         tv1_65=0;    tv2_65=0;    tv1_76=0;    tv2_76=0;    tv1_87=0;    tv2_87=0;    iq_65=7;    iq_76=7;    iq_87=7;            curband=FM_EU_BAND;    ifc1=IFC1;	    WriteTda7540Reg(XTALREG,i2c_read(XTALREG));    WriteTda7540Reg(LEVELREG,i2c_read(LEVELREG));    WriteTda7540Reg(IFC2REG,0x8f);	 //0x8f 12.5K  0x6f 6.25k    WriteTda7540Reg(SCTRLREG,FMSCTRL);    WriteTda7540Reg(IQREG,iq_87);    WriteTda7540Reg(PLLREFREG,0x0+0x20+0x4+0x01);        IFCOnOff(1);        }static void IFCOnOff(u8 onoff){    if(onoff)        ifc1|=0x08;    else        ifc1&=~0x08;    WriteTda7540Reg(IFC1REG,ifc1);}static void setFreq(u32 freq){    u8 nl,nh;    u8 tv1_data,tv2_data,reff,minf;    char tvstep;    u16 temp;    freq+=10700;    switch(FM_EU_BAND){        case FM_EU_BAND:            minf=87;            tvstep=0;            tv1_data=tv1_87;            tv2_data=tv2_87;            reff=50;            break;        case FM_JP_BAND:            freq-=21400;            minf=76;            tvstep=-3;            tv1_data=tv1_76;            tv2_data=tv2_76;            reff=25;            break;        case FM_OT_BAND:            minf=65;            tvstep=3;            tv1_data=tv1_65;            tv2_data=tv2_65;            reff=10;            break;        case AM_MW_BAND:            minf=0;            tvstep=0;            tv1_data=0;            tv2_data=0;            reff=1;            break;    }					    temp=freq/reff;    temp-=32;    nl=temp;    nh=temp>>8;    WriteTda7540Reg(1,nl);    WriteTda7540Reg(2,nh);	    freq/=1000;	    temp=freq-minf;    tvstep*=temp;    tv1_data+=tvstep;    tv2_data+=tvstep;    WriteTda7540Reg(TV1REG,tv1_data);    WriteTda7540Reg(TV2REG,tv2_data);    WriteTda7540Reg(42,0x48); }static void WriteTda7540Reg(u8 addr,u8 data){    i2c_write(addr,data);}static ssize_t am_fm_tuner_read(struct file * filp,char __user * buff,                                size_t size,loff_t * loffp){    //u8 addr = 0x0;    //u8 data = 0xff;    //data=i2c_read(addr);    printk("\n=============tda7540 read=================\n");      return 0;}static ssize_t  am_fm_tuner_write(struct file * filp,char __user * buff,                                  size_t size,loff_t * loffp){    //unsigned char addr = 0x0;    //unsigned char data = 0x0;    //i2c_write(addr,data);    printk("\n=============tda7540 write=================\n");    return 0;}static int am_fm_tuner_ioctl(struct inode * inode,struct file * filp,                   unsigned int cmd,unsigned long arg){    u32 freq=0xff;    u8 i;    switch(cmd)    {         case TDA7540_INIT :                             initTuner();                             break;         case TDA7540_SET_FREQ :                             get_user(freq,(u32 *)arg);                             setFreq(freq);                             //setFreq(106100);                             break;         case TDA7540_GET_FREQ :/*                             freq=0;                             for(i=0x0;i<0x40;i++)                             {                             freq=i2c_read(i);                             printk("driver freq=%x\n",freq);                             }*/                             put_user(freq,(u32 *)arg);                              break;       }       return 0;} static const struct file_operations am_fm_tuner_fops = {    .owner = THIS_MODULE,    .llseek = no_llseek,    .read = am_fm_tuner_read,    .write = am_fm_tuner_write,    .ioctl = am_fm_tuner_ioctl,};static void am_fm_tuner_setup_cdev(){    int err,am_fm_tuner_devno = MKDEV(am_fm_tuner_major,0);    cdev_init(&am_fm_tuner_cdev,&am_fm_tuner_fops);    am_fm_tuner_cdev.owner = THIS_MODULE;    am_fm_tuner_cdev.ops = &am_fm_tuner_fops;    err = cdev_add(&am_fm_tuner_cdev,am_fm_tuner_devno,1);//    printk("\nam_fm_tuner_setup_cdev\n");    if(err)    {        printk(KERN_NOTICE "Error %d adding am_fm_tuner",err);    }}static int __init am_fm_tuner_init(void){    int register_result=0;    dev_t am_fm_tuner_devno = MKDEV(am_fm_tuner_major,0);  //    printk("\nbegin=========\n");    if(am_fm_tuner_major)    {        register_result = register_chrdev_region(am_fm_tuner_devno,1,"tda7540");    }    else    {//        printk("\nbefore alloc_chrdev_region\n");        register_result = alloc_chrdev_region(&am_fm_tuner_devno,0,1,"tda7540");//        printk("\nafger alloc_chrdev_region result=%d\n",register_result);        am_fm_tuner_major = MAJOR(am_fm_tuner_devno);    }    if(register_result < 0)    {//        printk("\nregister failure\n");        return register_result;    }    am_fm_tuner_setup_cdev();    return 0;}static void __exit am_fm_tuner_exit(void){    printk("\nover==========\n");    cdev_del(&am_fm_tuner_cdev);    unregister_chrdev_region(MKDEV(am_fm_tuner_major,0),1);    printk("\nend===========\n");}MODULE_LICENSE("Dual BSD/GPL");module_init(am_fm_tuner_init);module_exit(am_fm_tuner_exit);//=============================================================================//i2c_tda7540static int i2c_init(){    static int inited = 0;    if (inited) return 0;        inited = 1;    * AM_FM_TUNER_PRER_LO = 0x31;    * AM_FM_TUNER_PRER_HI = 0x0;    * AM_FM_TUNER_CTR = 0x80;        if ((* AM_FM_TUNER_PRER_LO != 0x31)||(* AM_FM_TUNER_PRER_HI != 0x0))           return -1;    else        return 0;}/* * function : read data by I2C from TDA7540 . * argument : addr, * argument description : the subaddress together with Pagemod(7th bit) in it */static u8 i2c_read(u8 addr){        u8 tmp;    u8 result;    //    printk("\n=============i2c tda7540 read=================\n");        i2c_init();     * AM_FM_TUNER_TXR = (0x31<<2)|0x0;    * AM_FM_TUNER_CR  = 0x90;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    //printk("temp1=%x\n",tmp);    //printk("RXR1=%x\n",* AM_FM_TUNER_RXR);    * AM_FM_TUNER_TXR = addr;    * AM_FM_TUNER_CR  = 0x10;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    //printk("temp2=%x\n",tmp);    //printk("RXR2=%x\n",* AM_FM_TUNER_RXR);    * AM_FM_TUNER_TXR = (0x31<<2)|0x1;    * AM_FM_TUNER_CR  = 0x90;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    //printk("temp3=%x\n",tmp);    //printk("RXR3=%x\n",* AM_FM_TUNER_RXR);    * AM_FM_TUNER_CR  = 0x60;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    //printk("temp4=%x\n",tmp);    //printk("RXR4=%x\n",* AM_FM_TUNER_RXR);    result = * AM_FM_TUNER_RXR;    return result;}/* *function: write data into tda7540 register *argument: addr, data *argument description:  * 1,addr; *        the subaddress together with Pagemode(7th bit) in it * 2,data; *        the data wiritten into tda7540 register */static int  i2c_write(u8 addr,u8 data){    u8 tmp;    //    printk("\n==========i2c tda7540 write=================\n");        i2c_init();    * AM_FM_TUNER_TXR = (0x31<<2)|0x0;      * AM_FM_TUNER_CR  = 0x90;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    * AM_FM_TUNER_TXR = addr;    * AM_FM_TUNER_CR  = 0x10;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    * AM_FM_TUNER_TXR = data;    * AM_FM_TUNER_CR  = 0x50;    do  tmp = * AM_FM_TUNER_SR;    while( tmp & 0x02);    return 1;}

⌨️ 快捷键说明

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