drivers: remove unused mtk_wcn_combo and mtk_wcn_bt
Change-Id: Ia906b9b60d327e286104fb22796eae901c27ce9e Signed-off-by: Tao Huang <huangtao@rock-chips.com>
This commit is contained in:
@@ -1,47 +0,0 @@
|
||||
# Copyright Statement:
|
||||
#
|
||||
# This software/firmware and related documentation ("MediaTek Software") are
|
||||
# protected under relevant copyright laws. The information contained herein is
|
||||
# confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
# the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
# reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
# information contained herein, in whole or in part, shall be strictly
|
||||
# prohibited.
|
||||
#
|
||||
# MediaTek Inc. (C) 2010. All rights reserved.
|
||||
#
|
||||
# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
# ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
# WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
# NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
# RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
# INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
# TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
# RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
# OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
# SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
# RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
# ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
# RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
# MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
# CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
#
|
||||
# The following software/firmware and/or related documentation ("MediaTek
|
||||
# Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
# any receiver's applicable license agreements with MediaTek Inc.
|
||||
|
||||
|
||||
#
|
||||
# Makefile for the MediaTek Bluetooth hardware control driver.
|
||||
#
|
||||
ccflags-y += -fno-pic
|
||||
|
||||
obj-y += bt_hwctl.o
|
||||
bt_hwctl-y := bt_hwctl_dev.o
|
||||
bt_hwctl-y += bt_eirq_handler.o
|
||||
bt_hwctl-y += bt_plat_smdk.o
|
||||
bt_hwctl-objs := $(bt_hwctl-y)
|
||||
@@ -1,79 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#include "bt_hwctl.h"
|
||||
|
||||
extern wait_queue_head_t eint_wait;
|
||||
extern int eint_gen;
|
||||
extern int eint_handle_method; // 0: for 4.1; 1: for 4.2
|
||||
|
||||
irqreturn_t mt_bt_eirq_handler(int i, void *arg)
|
||||
{
|
||||
struct hci_dev *hdev = NULL;
|
||||
|
||||
//printk(KERN_ALERT "mt_bt_eirq_handler\n");
|
||||
mt_bt_disable_irq();
|
||||
|
||||
if(eint_handle_method == 0) {
|
||||
//#ifdef CONFIG_BT_HCIUART
|
||||
/* BlueZ stack, hci_uart driver */
|
||||
hdev = hci_dev_get(0);
|
||||
if(hdev == NULL){
|
||||
/* Avoid the early interrupt before hci0 registered */
|
||||
//BT_HWCTL_ALERT("hdev is NULL\n");
|
||||
}else{
|
||||
//BT_HWCTL_ALERT("EINT arrives! notify host wakeup\n");
|
||||
//printk("Send host wakeup command\n");
|
||||
hci_send_cmd(hdev, 0xFCC1, 0, NULL);
|
||||
/* enable irq after receiving host wakeup command's event */
|
||||
}
|
||||
mt_bt_enable_irq();
|
||||
} else {
|
||||
//#else
|
||||
/* Maybe handle the interrupt in user space? */
|
||||
eint_gen = 1;
|
||||
wake_up_interruptible(&eint_wait);
|
||||
|
||||
/* Send host wakeup command in user space, enable irq then */
|
||||
//#endif
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef __MTK_BT_HWCTL_H
|
||||
#define __MTK_BT_HWCTL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/rfkill-rk.h>
|
||||
#include <linux/wakelock.h>
|
||||
|
||||
struct gpio_set {
|
||||
unsigned int gpio;
|
||||
int requested;
|
||||
char *label;
|
||||
};
|
||||
|
||||
extern void mt_bt_gpio_init(void);
|
||||
extern void mt_bt_gpio_release(void);
|
||||
extern int mt_bt_power_init(void);
|
||||
extern int mt_bt_power_on(void);
|
||||
extern void mt_bt_power_off(void);
|
||||
|
||||
extern irqreturn_t mt_bt_eirq_handler(int, void*);
|
||||
extern void mt_bt_enable_irq(void);
|
||||
extern void mt_bt_disable_irq(void);
|
||||
extern void *mt_bt_get_platform_data(void);
|
||||
|
||||
extern int mt6622_suspend(struct platform_device *pdev, pm_message_t state);
|
||||
extern int mt6622_resume(struct platform_device *pdev);
|
||||
|
||||
#endif
|
||||
@@ -1,442 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/errno.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <mach/gpio.h>
|
||||
|
||||
#include "bt_hwctl.h"
|
||||
|
||||
|
||||
#define BT_HWCTL_DEBUG_EN 0
|
||||
|
||||
#define BT_HWCTL_ALERT(f, s...) \
|
||||
printk(KERN_ALERT "BTHWCTL " f, ## s)
|
||||
|
||||
#if BT_HWCTL_DEBUG_EN
|
||||
#define BT_HWCTL_DEBUG(f, s...) \
|
||||
printk(KERN_INFO "BTHWCTL " f, ## s)
|
||||
#else
|
||||
#define BT_HWCTL_DEBUG(f, s...) \
|
||||
((void)0)
|
||||
#endif
|
||||
|
||||
/**************************************************************************
|
||||
* D E F I N I T I O N S *
|
||||
***************************************************************************/
|
||||
|
||||
#define BTHWCTL_NAME "bthwctl"
|
||||
#define BTHWCTL_DEV_NAME "/dev/bthwctl"
|
||||
#define BTHWCTL_IOC_MAGIC 0xf6
|
||||
#define BTHWCTL_IOCTL_SET_POWER _IOWR(BTHWCTL_IOC_MAGIC, 0, uint32_t)
|
||||
#define BTHWCTL_IOCTL_SET_EINT _IOWR(BTHWCTL_IOC_MAGIC, 1, uint32_t)
|
||||
|
||||
wait_queue_head_t eint_wait;
|
||||
int eint_gen;
|
||||
int eint_mask;
|
||||
int eint_handle_method = 0; // 0: for 4.1; 1: for 4.2
|
||||
struct wake_lock mt6622_irq_wakelock;
|
||||
int mt6622_suspend_flag;
|
||||
|
||||
struct bt_hwctl {
|
||||
bool powerup;
|
||||
dev_t dev_t;
|
||||
struct class *cls;
|
||||
struct device *dev;
|
||||
struct cdev cdev;
|
||||
struct mutex sem;
|
||||
};
|
||||
static struct bt_hwctl *bh = NULL;
|
||||
|
||||
static struct mt6622_platform_data *mt6622_pdata;
|
||||
|
||||
/*****************************************************************************
|
||||
* bt_hwctl_open
|
||||
*****************************************************************************/
|
||||
static int bt_hwctl_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
BT_HWCTL_DEBUG("bt_hwctl_open\n");
|
||||
eint_gen = 0;
|
||||
eint_mask = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* bt_hwctl_ioctl
|
||||
*****************************************************************************/
|
||||
static long bt_hwctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
BT_HWCTL_DEBUG("bt_hwctl_ioctl\n");
|
||||
|
||||
if(!bh) {
|
||||
BT_HWCTL_ALERT("bt_hwctl struct not initialized\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case BTHWCTL_IOCTL_SET_POWER:
|
||||
{
|
||||
unsigned long pwr = 0;
|
||||
if (copy_from_user(&pwr, (void*)arg, sizeof(unsigned long)))
|
||||
return -EFAULT;
|
||||
|
||||
BT_HWCTL_DEBUG("BTHWCTL_IOCTL_SET_POWER: %d\n", (int)pwr);
|
||||
|
||||
mutex_lock(&bh->sem);
|
||||
if (pwr){
|
||||
ret = mt_bt_power_on();
|
||||
}
|
||||
else{
|
||||
mt_bt_power_off();
|
||||
}
|
||||
mutex_unlock(&bh->sem);
|
||||
|
||||
break;
|
||||
}
|
||||
case BTHWCTL_IOCTL_SET_EINT:
|
||||
{
|
||||
unsigned long eint = 0;
|
||||
if (copy_from_user(&eint, (void*)arg, sizeof(unsigned long)))
|
||||
return -EFAULT;
|
||||
|
||||
BT_HWCTL_DEBUG("BTHWCTL_IOCTL_SET_EINT: %d\n", (int)eint);
|
||||
|
||||
mutex_lock(&bh->sem);
|
||||
if (eint){
|
||||
/* Enable irq from user space */
|
||||
BT_HWCTL_DEBUG("Set BT EINT enable\n");
|
||||
mt_bt_enable_irq();
|
||||
}
|
||||
else{
|
||||
/* Disable irq from user space, maybe time to close driver */
|
||||
BT_HWCTL_DEBUG("Set BT EINT disable\n");
|
||||
mt_bt_disable_irq();
|
||||
eint_mask = 1;
|
||||
wake_up_interruptible(&eint_wait);
|
||||
}
|
||||
mutex_unlock(&bh->sem);
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
BT_HWCTL_ALERT("BTHWCTL_IOCTL not support\n");
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* bt_hwctl_release
|
||||
*****************************************************************************/
|
||||
static int bt_hwctl_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
BT_HWCTL_DEBUG("bt_hwctl_release\n");
|
||||
eint_gen = 0;
|
||||
eint_mask = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
* bt_hwctl_poll
|
||||
*****************************************************************************/
|
||||
static unsigned int bt_hwctl_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
uint32_t mask = 0;
|
||||
|
||||
eint_handle_method = 1;
|
||||
|
||||
BT_HWCTL_DEBUG("bt_hwctl_poll eint_gen %d, eint_mask %d ++\n", eint_gen, eint_mask);
|
||||
//poll_wait(file, &eint_wait, wait);
|
||||
wait_event_interruptible(eint_wait, (eint_gen == 1 || eint_mask == 1));
|
||||
BT_HWCTL_DEBUG("bt_hwctl_poll eint_gen %d, eint_mask %d --\n", eint_gen, eint_mask);
|
||||
|
||||
if(mt6622_suspend_flag == 1) {
|
||||
printk("mt6622 wake lock 5000ms\n");
|
||||
mt6622_suspend_flag = 0;
|
||||
wake_lock_timeout(&mt6622_irq_wakelock, msecs_to_jiffies(5000));
|
||||
}
|
||||
|
||||
if(eint_gen == 1){
|
||||
mask = POLLIN|POLLRDNORM;
|
||||
eint_gen = 0;
|
||||
}
|
||||
else if (eint_mask == 1){
|
||||
mask = POLLERR;
|
||||
eint_mask = 0;
|
||||
}
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
static void mtk_wcn_bt_work_fun(struct work_struct *work)
|
||||
{
|
||||
struct hci_dev *hdev = NULL;
|
||||
|
||||
/* BlueZ stack, hci_uart driver */
|
||||
hdev = hci_dev_get(0);
|
||||
if(hdev == NULL){
|
||||
/* Avoid the early interrupt before hci0 registered */
|
||||
//printk(KERN_ALERT "hdev is NULL\n ");
|
||||
}else{
|
||||
//printk(KERN_ALERT "Send host wakeup command\n");
|
||||
hci_send_cmd(hdev, 0xFCC1, 0, NULL);
|
||||
}
|
||||
|
||||
mt_bt_enable_irq();
|
||||
}
|
||||
|
||||
static int mt6622_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct mt6622_platform_data *pdata = pdev->dev.platform_data;
|
||||
|
||||
printk("mt6622_probe.\n");
|
||||
|
||||
mt6622_pdata = pdata;
|
||||
if(pdata == NULL) {
|
||||
printk("mt6622_probe failed.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(pdata->power_gpio.io != INVALID_GPIO) {
|
||||
if (gpio_request(pdata->power_gpio.io, "BT_PWR_EN")){
|
||||
printk("mt6622 power_gpio is busy!\n");
|
||||
//return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO) {
|
||||
if (gpio_request(pdata->reset_gpio.io, "BT_RESET")){
|
||||
printk("mt6622 reset_gpio is busy!\n");
|
||||
gpio_free(pdata->power_gpio.io);
|
||||
//return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO) {
|
||||
if (gpio_request(pdata->irq_gpio.io, "BT_EINT")){
|
||||
printk("mt6622 irq_gpio is busy!\n");
|
||||
gpio_free(pdata->power_gpio.io);
|
||||
gpio_free(pdata->reset_gpio.io);
|
||||
//return -1;
|
||||
}
|
||||
}
|
||||
|
||||
mt_bt_power_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mt6622_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mt6622_platform_data *pdata = pdev->dev.platform_data;
|
||||
|
||||
printk("mt6622_remove.\n");
|
||||
|
||||
if(pdata) {
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_free(pdata->power_gpio.io);
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_free(pdata->reset_gpio.io);
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO)
|
||||
gpio_free(pdata->irq_gpio.io);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *mt_bt_get_platform_data(void)
|
||||
{
|
||||
return (void *)mt6622_pdata;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* K E R N E L I N T E R F A C E S *
|
||||
***************************************************************************/
|
||||
static struct file_operations bt_hwctl_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
// .ioctl = bt_hwctl_ioctl,
|
||||
.unlocked_ioctl = bt_hwctl_ioctl,
|
||||
.open = bt_hwctl_open,
|
||||
.release = bt_hwctl_release,
|
||||
.poll = bt_hwctl_poll,
|
||||
};
|
||||
|
||||
static struct platform_driver mt6622_driver = {
|
||||
.probe = mt6622_probe,
|
||||
.remove = mt6622_remove,
|
||||
.suspend = mt6622_suspend,
|
||||
.resume = mt6622_resume,
|
||||
.driver = {
|
||||
.name = "mt6622",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
static int __init bt_hwctl_init(void)
|
||||
{
|
||||
int ret = -1, err = -1;
|
||||
|
||||
BT_HWCTL_DEBUG("bt_hwctl_init\n");
|
||||
|
||||
platform_driver_register(&mt6622_driver);
|
||||
|
||||
if (!(bh = kzalloc(sizeof(struct bt_hwctl), GFP_KERNEL)))
|
||||
{
|
||||
BT_HWCTL_ALERT("bt_hwctl_init allocate dev struct failed\n");
|
||||
err = -ENOMEM;
|
||||
goto ERR_EXIT;
|
||||
}
|
||||
|
||||
ret = alloc_chrdev_region(&bh->dev_t, 0, 1, BTHWCTL_NAME);
|
||||
if (ret) {
|
||||
BT_HWCTL_ALERT("alloc chrdev region failed\n");
|
||||
goto ERR_EXIT;
|
||||
}
|
||||
|
||||
BT_HWCTL_DEBUG("alloc %s:%d:%d\n", BTHWCTL_NAME, MAJOR(bh->dev_t), MINOR(bh->dev_t));
|
||||
|
||||
cdev_init(&bh->cdev, &bt_hwctl_fops);
|
||||
|
||||
bh->cdev.owner = THIS_MODULE;
|
||||
bh->cdev.ops = &bt_hwctl_fops;
|
||||
|
||||
err = cdev_add(&bh->cdev, bh->dev_t, 1);
|
||||
if (err) {
|
||||
BT_HWCTL_ALERT("add chrdev failed\n");
|
||||
goto ERR_EXIT;
|
||||
}
|
||||
|
||||
bh->cls = class_create(THIS_MODULE, BTHWCTL_NAME);
|
||||
if (IS_ERR(bh->cls)) {
|
||||
err = PTR_ERR(bh->cls);
|
||||
BT_HWCTL_ALERT("class_create failed, errno:%d\n", err);
|
||||
goto ERR_EXIT;
|
||||
}
|
||||
|
||||
bh->dev = device_create(bh->cls, NULL, bh->dev_t, NULL, BTHWCTL_NAME);
|
||||
mutex_init(&bh->sem);
|
||||
|
||||
init_waitqueue_head(&eint_wait);
|
||||
|
||||
wake_lock_init(&mt6622_irq_wakelock, WAKE_LOCK_SUSPEND, "mt6622_irq_wakelock");
|
||||
|
||||
/*INIT_WORK(&mtk_wcn_bt_event_work, mtk_wcn_bt_work_fun);
|
||||
mtk_wcn_bt_workqueue = create_singlethread_workqueue("mtk_wcn_bt");
|
||||
if (!mtk_wcn_bt_workqueue) {
|
||||
printk("create_singlethread_workqueue failed.\n");
|
||||
err = -ESRCH;
|
||||
goto ERR_EXIT;
|
||||
}*/
|
||||
|
||||
/* request gpio used by BT */
|
||||
//mt_bt_gpio_init();
|
||||
|
||||
BT_HWCTL_DEBUG("bt_hwctl_init ok\n");
|
||||
|
||||
return 0;
|
||||
|
||||
ERR_EXIT:
|
||||
if (err == 0)
|
||||
cdev_del(&bh->cdev);
|
||||
if (ret == 0)
|
||||
unregister_chrdev_region(bh->dev_t, 1);
|
||||
|
||||
if (bh){
|
||||
kfree(bh);
|
||||
bh = NULL;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
static void __exit bt_hwctl_exit(void)
|
||||
{
|
||||
BT_HWCTL_DEBUG("bt_hwctl_exit\n");
|
||||
|
||||
wake_lock_destroy(&mt6622_irq_wakelock);
|
||||
|
||||
platform_driver_unregister(&mt6622_driver);
|
||||
|
||||
if (bh){
|
||||
cdev_del(&bh->cdev);
|
||||
|
||||
unregister_chrdev_region(bh->dev_t, 1);
|
||||
device_destroy(bh->cls, bh->dev_t);
|
||||
|
||||
class_destroy(bh->cls);
|
||||
mutex_destroy(&bh->sem);
|
||||
|
||||
kfree(bh);
|
||||
bh = NULL;
|
||||
}
|
||||
|
||||
/* release gpio used by BT */
|
||||
//mt_bt_gpio_release();
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(mt_bt_get_platform_data);
|
||||
EXPORT_SYMBOL(eint_wait);
|
||||
EXPORT_SYMBOL(eint_gen);
|
||||
//EXPORT_SYMBOL(mtk_wcn_bt_event_work);
|
||||
//EXPORT_SYMBOL(mtk_wcn_bt_workqueue);
|
||||
|
||||
module_init(bt_hwctl_init);
|
||||
module_exit(bt_hwctl_exit);
|
||||
MODULE_AUTHOR("Tingting Lei <tingting.lei@mediatek.com>");
|
||||
MODULE_DESCRIPTION("Bluetooth hardware control driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
@@ -1,291 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/iomux.h>
|
||||
//#include <plat/gpio-cfg.h>
|
||||
|
||||
#include "bt_hwctl.h"
|
||||
|
||||
extern int mt6622_suspend_flag;
|
||||
|
||||
/****************************************************************************
|
||||
* C O N S T A N T S *
|
||||
*****************************************************************************/
|
||||
#define MODULE_TAG "[MT6622] "
|
||||
|
||||
static int irq_num = -1;
|
||||
|
||||
#ifdef CONFIG_ARCH_RK29
|
||||
#define rk_mux_api_set(name,mode) rk29_mux_api_set(name,mode)
|
||||
#elif defined (CONFIG_ARCH_RK30)
|
||||
#define rk_mux_api_set(name,mode) rk30_mux_api_set(name,mode)
|
||||
#else
|
||||
#define rk_mux_api_set(name,mode) rk30_mux_api_set(name,mode)
|
||||
#endif
|
||||
|
||||
static int irq_num;
|
||||
// to avoid irq enable and disable not match
|
||||
static unsigned int irq_mask;
|
||||
//static spinlock_t bt_irq_lock;
|
||||
|
||||
/****************************************************************************
|
||||
* I R Q F U N C T I O N S *
|
||||
*****************************************************************************/
|
||||
static int mt_bt_request_irq(void)
|
||||
{
|
||||
int iRet;
|
||||
int trigger = IRQF_TRIGGER_RISING;
|
||||
struct mt6622_platform_data *pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();
|
||||
|
||||
irq_mask = 0;
|
||||
if(pdata->irq_gpio.enable == GPIO_LOW)
|
||||
trigger = IRQF_TRIGGER_FALLING;
|
||||
|
||||
iRet = request_irq(irq_num, mt_bt_eirq_handler,
|
||||
trigger, "BT_INT_B", NULL);
|
||||
if (iRet){
|
||||
printk(KERN_ALERT MODULE_TAG "request_irq IRQ%d fails, errno %d\n", irq_num, iRet);
|
||||
}
|
||||
else{
|
||||
printk(KERN_INFO MODULE_TAG "request_irq IRQ%d success\n", irq_num);
|
||||
mt_bt_disable_irq();
|
||||
/* enable irq when driver init complete, at hci_uart_open */
|
||||
}
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
static void mt_bt_free_irq(void)
|
||||
{
|
||||
if(irq_num != -1)
|
||||
free_irq(irq_num, NULL);
|
||||
irq_mask = 0;
|
||||
irq_num = -1;
|
||||
}
|
||||
|
||||
int mt6622_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
{
|
||||
if(irq_num != -1) {
|
||||
printk(KERN_INFO MODULE_TAG "mt6622_suspend\n");
|
||||
mt6622_suspend_flag = 1;
|
||||
enable_irq_wake(irq_num);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mt6622_resume(struct platform_device *pdev)
|
||||
{
|
||||
if(irq_num != -1) {
|
||||
printk(KERN_INFO MODULE_TAG "mt6622_resume\n");
|
||||
disable_irq_wake(irq_num);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mt_bt_enable_irq(void)
|
||||
{
|
||||
if (irq_mask){
|
||||
irq_mask = 0;
|
||||
enable_irq(irq_num);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mt_bt_enable_irq);
|
||||
|
||||
void mt_bt_disable_irq(void)
|
||||
{
|
||||
if (!irq_mask){
|
||||
irq_mask = 1;
|
||||
disable_irq_nosync(irq_num);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mt_bt_disable_irq);
|
||||
|
||||
/****************************************************************************
|
||||
* P O W E R C O N T R O L *
|
||||
*****************************************************************************/
|
||||
|
||||
int mt_bt_power_init(void)
|
||||
{
|
||||
struct mt6622_platform_data *pdata;
|
||||
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_init\n");
|
||||
|
||||
pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();
|
||||
|
||||
if(pdata) {
|
||||
|
||||
// PWR_EN and RESET
|
||||
/* PWR_EN set to gpio output low */
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->power_gpio.io, 0);
|
||||
/* RESET set to gpio output low */
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 0);
|
||||
msleep(200);
|
||||
|
||||
/* PWR_EN pull up */
|
||||
//if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
// gpio_direction_output(pdata->power_gpio.io, 0);
|
||||
//msleep(200);
|
||||
/* RESET pull up */
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 1);
|
||||
msleep(1000);
|
||||
|
||||
//pdata->power_gpio.io = INVALID_GPIO;
|
||||
pdata->reset_gpio.io = INVALID_GPIO;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mt_bt_power_init);
|
||||
|
||||
int mt_bt_power_on(void)
|
||||
{
|
||||
int error;
|
||||
struct mt6622_platform_data *pdata;
|
||||
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_on ++\n");
|
||||
|
||||
pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();
|
||||
|
||||
if(pdata) {
|
||||
// UART TX/RX
|
||||
|
||||
// PCMIN, PCMOUT, PCMCLK, PCMSYNC
|
||||
|
||||
// EINT
|
||||
//--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(0));
|
||||
//--s3c_gpio_setpull(GPIO_BT_EINT_PIN, S3C_GPIO_PULL_DOWN);
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_input(pdata->irq_gpio.io);
|
||||
//gpio_pull_updown(pdata->irq_gpio->io, GPIOPullDown);
|
||||
/* set to EINT mode */
|
||||
//--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(0xF));
|
||||
/* get irq number */
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO)
|
||||
irq_num = gpio_to_irq(pdata->irq_gpio.io);
|
||||
//mt_set_gpio_mode(GPIO_BT_EINT_PIN, GPIO_BT_EINT_PIN_M_GPIO);
|
||||
//mt_set_gpio_pull_enable(GPIO_BT_EINT_PIN, 1);
|
||||
//mt_set_gpio_pull_select(GPIO_BT_EINT_PIN, GPIO_PULL_DOWN);
|
||||
//mt_set_gpio_mode(GPIO_BT_EINT_PIN, GPIO_BT_EINT_PIN_M_EINT);
|
||||
|
||||
// 32k CLK
|
||||
//mt_set_gpio_mode(GPIO_BT_CLK_PIN , GPIO_BT_CLK_PIN_M_CLK);
|
||||
//mt_set_clock_output(GPIO_BT_CLK_PIN_CLK, CLK_SRC_F32K, 1);
|
||||
|
||||
if(gpio_is_valid(pdata->rts_gpio.io)) {
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_on rts iomux\n");
|
||||
rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fgpio);
|
||||
gpio_direction_output(pdata->rts_gpio.io, 0);
|
||||
}
|
||||
|
||||
// PWR_EN and RESET
|
||||
/* PWR_EN set to gpio output low */
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->power_gpio.io, 0);
|
||||
/* RESET set to gpio output low */
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 0);
|
||||
msleep(200);
|
||||
|
||||
/* PWR_EN pull up */
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->power_gpio.io, 1);
|
||||
msleep(200);
|
||||
/* RESET pull up */
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 1);
|
||||
msleep(1000);
|
||||
|
||||
if(gpio_is_valid(pdata->rts_gpio.io)) {
|
||||
rk_mux_api_set(pdata->rts_gpio.iomux.name, pdata->rts_gpio.iomux.fmux);
|
||||
}
|
||||
|
||||
error = mt_bt_request_irq();
|
||||
if (error){
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->power_gpio.io, 0);
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 0);
|
||||
//--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(1));
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->irq_gpio.io, 0);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_on --\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(mt_bt_power_on);
|
||||
|
||||
|
||||
void mt_bt_power_off(void)
|
||||
{
|
||||
struct mt6622_platform_data *pdata;
|
||||
pdata = (struct mt6622_platform_data *)mt_bt_get_platform_data();
|
||||
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_off ++\n");
|
||||
|
||||
if(pdata) {
|
||||
// PWR_EN and RESET
|
||||
if(pdata->power_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->power_gpio.io, 0);
|
||||
if(pdata->reset_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->reset_gpio.io, 0);
|
||||
|
||||
// EINT
|
||||
//--s3c_gpio_cfgpin(GPIO_BT_EINT_PIN, S3C_GPIO_SFN(1));
|
||||
if(pdata->irq_gpio.io != INVALID_GPIO)
|
||||
gpio_direction_output(pdata->irq_gpio.io, 0);
|
||||
|
||||
mt_bt_free_irq();
|
||||
}
|
||||
|
||||
printk(KERN_INFO MODULE_TAG "mt_bt_power_off --\n");
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(mt_bt_power_off);
|
||||
@@ -1,149 +0,0 @@
|
||||
menu "MediaTek Connectivity Combo Chip Config"
|
||||
|
||||
config MTK_COMBO
|
||||
bool "MediaTek Connectivity Combo Chip Support"
|
||||
help
|
||||
MTK connectivity combo chip driver for MT6620
|
||||
|
||||
#
|
||||
# MTK Combo Chip Selection
|
||||
#
|
||||
choice
|
||||
prompt "Select Chip"
|
||||
depends on MTK_COMBO
|
||||
|
||||
config MTK_COMBO_CHIP_MT6620
|
||||
bool "MT6620"
|
||||
|
||||
#config MTK_COMBO_CHIP_MT6628
|
||||
# bool "MT6628"
|
||||
endchoice
|
||||
|
||||
#
|
||||
# Target Platform Selection
|
||||
#
|
||||
config MTK_COMBO_PLAT_PATH
|
||||
string "Platform folder name"
|
||||
depends on MTK_COMBO
|
||||
default "sample" if MTK_COMBO_PLAT_SAMPLE
|
||||
help
|
||||
Specify platform folder under common driver platform folder:
|
||||
mtk_wcn_combo/common/platform/*
|
||||
|
||||
config MTK_COMBO_DRIVER_VERSION_JB2
|
||||
depends on MTK_COMBO
|
||||
bool "MediaTek Connectivity Combo Driver version is JB2 V1.0"
|
||||
default n
|
||||
|
||||
help
|
||||
MTK driver V3.1 will use a different configuration about SDIO.
|
||||
|
||||
#
|
||||
# MTK COMBO Chip Configuration
|
||||
#
|
||||
config MTK_COMBO_COMM
|
||||
depends on MTK_COMBO
|
||||
tristate "MediaTek Combo Chip Common part driver"
|
||||
help
|
||||
MediaTek combo chip common part driver
|
||||
|
||||
#config MTK_COMBO_COMM_PS
|
||||
# depends on MTK_COMBO_COMM
|
||||
# bool "Enable PS support"
|
||||
# default n
|
||||
# help
|
||||
# Enable PS support of common UART interface
|
||||
|
||||
config MTK_COMBO_COMM_UART
|
||||
depends on MTK_COMBO_COMM
|
||||
tristate "Common interface UART"
|
||||
help
|
||||
Use UART for common part interface type
|
||||
|
||||
#config MTK_COMBO_COMM_SDIO
|
||||
# depends on MTK_COMBO_COMM
|
||||
# tristate "Common interface SDIO"
|
||||
# help
|
||||
# Use SDIO for common part interface type
|
||||
|
||||
config MTK_COMBO_BT
|
||||
tristate "MediaTek Combo Chip BT driver"
|
||||
depends on MTK_COMBO
|
||||
help
|
||||
MTK BT /dev/stpbt driver for Bluedroid (mtk_stp_bt.ko)
|
||||
|
||||
config MTK_COMBO_BT_HCI
|
||||
tristate "MediaTek Combo Chip BlueZ driver"
|
||||
depends on BT && MTK_COMBO
|
||||
help
|
||||
MTK BT driver for BlueZ (hci_stp.ko)
|
||||
|
||||
config MTK_COMBO_FM
|
||||
tristate "MediaTek Combo Chip FM driver"
|
||||
depends on MTK_COMBO
|
||||
help
|
||||
MTK FM /dev/fm driver (mt6620_fm_drv.ko, mtk_fm_priv.ko)
|
||||
|
||||
config MTK_COMBO_WIFI
|
||||
tristate "MediaTek Combo Chip Wi-Fi support"
|
||||
depends on MTK_COMBO
|
||||
depends on MMC
|
||||
depends on IPV6
|
||||
select WIRELESS_EXT
|
||||
select WEXT_PRIV
|
||||
help
|
||||
This module adds support for wireless adapters based on
|
||||
MTK MT6620 chipset.
|
||||
|
||||
This driver uses the kernel's wireless extensions subsystem.
|
||||
|
||||
If you choose to build a module, it'll be called dhd. Say M if
|
||||
unsure.
|
||||
|
||||
#config MTK_COMBO_WIFI_FW_PATH
|
||||
# depends on MTK_COMBO_WIFI
|
||||
# string "Firmware path"
|
||||
# default "/system/etc/firmware/WIFI_RAM_CODE"
|
||||
# help
|
||||
# Path to the firmware file
|
||||
|
||||
config MTK_COMBO_WIFI_DEBUG
|
||||
depends on MTK_COMBO_WIFI
|
||||
bool "Enable debug output from MT6620 driver"
|
||||
help
|
||||
Enable debug messages output from MT6620 driver
|
||||
|
||||
config MTK_COMBO_WIFI_PROC
|
||||
depends on MTK_COMBO_WIFI
|
||||
bool "Enable procfs support"
|
||||
help
|
||||
Enable procfs support.
|
||||
|
||||
#config MTK_WAPI_SUPPORT
|
||||
# depends on MTK_COMBO_WIFI
|
||||
# bool "Enable WAPI support in MT6620 driver"
|
||||
# help
|
||||
# Enable WAPI support for devices using MT6620
|
||||
|
||||
choice
|
||||
prompt "Host Interface"
|
||||
depends on MTK_COMBO_WIFI
|
||||
|
||||
config MTK_COMBO_WIFI_HIF_SDIO1
|
||||
bool "SDIO #1"
|
||||
depends on MTK_COMBO_WIFI
|
||||
endchoice
|
||||
|
||||
|
||||
config MTK_GPS
|
||||
tristate "MediaTek GPS Support"
|
||||
help
|
||||
MTK GPS /dev/gps driver (mtk_gps.ko)
|
||||
|
||||
config MTK_COMBO_GPS
|
||||
tristate "MediaTek Combo Chip GPS driver"
|
||||
depends on MTK_COMBO && MTK_GPS
|
||||
help
|
||||
MTK GPS /dev/stpgps driver (mtk_stp_gps.ko)
|
||||
|
||||
endmenu
|
||||
@@ -1,60 +0,0 @@
|
||||
# Copyright Statement:
|
||||
#
|
||||
# This software/firmware and related documentation ("MediaTek Software") are
|
||||
# protected under relevant copyright laws. The information contained herein
|
||||
# is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
# Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
# any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
# and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
#
|
||||
# MediaTek Inc. (C) 2010. All rights reserved.
|
||||
#
|
||||
# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
#
|
||||
# The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
# have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
# applicable license agreements with MediaTek Inc.
|
||||
|
||||
|
||||
# combo driver: MT6620
|
||||
# If KERNELRELEASE is defined, we've been invoked from the
|
||||
# kernel build system and can use its language.
|
||||
ifneq ($(KERNELRELEASE),)
|
||||
#subdir-ccflags-y can be used in 2.6.34 in the future
|
||||
#subdir-ccflags-y += -I$(src)/common/include -I$(src)/common/linux/include
|
||||
#used for binary release script
|
||||
#KERNEL_PATH := $(pwd)
|
||||
#OBJ_PATH := $(pwd)
|
||||
obj-$(CONFIG_MTK_COMBO) += common/
|
||||
obj-$(CONFIG_MTK_COMBO_FM) += drv_fm/
|
||||
obj-$(CONFIG_MTK_COMBO_WIFI) += drv_wlan/
|
||||
|
||||
#Use BT HCI driver
|
||||
obj-$(CONFIG_MTK_COMBO_BT_HCI) += drv_bt/
|
||||
obj-$(CONFIG_MTK_GPS) += gps/
|
||||
|
||||
# Otherwise we were called directly from the command
|
||||
# line; invoke the kernel build system.
|
||||
else
|
||||
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
|
||||
PWD := $(shell pwd)
|
||||
default:
|
||||
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
|
||||
endif
|
||||
@@ -1,79 +0,0 @@
|
||||
#ccflags-y += -I$(src)/core/include
|
||||
ccflags-y += -I$(src)/linux/include -I$(src)/core/include -I$(src)/include -I$(src)/
|
||||
ccflags-y += -DWMT_PLAT_APEX=1
|
||||
ccflags-y += -DWMT_PLAT_ALPS=0
|
||||
ccflags-y += -DWMT_UART_RX_MODE_WORK=1 # 1. work thread 0. tasklet
|
||||
#ifeq ($(MTK_COMBO_CHIP), MT6628)
|
||||
#EXT_FLAG=
|
||||
#else
|
||||
#EXT_FLAG=_mt6628
|
||||
#endif
|
||||
EXT_FLAG=
|
||||
COMMON_SRC_PATH := $(src)
|
||||
COMMON_OBJ_PATH := $(src)
|
||||
|
||||
# WMT DRIVER
|
||||
obj-$(CONFIG_MTK_COMBO_COMM) += mtk_stp_wmt$(EXT_FLAG).o
|
||||
# WMT DRIVER-core part
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs := core/wmt_core.o core/wmt_ctrl.o core/wmt_func.o core/wmt_ic_6620.o core/wmt_lib.o core/wmt_conf.o core/wmt_dbg.o core/wmt_exp.o
|
||||
|
||||
#ifeq ($(MTK_COMBO_CHIP), MT6628)
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += core/wmt_ic_6628.o
|
||||
#endif
|
||||
# WMT DRIVER-linux private part
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += linux/wmt_dev.o
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += linux/wmt_tm.o
|
||||
|
||||
# WMT DRIVER-OSAL
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += linux/osal.o
|
||||
# WMT DRIVER-platform implementation
|
||||
#ccflags-y += -D WMT_PLAT_ALPS #Jake modify
|
||||
|
||||
# WMT DRIVER-platform part, specified by string CONFIG_MTK_COMBO_PLAT_PATH
|
||||
PLAT := $(shell echo $(CONFIG_MTK_COMBO_PLAT_PATH))
|
||||
|
||||
|
||||
|
||||
#obj-y += platform/$(PLAT)/mtk_wcn_cmb_stub_$(PLAT).o
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += platform/$(PLAT)/wmt_plat_$(PLAT).o
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += platform/$(PLAT)/wmt_plat_stub.o
|
||||
|
||||
# FIXME: select desired hw according to project configuration
|
||||
#ifeq ($(MTK_COMBO_CHIP), MT6628)
|
||||
#mtk_stp_wmt$(EXT_FLAG)-objs += platform/alps/mtk_wcn_cmb_hw_6628.o
|
||||
#else
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += platform/$(PLAT)/mtk_wcn_cmb_hw.o
|
||||
#endif
|
||||
|
||||
mtk_stp_wmt$(EXT_FLAG)-objs += core/stp_exp.o core/stp_core.o core/psm_core.o core/btm_core.o linux/stp_dbg.o
|
||||
#ifeq ($(MTK_COMBO_CHIP), MT6628)
|
||||
# WMT stub part (built-in kernel image)
|
||||
obj-y += platform/$(PLAT)/mtk_wcn_cmb_stub_$(PLAT).o
|
||||
#endif
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_COMM_UART) += mtk_stp_uart$(EXT_FLAG).o
|
||||
mtk_stp_uart$(EXT_FLAG)-objs := linux/stp_uart.o
|
||||
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_COMM) += mtk_hif_sdio$(EXT_FLAG).o
|
||||
mtk_hif_sdio$(EXT_FLAG)-objs := linux/hif_sdio.o
|
||||
mtk_hif_sdio$(EXT_FLAG)-objs += linux/hif_sdio_chrdev.o
|
||||
mtk_hif_sdio$(EXT_FLAG)-objs += platform/$(PLAT)/mtk_wcn_cmb_hw.o
|
||||
mtk_hif_sdio$(EXT_FLAG)-objs += platform/$(PLAT)/wmt_plat_$(PLAT).o
|
||||
mtk_hif_sdio$(EXT_FLAG)-objs += linux/osal.o
|
||||
|
||||
|
||||
# obj-$(CONFIG_MTK_COMBO) += mtk_stp_sdio$(EXT_FLAG).o
|
||||
# mtk_stp_sdio$(EXT_FLAG)-objs := linux/stp_sdio.o
|
||||
# mtk_stp_sdio$(EXT_FLAG)-objs += linux/osal.o
|
||||
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_BT) += mtk_stp_bt$(EXT_FLAG).o
|
||||
mtk_stp_bt$(EXT_FLAG)-objs := linux/stp_chrdev_bt.o
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_GPS) += mtk_stp_gps$(EXT_FLAG).o
|
||||
mtk_stp_gps$(EXT_FLAG)-objs := linux/stp_chrdev_gps.o
|
||||
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_WIFI) += mtk_wmt_wifi$(EXT_FLAG).o
|
||||
mtk_wmt_wifi$(EXT_FLAG)-objs := linux/wmt_chrdev_wifi.o
|
||||
@@ -1,761 +0,0 @@
|
||||
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "stp_dbg.h"
|
||||
#include "stp_core.h"
|
||||
#include "btm_core.h"
|
||||
|
||||
#define PFX_BTM "[STP-BTM] "
|
||||
#define STP_BTM_LOG_LOUD 4
|
||||
#define STP_BTM_LOG_DBG 3
|
||||
#define STP_BTM_LOG_INFO 2
|
||||
#define STP_BTM_LOG_WARN 1
|
||||
#define STP_BTM_LOG_ERR 0
|
||||
|
||||
INT32 gBtmDbgLevel = STP_BTM_LOG_INFO;
|
||||
|
||||
#define STP_BTM_LOUD_FUNC(fmt, arg...) if(gBtmDbgLevel >= STP_BTM_LOG_LOUD){ osal_dbg_print(PFX_BTM "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_BTM_DBG_FUNC(fmt, arg...) if(gBtmDbgLevel >= STP_BTM_LOG_DBG){ osal_dbg_print(PFX_BTM "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_BTM_INFO_FUNC(fmt, arg...) if(gBtmDbgLevel >= STP_BTM_LOG_INFO){ osal_dbg_print(PFX_BTM "[I]%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_BTM_WARN_FUNC(fmt, arg...) if(gBtmDbgLevel >= STP_BTM_LOG_WARN){ osal_dbg_print(PFX_BTM "[W]%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_BTM_ERR_FUNC(fmt, arg...) if(gBtmDbgLevel >= STP_BTM_LOG_ERR){ osal_dbg_print(PFX_BTM "[E]%s(%d):ERROR! " fmt, __FUNCTION__ , __LINE__, ##arg);}
|
||||
#define STP_BTM_TRC_FUNC(f) if(gBtmDbgLevel >= STP_BTM_LOG_DBG){ osal_dbg_print(PFX_BTM "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
INT32 gDumplogflag = 0;
|
||||
#if WMT_PLAT_ALPS
|
||||
extern void dump_uart_history(void);
|
||||
#endif
|
||||
|
||||
|
||||
#define ASSERT(expr)
|
||||
|
||||
MTKSTP_BTM_T stp_btm_i;
|
||||
MTKSTP_BTM_T *stp_btm = &stp_btm_i;
|
||||
|
||||
const PCHAR g_btm_op_name[]={
|
||||
"STP_OPID_BTM_RETRY",
|
||||
"STP_OPID_BTM_RST",
|
||||
"STP_OPID_BTM_DBG_DUMP",
|
||||
"STP_OPID_BTM_EXIT"
|
||||
};
|
||||
|
||||
#if 0
|
||||
static PCHAR _stp_pkt_type(INT32 type){
|
||||
|
||||
static CHAR s[10];
|
||||
|
||||
switch(type){
|
||||
case WMT_TASK_INDX:
|
||||
osal_memcpy(s, "WMT", strlen("WMT")+1);
|
||||
break;
|
||||
case BT_TASK_INDX:
|
||||
osal_memcpy(s, "BT", strlen("BT")+1);
|
||||
break;
|
||||
case GPS_TASK_INDX:
|
||||
osal_memcpy(s, "GPS", strlen("GPS")+1);
|
||||
break;
|
||||
case FM_TASK_INDX:
|
||||
osal_memcpy(s, "FM", strlen("FM")+1);
|
||||
break;
|
||||
default:
|
||||
osal_memcpy(s, "UNKOWN", strlen("UNKOWN")+1);
|
||||
break;
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
#endif
|
||||
|
||||
static INT32 _stp_btm_put_dump_to_nl(void)
|
||||
{
|
||||
#define NUM_FETCH_ENTRY 8
|
||||
|
||||
static UINT8 buf[2048];
|
||||
static UINT8 tmp[2048];
|
||||
|
||||
UINT32 buf_len;
|
||||
STP_PACKET_T *pkt;
|
||||
STP_DBG_HDR_T *hdr;
|
||||
INT32 remain=0, index =0;
|
||||
INT32 retry = 0, rc = 0, nl_retry = 0;
|
||||
STP_BTM_INFO_FUNC("Enter..\n");
|
||||
|
||||
index = 0;
|
||||
tmp[index++]='[';
|
||||
tmp[index++]='M';
|
||||
tmp[index++]=']';
|
||||
|
||||
do
|
||||
{
|
||||
index = 3;
|
||||
remain = stp_dbg_dmp_out_ex(&buf[0], &buf_len);
|
||||
if (buf_len > 0)
|
||||
{
|
||||
pkt = (STP_PACKET_T *)buf;
|
||||
hdr = &pkt->hdr;
|
||||
if (hdr->dbg_type == STP_DBG_FW_DMP){
|
||||
osal_memcpy(&tmp[index], pkt->raw, pkt->hdr.len);
|
||||
|
||||
if(pkt->hdr.len <= 1500)
|
||||
{
|
||||
tmp[index + pkt->hdr.len] = '\n';
|
||||
tmp[index + pkt->hdr.len + 1] = '\0';
|
||||
|
||||
//printk("\n%s\n+++\n", tmp);
|
||||
rc = stp_dbg_nl_send((PCHAR)&tmp, 2);
|
||||
|
||||
while(rc){
|
||||
nl_retry++;
|
||||
if(nl_retry > 1000){
|
||||
break;
|
||||
}
|
||||
STP_BTM_WARN_FUNC("**dump send fails, and retry again.**\n");
|
||||
osal_msleep(3);
|
||||
rc = stp_dbg_nl_send((PCHAR)&tmp, 2);
|
||||
if(!rc){
|
||||
STP_BTM_WARN_FUNC("****retry again ok!**\n");
|
||||
}
|
||||
}
|
||||
//schedule();
|
||||
} else {
|
||||
STP_BTM_INFO_FUNC("dump entry length is over long\n");
|
||||
osal_bug_on(0);
|
||||
}
|
||||
retry = 0;
|
||||
}
|
||||
}else
|
||||
{
|
||||
retry ++;
|
||||
osal_msleep(100);
|
||||
}
|
||||
}while((remain > 0) || (retry < 2));
|
||||
|
||||
STP_BTM_INFO_FUNC("Exit..\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static INT32 _stp_btm_put_dump_to_aee(void)
|
||||
{
|
||||
static UINT8 buf[2048];
|
||||
static UINT8 tmp[2048];
|
||||
|
||||
UINT32 buf_len;
|
||||
STP_PACKET_T *pkt;
|
||||
STP_DBG_HDR_T *hdr;
|
||||
INT32 remain = 0;
|
||||
INT32 retry = 0;
|
||||
INT32 ret = 0;
|
||||
STP_BTM_INFO_FUNC("Enter..\n");
|
||||
|
||||
do {
|
||||
remain = stp_dbg_dmp_out_ex(&buf[0], &buf_len);
|
||||
if (buf_len > 0) {
|
||||
pkt = (STP_PACKET_T*)buf;
|
||||
hdr = &pkt->hdr;
|
||||
if (hdr->dbg_type == STP_DBG_FW_DMP) {
|
||||
osal_memcpy(&tmp[0], pkt->raw, pkt->hdr.len);
|
||||
|
||||
if (pkt->hdr.len <= 1500) {
|
||||
tmp[pkt->hdr.len] = '\n';
|
||||
tmp[pkt->hdr.len + 1] = '\0';
|
||||
|
||||
ret = stp_dbg_aee_send(tmp, pkt->hdr.len, 0);
|
||||
} else {
|
||||
STP_BTM_INFO_FUNC("dump entry length is over long\n");
|
||||
osal_bug_on(0);
|
||||
}
|
||||
retry = 0;
|
||||
}
|
||||
} else {
|
||||
retry ++;
|
||||
osal_msleep(100);
|
||||
}
|
||||
}while ((remain > 0) || (retry < 2));
|
||||
|
||||
STP_BTM_INFO_FUNC("Exit..\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define COMBO_DUMP2AEE
|
||||
|
||||
static INT32 _stp_btm_handler(MTKSTP_BTM_T *stp_btm, P_STP_BTM_OP pStpOp)
|
||||
{
|
||||
INT32 ret = -1;
|
||||
INT32 dump_sink = 1; //core dump target, 0: aee; 1: netlink
|
||||
|
||||
if (NULL == pStpOp)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
switch(pStpOp->opId)
|
||||
{
|
||||
case STP_OPID_BTM_EXIT:
|
||||
// TODO: clean all up?
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
/*tx timeout retry*/
|
||||
case STP_OPID_BTM_RETRY:
|
||||
stp_do_tx_timeout();
|
||||
ret = 0;
|
||||
|
||||
break;
|
||||
|
||||
/*whole chip reset*/
|
||||
case STP_OPID_BTM_RST:
|
||||
STP_BTM_INFO_FUNC("whole chip reset start!\n");
|
||||
STP_BTM_INFO_FUNC("....+\n");
|
||||
if(stp_btm->wmt_notify)
|
||||
{
|
||||
stp_btm->wmt_notify(BTM_RST_OP);
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
STP_BTM_ERR_FUNC("stp_btm->wmt_notify is NULL.");
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
STP_BTM_INFO_FUNC("whole chip reset end!\n");
|
||||
|
||||
break;
|
||||
|
||||
case STP_OPID_BTM_DBG_DUMP:
|
||||
/*Notify the wmt to get dump data*/
|
||||
STP_BTM_DBG_FUNC("wmt dmp notification\n");
|
||||
dump_sink = ((stp_btm->wmt_notify(BTM_GET_AEE_SUPPORT_FLAG) == MTK_WCN_BOOL_TRUE) ? 0 : 1);
|
||||
|
||||
if (dump_sink == 0) {
|
||||
_stp_btm_put_dump_to_aee();
|
||||
} else if (dump_sink == 1) {
|
||||
_stp_btm_put_dump_to_nl();
|
||||
} else {
|
||||
STP_BTM_ERR_FUNC("unknown sink %d\n", dump_sink);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
case STP_OPID_BTM_DUMP_TIMEOUT:
|
||||
// Flush dump data, and reset compressor
|
||||
STP_BTM_INFO_FUNC("Flush dump data\n");
|
||||
wcn_core_dump_flush(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static P_OSAL_OP _stp_btm_get_op (
|
||||
MTKSTP_BTM_T *stp_btm,
|
||||
P_OSAL_OP_Q pOpQ
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp;
|
||||
//INT32 ret = 0;
|
||||
|
||||
if (!pOpQ)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("!pOpQ \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
osal_lock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
/* acquire lock success */
|
||||
RB_GET(pOpQ, pOp);
|
||||
osal_unlock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
|
||||
if (!pOp)
|
||||
{
|
||||
//STP_BTM_WARN_FUNC("RB_GET fail\n");
|
||||
}
|
||||
|
||||
return pOp;
|
||||
}
|
||||
|
||||
static INT32 _stp_btm_put_op (
|
||||
MTKSTP_BTM_T *stp_btm,
|
||||
P_OSAL_OP_Q pOpQ,
|
||||
P_OSAL_OP pOp
|
||||
)
|
||||
{
|
||||
INT32 ret;
|
||||
|
||||
if (!pOpQ || !pOp)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("invalid input param: 0x%p, 0x%p \n", pOpQ, pOp);
|
||||
return 0;//;MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
osal_lock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
/* acquire lock success */
|
||||
if (!RB_FULL(pOpQ))
|
||||
{
|
||||
RB_PUT(pOpQ, pOp);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = -1;
|
||||
}
|
||||
osal_unlock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
|
||||
if (ret)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("RB_FULL(0x%p) %d ,rFreeOpQ = %p, rActiveOpQ = %p\n", pOpQ, RB_COUNT(pOpQ),
|
||||
&stp_btm->rFreeOpQ, &stp_btm->rActiveOpQ);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
//STP_BTM_WARN_FUNC("RB_COUNT = %d\n",RB_COUNT(pOpQ));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
P_OSAL_OP _stp_btm_get_free_op (
|
||||
MTKSTP_BTM_T *stp_btm
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp;
|
||||
|
||||
if (stp_btm)
|
||||
{
|
||||
pOp = _stp_btm_get_op(stp_btm, &stp_btm->rFreeOpQ);
|
||||
if (pOp)
|
||||
{
|
||||
osal_memset(&pOp->op, 0, sizeof(pOp->op));
|
||||
}
|
||||
return pOp;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
INT32 _stp_btm_put_act_op (
|
||||
MTKSTP_BTM_T *stp_btm,
|
||||
P_OSAL_OP pOp
|
||||
)
|
||||
{
|
||||
INT32 bRet = 0;
|
||||
INT32 bCleanup = 0;
|
||||
LONG wait_ret = -1;
|
||||
|
||||
P_OSAL_SIGNAL pSignal = NULL;
|
||||
|
||||
do {
|
||||
if (!stp_btm || !pOp)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
pSignal = &pOp->signal;
|
||||
|
||||
if (pSignal->timeoutValue)
|
||||
{
|
||||
pOp->result = -9;
|
||||
osal_signal_init(&pOp->signal);
|
||||
}
|
||||
|
||||
/* put to active Q */
|
||||
bRet = _stp_btm_put_op(stp_btm, &stp_btm->rActiveOpQ, pOp);
|
||||
if(0 == bRet)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("put active queue fail\n");
|
||||
bCleanup = 1;//MTK_WCN_BOOL_TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* wake up wmtd */
|
||||
osal_trigger_event(&stp_btm->STPd_event);
|
||||
|
||||
if (pSignal->timeoutValue == 0)
|
||||
{
|
||||
bRet = 1;//MTK_WCN_BOOL_TRUE;
|
||||
/* clean it in wmtd */
|
||||
break;
|
||||
}
|
||||
|
||||
/* wait result, clean it here */
|
||||
bCleanup = 1;//MTK_WCN_BOOL_TRUE;
|
||||
|
||||
/* check result */
|
||||
wait_ret = osal_wait_for_signal_timeout(&pOp->signal);
|
||||
|
||||
STP_BTM_DBG_FUNC("wait completion:%ld\n", wait_ret);
|
||||
if (!wait_ret)
|
||||
{
|
||||
STP_BTM_ERR_FUNC("wait completion timeout \n");
|
||||
// TODO: how to handle it? retry?
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pOp->result)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("op(%d) result:%d\n", pOp->op.opId, pOp->result);
|
||||
}
|
||||
|
||||
bRet = (pOp->result) ? 0 : 1;
|
||||
}
|
||||
} while(0);
|
||||
|
||||
if (bCleanup) {
|
||||
/* put Op back to freeQ */
|
||||
_stp_btm_put_op(stp_btm, &stp_btm->rFreeOpQ, pOp);
|
||||
}
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
static INT32 _stp_btm_wait_for_msg(void *pvData)
|
||||
{
|
||||
MTKSTP_BTM_T *stp_btm = (MTKSTP_BTM_T *)pvData;
|
||||
return ((!RB_EMPTY(&stp_btm->rActiveOpQ)) || osal_thread_should_stop(&stp_btm->BTMd));
|
||||
}
|
||||
|
||||
static INT32 _stp_btm_proc (void *pvData)
|
||||
{
|
||||
MTKSTP_BTM_T *stp_btm = (MTKSTP_BTM_T *)pvData;
|
||||
P_OSAL_OP pOp;
|
||||
INT32 id;
|
||||
INT32 result;
|
||||
|
||||
if (!stp_btm)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("!stp_btm \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (;;)
|
||||
{
|
||||
pOp = NULL;
|
||||
|
||||
osal_wait_for_event(&stp_btm->STPd_event,
|
||||
_stp_btm_wait_for_msg,
|
||||
(void *)stp_btm
|
||||
);
|
||||
|
||||
if (osal_thread_should_stop(&stp_btm->BTMd))
|
||||
{
|
||||
STP_BTM_INFO_FUNC("should stop now... \n");
|
||||
// TODO: clean up active opQ
|
||||
break;
|
||||
}
|
||||
|
||||
#if 1
|
||||
if(gDumplogflag)
|
||||
{
|
||||
//printk("enter place1\n");
|
||||
#if WMT_PLAT_ALPS
|
||||
dump_uart_history();
|
||||
#endif
|
||||
gDumplogflag = 0;
|
||||
continue;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* get Op from activeQ */
|
||||
pOp = _stp_btm_get_op(stp_btm, &stp_btm->rActiveOpQ);
|
||||
|
||||
if (!pOp)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("get_lxop activeQ fail\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
id = osal_op_get_id(pOp);
|
||||
|
||||
STP_BTM_DBG_FUNC("======> lxop_get_opid = %d, %s, remaining count = *%d*\n",
|
||||
id, (id >= 4)?("???"):(g_btm_op_name[id]), RB_COUNT(&stp_btm->rActiveOpQ));
|
||||
|
||||
if (id >= STP_OPID_BTM_NUM)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("abnormal opid id: 0x%x \n", id);
|
||||
result = -1;
|
||||
goto handler_done;
|
||||
}
|
||||
|
||||
result = _stp_btm_handler(stp_btm, &pOp->op);
|
||||
|
||||
handler_done:
|
||||
|
||||
if (result)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("opid id(0x%x)(%s) error(%d)\n", id, (id >= 4)?("???"):(g_btm_op_name[id]), result);
|
||||
}
|
||||
|
||||
if (osal_op_is_wait_for_signal(pOp))
|
||||
{
|
||||
osal_op_raise_signal(pOp, result);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* put Op back to freeQ */
|
||||
_stp_btm_put_op(stp_btm, &stp_btm->rFreeOpQ, pOp);
|
||||
}
|
||||
|
||||
if (STP_OPID_BTM_EXIT == id)
|
||||
{
|
||||
break;
|
||||
} else if (STP_OPID_BTM_RST == id) {
|
||||
/* prevent multi reset case */
|
||||
stp_btm_reset_btm_wq(stp_btm);
|
||||
}
|
||||
}
|
||||
|
||||
STP_BTM_INFO_FUNC("exits \n");
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static inline INT32 _stp_btm_notify_wmt_rst_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
|
||||
P_OSAL_OP pOp;
|
||||
INT32 bRet;
|
||||
INT32 retval;
|
||||
|
||||
if(stp_btm == NULL)
|
||||
{
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
pOp = _stp_btm_get_free_op(stp_btm);
|
||||
if (!pOp)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("get_free_lxop fail \n");
|
||||
return -1;//break;
|
||||
}
|
||||
pOp->op.opId = STP_OPID_BTM_RST;
|
||||
pOp->signal.timeoutValue= 0;
|
||||
bRet = _stp_btm_put_act_op(stp_btm, pOp);
|
||||
STP_BTM_DBG_FUNC("OPID(%d) type(%d) bRet(%d) \n\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0],
|
||||
bRet);
|
||||
retval = (0 == bRet) ? STP_BTM_OPERATION_FAIL : STP_BTM_OPERATION_SUCCESS;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
static inline INT32 _stp_btm_notify_stp_retry_wq(MTKSTP_BTM_T *stp_btm){
|
||||
|
||||
P_OSAL_OP pOp;
|
||||
INT32 bRet;
|
||||
INT32 retval;
|
||||
|
||||
if(stp_btm == NULL)
|
||||
{
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
pOp = _stp_btm_get_free_op(stp_btm);
|
||||
if (!pOp)
|
||||
{
|
||||
STP_BTM_WARN_FUNC("get_free_lxop fail \n");
|
||||
return -1;//break;
|
||||
}
|
||||
pOp->op.opId = STP_OPID_BTM_RETRY;
|
||||
pOp->signal.timeoutValue= 0;
|
||||
bRet = _stp_btm_put_act_op(stp_btm, pOp);
|
||||
STP_BTM_DBG_FUNC("OPID(%d) type(%d) bRet(%d) \n\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0],
|
||||
bRet);
|
||||
retval = (0 == bRet) ? STP_BTM_OPERATION_FAIL : STP_BTM_OPERATION_SUCCESS;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static inline INT32 _stp_btm_notify_coredump_timeout_wq(MTKSTP_BTM_T *stp_btm){
|
||||
|
||||
P_OSAL_OP pOp;
|
||||
INT32 bRet;
|
||||
INT32 retval;
|
||||
|
||||
if (!stp_btm) {
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
} else {
|
||||
pOp = _stp_btm_get_free_op(stp_btm);
|
||||
if (!pOp) {
|
||||
STP_BTM_WARN_FUNC("get_free_lxop fail \n");
|
||||
return -1;//break;
|
||||
}
|
||||
pOp->op.opId = STP_OPID_BTM_DUMP_TIMEOUT;
|
||||
pOp->signal.timeoutValue= 0;
|
||||
bRet = _stp_btm_put_act_op(stp_btm, pOp);
|
||||
STP_BTM_DBG_FUNC("OPID(%d) type(%d) bRet(%d) \n\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0],
|
||||
bRet);
|
||||
retval = (0 == bRet) ? STP_BTM_OPERATION_FAIL : STP_BTM_OPERATION_SUCCESS;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
static inline INT32 _stp_btm_notify_wmt_dmp_wq(MTKSTP_BTM_T *stp_btm){
|
||||
|
||||
P_OSAL_OP pOp;
|
||||
INT32 bRet;
|
||||
INT32 retval;
|
||||
|
||||
if(stp_btm == NULL)
|
||||
{
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
}
|
||||
else
|
||||
{
|
||||
pOp = _stp_btm_get_free_op(stp_btm);
|
||||
if (!pOp)
|
||||
{
|
||||
//STP_BTM_WARN_FUNC("get_free_lxop fail \n");
|
||||
return -1;//break;
|
||||
}
|
||||
pOp->op.opId = STP_OPID_BTM_DBG_DUMP;
|
||||
pOp->signal.timeoutValue= 0;
|
||||
bRet = _stp_btm_put_act_op(stp_btm, pOp);
|
||||
STP_BTM_DBG_FUNC("OPID(%d) type(%d) bRet(%d) \n\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0],
|
||||
bRet);
|
||||
retval = (0 == bRet) ? STP_BTM_OPERATION_FAIL : STP_BTM_OPERATION_SUCCESS;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
INT32 stp_btm_notify_wmt_rst_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
return _stp_btm_notify_wmt_rst_wq(stp_btm);
|
||||
}
|
||||
|
||||
INT32 stp_btm_notify_stp_retry_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
return _stp_btm_notify_stp_retry_wq(stp_btm);
|
||||
}
|
||||
|
||||
INT32 stp_btm_notify_coredump_timeout_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
return _stp_btm_notify_coredump_timeout_wq(stp_btm);
|
||||
}
|
||||
|
||||
INT32 stp_btm_notify_wmt_dmp_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
return _stp_btm_notify_wmt_dmp_wq(stp_btm);
|
||||
}
|
||||
|
||||
MTKSTP_BTM_T *stp_btm_init(void)
|
||||
{
|
||||
INT32 i = 0x0;
|
||||
INT32 ret =-1;
|
||||
|
||||
osal_unsleepable_lock_init(&stp_btm->wq_spinlock);
|
||||
osal_event_init(&stp_btm->STPd_event);
|
||||
stp_btm->wmt_notify = wmt_lib_btm_cb;
|
||||
|
||||
RB_INIT(&stp_btm->rFreeOpQ, STP_BTM_OP_BUF_SIZE);
|
||||
RB_INIT(&stp_btm->rActiveOpQ, STP_BTM_OP_BUF_SIZE);
|
||||
|
||||
/* Put all to free Q */
|
||||
for (i = 0; i < STP_BTM_OP_BUF_SIZE; i++)
|
||||
{
|
||||
osal_signal_init(&(stp_btm->arQue[i].signal));
|
||||
_stp_btm_put_op(stp_btm, &stp_btm->rFreeOpQ, &(stp_btm->arQue[i]));
|
||||
}
|
||||
|
||||
/*Generate PSM thread, to servie STP-CORE for packet retrying and core dump receiving*/
|
||||
stp_btm->BTMd.pThreadData = (VOID *)stp_btm;
|
||||
stp_btm->BTMd.pThreadFunc = (VOID *)_stp_btm_proc;
|
||||
osal_memcpy(stp_btm->BTMd.threadName, BTM_THREAD_NAME , osal_strlen(BTM_THREAD_NAME));
|
||||
|
||||
ret = osal_thread_create(&stp_btm->BTMd);
|
||||
if (ret < 0)
|
||||
{
|
||||
STP_BTM_ERR_FUNC("osal_thread_create fail...\n");
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
|
||||
/* Start STPd thread*/
|
||||
ret = osal_thread_run(&stp_btm->BTMd);
|
||||
if(ret < 0)
|
||||
{
|
||||
STP_BTM_ERR_FUNC("osal_thread_run FAILS\n");
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
|
||||
return stp_btm;
|
||||
|
||||
ERR_EXIT1:
|
||||
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
INT32 stp_btm_deinit(MTKSTP_BTM_T *stp_btm){
|
||||
|
||||
UINT32 ret = -1;
|
||||
|
||||
STP_BTM_INFO_FUNC("btm deinit\n");
|
||||
|
||||
if(!stp_btm)
|
||||
{
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
}
|
||||
|
||||
ret = osal_thread_destroy(&stp_btm->BTMd);
|
||||
if(ret < 0)
|
||||
{
|
||||
STP_BTM_ERR_FUNC("osal_thread_destroy FAILS\n");
|
||||
return STP_BTM_OPERATION_FAIL;
|
||||
}
|
||||
|
||||
return STP_BTM_OPERATION_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
INT32 stp_btm_reset_btm_wq(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
UINT32 i = 0;
|
||||
osal_lock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
RB_INIT(&stp_btm->rFreeOpQ, STP_BTM_OP_BUF_SIZE);
|
||||
RB_INIT(&stp_btm->rActiveOpQ, STP_BTM_OP_BUF_SIZE);
|
||||
osal_unlock_unsleepable_lock(&(stp_btm->wq_spinlock));
|
||||
/* Put all to free Q */
|
||||
for (i = 0; i < STP_BTM_OP_BUF_SIZE; i++)
|
||||
{
|
||||
osal_signal_init(&(stp_btm->arQue[i].signal));
|
||||
_stp_btm_put_op(stp_btm, &stp_btm->rFreeOpQ, &(stp_btm->arQue[i]));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 stp_notify_btm_dump(MTKSTP_BTM_T *stp_btm)
|
||||
{
|
||||
//printk("%s:enter++\n",__func__);
|
||||
if(NULL == stp_btm)
|
||||
{
|
||||
osal_dbg_print("%s: NULL POINTER\n",__func__);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gDumplogflag = 1;
|
||||
osal_trigger_event(&stp_btm->STPd_event);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _BTM_CORE_H
|
||||
#define _BTM_CORE_H
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "stp_wmt.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define STP_BTM_OPERATION_FAIL (-1)
|
||||
#define STP_BTM_OPERATION_SUCCESS (0)
|
||||
|
||||
#define STP_BTM_OP_BUF_SIZE (64)
|
||||
|
||||
#define BTM_THREAD_NAME "mtk_stp_btm"
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef enum _ENUM_STP_BTM_OPID_T {
|
||||
STP_OPID_BTM_RETRY = 0x0,
|
||||
STP_OPID_BTM_RST = 0x1,
|
||||
STP_OPID_BTM_DBG_DUMP = 0x2,
|
||||
STP_OPID_BTM_DUMP_TIMEOUT = 0x3,
|
||||
STP_OPID_BTM_EXIT,
|
||||
STP_OPID_BTM_NUM
|
||||
} ENUM_STP_BTM_OPID_T, *P_ENUM_STP_BTM_OPID_T;
|
||||
|
||||
typedef OSAL_OP_DAT STP_BTM_OP;
|
||||
typedef P_OSAL_OP_DAT P_STP_BTM_OP;
|
||||
|
||||
typedef struct mtk_stp_btm
|
||||
{
|
||||
OSAL_THREAD BTMd; /* main thread (wmtd) handle */
|
||||
OSAL_EVENT STPd_event;
|
||||
OSAL_UNSLEEPABLE_LOCK wq_spinlock;
|
||||
|
||||
OSAL_OP_Q rFreeOpQ; /* free op queue */
|
||||
OSAL_OP_Q rActiveOpQ; /* active op queue */
|
||||
OSAL_OP arQue[STP_BTM_OP_BUF_SIZE]; /* real op instances */
|
||||
|
||||
/*wmt_notify*/
|
||||
INT32 (*wmt_notify)(MTKSTP_BTM_WMT_OP_T);
|
||||
}MTKSTP_BTM_T;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32 stp_btm_notify_wmt_rst_wq(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_btm_notify_stp_retry_wq(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_btm_notify_coredump_timeout_wq(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_btm_notify_wmt_dmp_wq(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_btm_deinit(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_btm_reset_btm_wq(MTKSTP_BTM_T *stp_btm);
|
||||
INT32 stp_notify_btm_dump(MTKSTP_BTM_T *stp_btm);
|
||||
|
||||
|
||||
|
||||
MTKSTP_BTM_T *stp_btm_init(void);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif
|
||||
@@ -1,63 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _DBG_CORE_H
|
||||
#define _DBG_CORE_H
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif
|
||||
@@ -1,209 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _PSM_CORE_H
|
||||
#define _PSM_CORE_H
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "stp_wmt.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define PFX_PSM "[STP-PSM] "
|
||||
#define STP_PSM_LOG_LOUD 4
|
||||
#define STP_PSM_LOG_DBG 3
|
||||
#define STP_PSM_LOG_INFO 2
|
||||
#define STP_PSM_LOG_WARN 1
|
||||
#define STP_PSM_LOG_ERR 0
|
||||
|
||||
#define ASSERT(expr)
|
||||
#define STP_PSM_FIFO_SIZE 0x2000//8kbytes
|
||||
#define STP_PSM_TX_SIZE 0x800 //2kbytes
|
||||
|
||||
#define STP_PSM_OPERATION_FAIL (-1)
|
||||
#define STP_PSM_OPERATION_SUCCESS (0)
|
||||
|
||||
#define STP_PSM_PACKET_SIZE_MAX (2000)
|
||||
#if WMT_UART_RX_MODE_WORK
|
||||
#define CFG_PSM_CORE_FIFO_SPIN_LOCK 0
|
||||
#else
|
||||
#define CFG_PSM_CORE_FIFO_SPIN_LOCK 1
|
||||
#endif
|
||||
|
||||
|
||||
#define PSM_HANDLING 127
|
||||
|
||||
#define STP_PSM_WMT_PS_TASK_HANDLING_TIME 30 //20 milli-seconds
|
||||
#define STP_PSM_IDLE_TIME_SLEEP 5000 //temporary for stress testing
|
||||
#define STP_PSM_SDIO_IDLE_TIME_SLEEP 100 //temporary for SDIO stress testing
|
||||
#define STP_PSM_WAIT_EVENT_TIMEOUT 6000
|
||||
|
||||
#define STP_PSM_WMT_EVENT_SLEEP_EN (0x1UL << 0)
|
||||
#define STP_PSM_WMT_EVENT_WAKEUP_EN (0x1UL << 1)
|
||||
#define STP_PSM_BLOCK_DATA_EN (0x1UL << 2)
|
||||
#define STP_PSM_WMT_EVENT_DISABLE_MONITOR (0x1UL << 3)
|
||||
#define STP_PSM_WMT_EVENT_ROLL_BACK_EN (0x1UL << 4)
|
||||
#define STP_PSM_RESET_EN (0x1UL << 5)
|
||||
#define STP_PSM_WMT_EVENT_HOST_WAKEUP_EN (0x1UL << 6)
|
||||
#define STP_PSM_WMT_EVENT_DISABLE_MONITOR_TX_HIGH_DENSITY (0x1UL << 7)
|
||||
#define STP_PSM_WMT_EVENT_DISABLE_MONITOR_RX_HIGH_DENSITY (0x1UL << 8)
|
||||
|
||||
|
||||
/* OP command ring buffer : must be power of 2 */
|
||||
#define STP_OP_BUF_SIZE (16)
|
||||
|
||||
#define PSM_THREAD_NAME "mtk_stp_psm"
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef enum {
|
||||
ACT = 0,
|
||||
ACT_INACT,
|
||||
INACT,
|
||||
INACT_ACT,
|
||||
STP_PSM_MAX_STATE,
|
||||
}MTKSTP_PSM_STATE_T;
|
||||
|
||||
typedef enum _ENUM_STP_OPID_T {
|
||||
STP_OPID_PSM_SLEEP = 0,
|
||||
STP_OPID_PSM_WAKEUP,
|
||||
STP_OPID_PSM_HOST_AWAKE,
|
||||
STP_OPID_PSM_EXIT,
|
||||
STP_OPID_PSM_NUM,
|
||||
STP_OPID_PSM_INALID = STP_OPID_PSM_NUM,
|
||||
} ENUM_STP_OPID_T, *P_ENUM_STP_OPID_T;
|
||||
|
||||
typedef enum {
|
||||
MON=0,
|
||||
UNMON,
|
||||
}MTKSTP_PSM_MONSTATE_T;
|
||||
|
||||
typedef INT32 (*wmt_notify_t)(MTKSTP_PSM_ACTION_T action);
|
||||
typedef INT32 (*stp_tx_cb_t)(unsigned char*buffer, UINT32 length, UINT8 type);
|
||||
|
||||
typedef OSAL_OP_DAT STP_OP;
|
||||
typedef P_OSAL_OP_DAT P_STP_OP;
|
||||
#if CFG_PSM_CORE_FIFO_SPIN_LOCK
|
||||
typedef OSAL_UNSLEEPABLE_LOCK PSM_FIFO_LOCK, *PPSM_FIFO_LOCK;
|
||||
#else
|
||||
typedef OSAL_SLEEPABLE_LOCK PSM_FIFO_LOCK, *PPSM_FIFO_LOCK;
|
||||
#endif
|
||||
|
||||
typedef struct mtk_stp_psm
|
||||
{
|
||||
OSAL_THREAD PSMd; /* main thread (wmtd) handle */
|
||||
OSAL_EVENT STPd_event;
|
||||
|
||||
OSAL_OP_Q rFreeOpQ; /* free op queue */
|
||||
OSAL_OP_Q rActiveOpQ; /* active op queue */
|
||||
OSAL_OP arQue[STP_OP_BUF_SIZE]; /* real op instances */
|
||||
|
||||
//OSAL_OP current_active_op;
|
||||
//P_OSAL_OP current_active_op;
|
||||
UINT32 last_active_opId;
|
||||
MTKSTP_PSM_STATE_T work_state; /*working state*/
|
||||
INT32 flag;
|
||||
|
||||
/* in normal cases, sleep op is always enabled; but in error cases, we can't execute sleep cmd, Eg: FW assert, core dump*/
|
||||
INT32 sleep_en;
|
||||
|
||||
// OSAL_UNSLEEPABLE_LOCK flagSpinlock;
|
||||
INT32 idle_time_to_sleep;
|
||||
OSAL_WAKE_LOCK wake_lock;
|
||||
OSAL_TIMER psm_timer; /*monitor if active*/
|
||||
OSAL_EVENT wait_wmt_q;
|
||||
OSAL_FIFO hold_fifo;
|
||||
|
||||
PSM_FIFO_LOCK hold_fifo_lock;
|
||||
|
||||
OSAL_UNSLEEPABLE_LOCK wq_spinlock;
|
||||
OSAL_SLEEPABLE_LOCK user_lock;
|
||||
OSAL_SLEEPABLE_LOCK stp_psm_lock;
|
||||
INT32 (*wmt_notify)(MTKSTP_PSM_ACTION_T action);
|
||||
INT32 (*stp_tx_cb)(unsigned char*buffer,UINT32 length, UINT8 type);
|
||||
MTK_WCN_BOOL (*is_wmt_quick_ps_support)(VOID);
|
||||
UINT8 out_buf[STP_PSM_TX_SIZE];
|
||||
}MTKSTP_PSM_T;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
/*stp-psm external function*/
|
||||
INT32 stp_psm_notify_stp(MTKSTP_PSM_T *stp_psm, const MTKSTP_PSM_ACTION_T action);
|
||||
INT32 stp_psm_notify_wmt_wakeup(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_notify_wmt_sleep(MTKSTP_PSM_T *stp_psm);
|
||||
|
||||
INT32 stp_psm_start_monitor(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_is_to_block_traffic(MTKSTP_PSM_T * stp_psm);
|
||||
INT32 stp_psm_is_disable(MTKSTP_PSM_T * stp_psm);
|
||||
INT32 stp_psm_has_pending_data(MTKSTP_PSM_T * stp_psm);
|
||||
INT32 stp_psm_release_data(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_hold_data (
|
||||
MTKSTP_PSM_T *stp_psm,
|
||||
const UINT8 *buffer,
|
||||
const UINT32 len,
|
||||
const UINT8 type
|
||||
);
|
||||
INT32 stp_psm_do_wakeup(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_disable_by_tx_rx_density(MTKSTP_PSM_T *stp_psm, INT32 dir);
|
||||
INT32 stp_psm_reset(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_disable(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_enable(MTKSTP_PSM_T *stp_psm, INT32 idle_time_to_sleep);
|
||||
struct mtk_stp_psm *stp_psm_init(void);
|
||||
INT32 stp_psm_deinit(MTKSTP_PSM_T *stp_psm);
|
||||
MTK_WCN_BOOL mtk_wcn_stp_psm_dbg_level(UINT32 dbglevel);
|
||||
INT32 stp_psm_sleep_for_thermal(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_thread_lock_aquire(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_thread_lock_release(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_set_state(MTKSTP_PSM_T *stp_psm, MTKSTP_PSM_STATE_T state);
|
||||
MTK_WCN_BOOL stp_psm_is_quick_ps_support (VOID);
|
||||
|
||||
INT32 stp_psm_set_sleep_enable(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_set_sleep_disable(MTKSTP_PSM_T *stp_psm);
|
||||
INT32 stp_psm_check_sleep_enable(MTKSTP_PSM_T *stp_psm);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif
|
||||
@@ -1,555 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _STP_CORE_H
|
||||
#define _STP_CORE_H
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "stp_exp.h"
|
||||
#include "psm_core.h"
|
||||
#include "btm_core.h"
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define CONFIG_POWER_SAVING_SUPPORT
|
||||
#if WMT_UART_RX_MODE_WORK
|
||||
#define CFG_STP_CORE_CTX_SPIN_LOCK 0
|
||||
#else
|
||||
#define CFG_STP_CORE_CTX_SPIN_LOCK 1
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#define PFX "[STP] "
|
||||
#define STP_LOG_DBG 4
|
||||
#define STP_LOG_PKHEAD 3
|
||||
#define STP_LOG_INFO 2
|
||||
#define STP_LOG_WARN 1
|
||||
#define STP_LOG_ERR 0
|
||||
|
||||
extern unsigned int gStpDbgLvl;
|
||||
|
||||
#define STP_DBG_FUNC(fmt, arg...) if(gStpDbgLvl >= STP_LOG_DBG){ osal_dbg_print(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_INFO_FUNC(fmt, arg...) if(gStpDbgLvl >= STP_LOG_INFO){ osal_dbg_print(PFX "%s:[I] " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_WARN_FUNC(fmt, arg...) if(gStpDbgLvl >= STP_LOG_WARN){ osal_dbg_print(PFX "%s:[W] " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_ERR_FUNC(fmt, arg...) if(gStpDbgLvl >= STP_LOG_ERR){ osal_dbg_print(PFX "%s:[E] " fmt, __FUNCTION__ ,##arg);}
|
||||
#define STP_TRC_FUNC(f) if(gStpDbgLvl >= STP_LOG_DBG){ osal_dbg_print(PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
#define STP_DUMP_PACKET_HEAD(a, b, c) if(gStpDbgLvl >= STP_LOG_PKHEAD){stp_dump_data(a, b, c);}
|
||||
#define STP_TRACE_FUNC(fmt, arg...) if(gStpDbgLvl >= STP_LOG_DBG){ osal_dbg_print(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
|
||||
#define MTKSTP_UART_FULL_MODE 0x01
|
||||
#define MTKSTP_UART_MAND_MODE 0x02
|
||||
#define MTKSTP_SDIO_MODE 0x04
|
||||
|
||||
#define MTKSTP_BUFFER_SIZE (16384)
|
||||
|
||||
/*To check function driver's status by the the interface*/
|
||||
/*Operation definition*/
|
||||
#define OP_FUNCTION_ACTIVE 0
|
||||
|
||||
/*Driver's status*/
|
||||
#define STATUS_OP_INVALID 0
|
||||
#define STATUS_FUNCTION_INVALID 1
|
||||
|
||||
#define STATUS_FUNCTION_ACTIVE 31
|
||||
#define STATUS_FUNCTION_INACTIVE 32
|
||||
|
||||
#define MTKSTP_CRC_SIZE (2)
|
||||
#define MTKSTP_HEADER_SIZE (4)
|
||||
#define MTKSTP_SEQ_SIZE (8)
|
||||
|
||||
/*#define MTKSTP_WINSIZE (4)*/
|
||||
#define MTKSTP_WINSIZE (7)
|
||||
#define MTKSTP_TX_TIMEOUT (180) /*TODO: Baudrate to decide this*/
|
||||
#define MTKSTP_RETRY_LIMIT (10)
|
||||
|
||||
#define INDEX_INC(idx) \
|
||||
{ \
|
||||
idx++; \
|
||||
idx &= 0x7; \
|
||||
}
|
||||
|
||||
#define INDEX_DEC(idx) \
|
||||
{ \
|
||||
idx--; \
|
||||
idx &= 0x7; \
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef INT32 (*IF_TX)(const UINT8 *data, const UINT32 size, UINT32 *written_size);
|
||||
/* event/signal */
|
||||
typedef INT32 (*EVENT_SET)(UINT8 function_type);
|
||||
typedef INT32 (*EVENT_TX_RESUME)(UINT8 winspace);
|
||||
typedef INT32 (*FUNCTION_STATUS)(UINT8 type, UINT8 op);
|
||||
typedef INT32 (*WMT_NOTIFY_FUNC_T)(UINT32 action);
|
||||
typedef INT32 (*BTM_NOTIFY_WMT_FUNC_T)(INT32);
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* common interface */
|
||||
IF_TX cb_if_tx;
|
||||
/* event/signal */
|
||||
EVENT_SET cb_event_set;
|
||||
EVENT_TX_RESUME cb_event_tx_resume;
|
||||
FUNCTION_STATUS cb_check_funciton_status;
|
||||
}mtkstp_callback;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MTKSTP_SYNC = 0,
|
||||
MTKSTP_SEQ,
|
||||
MTKSTP_ACK,
|
||||
MTKSTP_NAK,
|
||||
MTKSTP_TYPE,
|
||||
MTKSTP_LENGTH,
|
||||
MTKSTP_CHECKSUM,
|
||||
MTKSTP_DATA,
|
||||
MTKSTP_CRC1,
|
||||
MTKSTP_CRC2,
|
||||
MTKSTP_RESYNC1,
|
||||
MTKSTP_RESYNC2,
|
||||
MTKSTP_RESYNC3,
|
||||
MTKSTP_RESYNC4,
|
||||
MTKSTP_FW_MSG,
|
||||
} mtkstp_parser_state;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
mtkstp_parser_state state;
|
||||
UINT8 seq;
|
||||
UINT8 ack;
|
||||
UINT8 nak;
|
||||
UINT8 type;
|
||||
UINT16 length;
|
||||
UINT8 checksum;
|
||||
UINT16 crc;
|
||||
} mtkstp_parser_context_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 txseq; // last tx pkt's seq + 1
|
||||
UINT8 txack; // last tx pkt's ack
|
||||
UINT8 rxack; // last rx pkt's ack
|
||||
UINT8 winspace; // current sliding window size
|
||||
UINT8 expected_rxseq; // last rx pkt's seq + 1
|
||||
UINT8 retry_times;
|
||||
} mtkstp_sequence_context_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
//MTK_WCN_MUTEX mtx;
|
||||
OSAL_UNSLEEPABLE_LOCK mtx;
|
||||
UINT8 buffer[MTKSTP_BUFFER_SIZE];
|
||||
UINT32 read_p;
|
||||
UINT32 write_p;
|
||||
} mtkstp_ring_buffer_struct;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 inband_rst_set;
|
||||
UINT32 rx_counter; // size of current processing pkt in rx_buf[]
|
||||
UINT8 rx_buf[MTKSTP_BUFFER_SIZE]; // input buffer of STP, room for current processing pkt
|
||||
UINT32 tx_read; // read ptr of tx_buf[]
|
||||
UINT32 tx_write; // write ptr of tx_buf[]
|
||||
UINT8 tx_buf[MTKSTP_BUFFER_SIZE]; // output buffer of STP
|
||||
UINT32 tx_start_addr[MTKSTP_SEQ_SIZE]; // ptr of each pkt in tx_buf[]
|
||||
UINT32 tx_length[MTKSTP_SEQ_SIZE]; // length of each pkt in tx_buf[]
|
||||
mtkstp_ring_buffer_struct ring[MTKSTP_MAX_TASK_NUM]; // ring buffers for each function driver
|
||||
mtkstp_parser_context_struct parser; // current rx pkt's content
|
||||
mtkstp_sequence_context_struct sequence; // state machine's current status
|
||||
//MTK_WCN_MUTEX stp_mutex;
|
||||
#if CFG_STP_CORE_CTX_SPIN_LOCK
|
||||
OSAL_UNSLEEPABLE_LOCK stp_mutex;
|
||||
#else
|
||||
OSAL_SLEEPABLE_LOCK stp_mutex;
|
||||
#endif
|
||||
//MTK_WCN_TIMER tx_timer; // timer for tx timeout handling
|
||||
OSAL_TIMER tx_timer;
|
||||
|
||||
MTKSTP_PSM_T *psm;
|
||||
MTKSTP_BTM_T *btm;
|
||||
UINT8 f_enable; /* default disabled */
|
||||
UINT8 f_ready; /* default non-ready */
|
||||
UINT8 f_pending_type;
|
||||
UINT8 f_coredump; /*block tx flag, for now, only when f/w assert happens, we will set this bit on*/
|
||||
UINT8 en_coredump;
|
||||
/* Flag to identify Blueztooth is Bluez/or MTK Stack*/
|
||||
MTK_WCN_BOOL f_bluez;
|
||||
MTK_WCN_BOOL f_dbg_en;
|
||||
MTK_WCN_BOOL f_autorst_en;
|
||||
|
||||
|
||||
|
||||
/* Flag to identify STP by SDIO or UART */
|
||||
UINT32 f_mode;
|
||||
|
||||
/* Flag to indicate the last WMT CLOSE*/
|
||||
UINT32 f_wmt_last_close;
|
||||
}mtkstp_context_struct;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32 stp_send_data_no_ps(UINT8 *buffer, UINT32 length, UINT8 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_init
|
||||
* DESCRIPTION
|
||||
* init STP kernel
|
||||
* PARAMETERS
|
||||
* cb_func [IN] function pointers of system APIs
|
||||
* RETURNS
|
||||
* INT32 0 = success, others = failure
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_init(const mtkstp_callback * const cb_func);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_deinit
|
||||
* DESCRIPTION
|
||||
* deinit STP kernel
|
||||
* PARAMETERS
|
||||
* void
|
||||
* RETURNS
|
||||
* INT32 0 = success, others = failure
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_deinit(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_enable
|
||||
* DESCRIPTION
|
||||
* enable/disable STP
|
||||
* PARAMETERS
|
||||
* value [IN] 0 = disable, others = enable
|
||||
* RETURNS
|
||||
* INT32 0 = success, others = error
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_enable(INT32 value);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_ready
|
||||
* DESCRIPTION
|
||||
* ready/non-ready STP
|
||||
* PARAMETERS
|
||||
* value [IN] 0 = non-ready, others = ready
|
||||
* RETURNS
|
||||
* INT32 0 = success, others = error
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_ready(INT32 value);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_coredump_start_ctrl
|
||||
* DESCRIPTION
|
||||
* set f/w assert flag in STP context
|
||||
* PARAMETERS
|
||||
* value [IN] 0=assert end, others=assert begins
|
||||
* RETURNS
|
||||
* INT32 0=success, others=error
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_coredump_start_ctrl(UINT32 value);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_coredump_start_get
|
||||
* DESCRIPTION
|
||||
* get f/w assert flag in STP context
|
||||
* PARAMETERS
|
||||
* VOID
|
||||
* RETURNS
|
||||
* INT32 0= f/w assert flag is not set, others=f/w assert flag is set
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_coredump_start_get(VOID);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_send_data_raw
|
||||
* DESCRIPTION
|
||||
* send raw data to common interface, bypass STP
|
||||
* PARAMETERS
|
||||
* buffer [IN] data buffer
|
||||
* length [IN] data buffer length
|
||||
* type [IN] subfunction type
|
||||
* RETURNS
|
||||
* INT32 length transmitted
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_send_data_raw(const UINT8 *buffer, const UINT32 length, const UINT8 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_set_sdio_mode
|
||||
* DESCRIPTION
|
||||
* Set stp for SDIO mode
|
||||
* PARAMETERS
|
||||
* sdio_flag [IN] sdio mode flag (TRUE:SDIO mode, FALSE:UART mode)
|
||||
* RETURNS
|
||||
* void
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_set_mode(UINT32 sdio_flag);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_is_uart_fullset_mode
|
||||
* DESCRIPTION
|
||||
* Is stp use UART Fullset mode?
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* MTK_WCN_BOOL TRUE:UART Fullset, FALSE:UART Fullset
|
||||
*****************************************************************************/
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_is_uart_fullset_mode(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_is_uart_mand_mode
|
||||
* DESCRIPTION
|
||||
* Is stp use UART Mandatory mode?
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* MTK_WCN_BOOL TRUE:UART Mandatory, FALSE:UART Mandatory
|
||||
*****************************************************************************/
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_is_uart_mand_mode(void);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_is_sdio_mode
|
||||
* DESCRIPTION
|
||||
* Is stp use SDIO mode?
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* MTK_WCN_BOOL TRUE:SDIO mode, FALSE:UART mode
|
||||
*****************************************************************************/
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_is_sdio_mode(void);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* stp_send_inband_reset
|
||||
* DESCRIPTION
|
||||
* To sync to oringnal stp state with f/w stp
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* none
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_inband_reset(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* stp_send_inband_reset
|
||||
* DESCRIPTION
|
||||
* To send testing command to chip
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* none
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_test_cmd(INT32 no);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* stp_send_inband_reset
|
||||
* DESCRIPTION
|
||||
* To control STP debugging mechanism
|
||||
* PARAMETERS
|
||||
* func_no: function control, func_op: dumpping filer, func_param: dumpping parameter
|
||||
* RETURNS
|
||||
* none
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_debug_ctrl(INT32 func_no, INT32 func_op, INT32 func_param);
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_flush
|
||||
* DESCRIPTION
|
||||
* flush all stp context
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* none
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_flush_context(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_rx_queue
|
||||
* DESCRIPTION
|
||||
* flush all stp rx queue
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* none
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_flush_rx_queue(UINT32 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* set stp debugging mdoe
|
||||
* DESCRIPTION
|
||||
* set stp debugging mdoe
|
||||
* PARAMETERS
|
||||
* dbg_mode: switch to dbg mode ?
|
||||
* RETURNS
|
||||
* void
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_set_dbg_mode(MTK_WCN_BOOL dbg_mode);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* set stp auto reset mdoe
|
||||
* DESCRIPTION
|
||||
* set stp auto reset mdoe
|
||||
* PARAMETERS
|
||||
* auto_rst: switch to auto reset mode ?
|
||||
* RETURNS
|
||||
* void
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_set_auto_rst(MTK_WCN_BOOL auto_rst);
|
||||
|
||||
/*stp_psm support*/
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_psm_notify_stp
|
||||
* DESCRIPTION
|
||||
* WMT notification to STP that power saving job is done or not
|
||||
* PARAMETERS
|
||||
*
|
||||
* RETURNS
|
||||
* 0: Sccuess Negative value: Fail
|
||||
*****************************************************************************/
|
||||
extern int mtk_wcn_stp_psm_notify_stp(const UINT32 action);
|
||||
|
||||
extern int mtk_wcn_stp_set_psm_state(MTKSTP_PSM_STATE_T state);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_psm_enabla
|
||||
* DESCRIPTION
|
||||
* enable STP PSM
|
||||
* PARAMETERS
|
||||
* int idle_time_to_sleep: IDLE time to sleep
|
||||
* RETURNS
|
||||
* 0: Sccuess Negative value: Fail
|
||||
*****************************************************************************/
|
||||
extern int mtk_wcn_stp_psm_enable(int idle_time_to_sleep);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_psm_disable
|
||||
* DESCRIPTION
|
||||
* disable STP PSM
|
||||
* PARAMETERS
|
||||
* void
|
||||
* RETURNS
|
||||
* 0: Sccuess Negative value: Fail
|
||||
*****************************************************************************/
|
||||
extern int mtk_wcn_stp_psm_disable(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_psm_reset
|
||||
* DESCRIPTION
|
||||
* reset STP PSM (used on whole chip reset)
|
||||
* PARAMETERS
|
||||
* void
|
||||
* RETURNS
|
||||
* 0: Sccuess Negative value: Fail
|
||||
*****************************************************************************/
|
||||
extern int mtk_wcn_stp_psm_reset(void);
|
||||
extern void stp_do_tx_timeout(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_btm_get_dmp
|
||||
* DESCRIPTION
|
||||
* get stp dump related information
|
||||
* PARAMETERS
|
||||
* buffer: dump placement, len: dump size
|
||||
* RETURNS
|
||||
* 0: Success Negative Value: Fail
|
||||
*****************************************************************************/
|
||||
extern int mtk_wcn_stp_btm_get_dmp(char *buf, int *len);
|
||||
|
||||
extern int mtk_wcn_stp_dbg_enable(void);
|
||||
|
||||
extern int mtk_wcn_stp_dbg_disable(void);
|
||||
|
||||
extern void mtk_wcn_stp_set_if_tx_type (ENUM_STP_TX_IF_TYPE stp_if_type);
|
||||
|
||||
extern int mtk_wcn_sys_if_rx(UINT8 *data, INT32 size);
|
||||
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_dbg_level(UINT32 dbglevel);
|
||||
|
||||
extern INT32 mtk_wcn_stp_dbg_dump_package(VOID);
|
||||
|
||||
extern int stp_drv_init(void);
|
||||
|
||||
extern void stp_drv_exit(void);
|
||||
|
||||
extern INT32 mtk_wcn_stp_dbg_log_ctrl(UINT32 on);
|
||||
|
||||
extern INT32 mtk_wcn_stp_coredump_flag_ctrl(UINT32 on);
|
||||
|
||||
extern INT32 mtk_wcn_stp_coredump_flag_get(VOID);
|
||||
extern INT32 mtk_wcn_stp_notify_sleep_for_thermal(void);
|
||||
|
||||
|
||||
extern INT32 mtk_wcn_stp_set_wmt_last_close(UINT32 value);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _STP_CORE_H_ */
|
||||
@@ -1,89 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _STP_WMT_H
|
||||
#define _STP_WMT_H
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
BTM_RST_OP = 0,
|
||||
BTM_DMP_OP = 1,
|
||||
BTM_GET_AEE_SUPPORT_FLAG= 2,
|
||||
BTM_MAX_OP,
|
||||
}MTKSTP_BTM_WMT_OP_T;
|
||||
|
||||
typedef enum {
|
||||
SLEEP = 0,
|
||||
HOST_AWAKE,
|
||||
WAKEUP,
|
||||
EIRQ,
|
||||
ROLL_BACK,
|
||||
STP_PSM_MAX_ACTION
|
||||
}MTKSTP_PSM_ACTION_T;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
extern MTK_WCN_BOOL wmt_lib_btm_cb (
|
||||
MTKSTP_BTM_WMT_OP_T op
|
||||
);
|
||||
|
||||
extern INT32 wmt_lib_ps_stp_cb (
|
||||
MTKSTP_PSM_ACTION_T action
|
||||
);
|
||||
extern MTK_WCN_BOOL wmt_lib_is_quick_ps_support (VOID);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _STP_WMT_H_*/
|
||||
|
||||
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_CONF_H_
|
||||
#define _WMT_CONF_H_
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define CUST_CFG_WMT "WMT.cfg"
|
||||
#define CUST_CFG_WMT_PREFIX "/system/etc/firmware/"
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
INT32 wmt_conf_read_file(VOID);
|
||||
P_WMT_GEN_CONF wmt_conf_get_cfg(VOID);
|
||||
INT32 wmt_conf_set_cfg_file(const char *name);
|
||||
|
||||
|
||||
#endif /* _WMT_CONF_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,460 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_CORE_H_
|
||||
#define _WMT_CORE_H_
|
||||
|
||||
#include "osal.h"
|
||||
#include "wmt_ctrl.h"
|
||||
#include "wmt_exp.h"
|
||||
#include "wmt_plat.h"
|
||||
//TODO: [GeorgeKuo][FixMe] remove temporarily
|
||||
//#include "mtk_wcn_cmb_stub.h" /* for AIF state definition */
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if defined(MT6620E3) || defined(MT6620E6) //need modify this part
|
||||
#define CFG_CORE_MT6620_SUPPORT 1 /* whether MT6620 is supported or not */
|
||||
#else
|
||||
#define CFG_CORE_MT6620_SUPPORT 1 /* whether MT6620 is supported or not */
|
||||
#endif
|
||||
|
||||
#if defined(MT6628)
|
||||
#define CFG_CORE_MT6628_SUPPORT 1 /* whether MT6628 is supported or not */
|
||||
#else
|
||||
#define CFG_CORE_MT6628_SUPPORT 1 /* whether MT6628 is supported or not */
|
||||
#endif
|
||||
|
||||
// TODO:[ChangeFeature][George] move this definition outside so that wmt_dev can remove wmt_core.h inclusion.
|
||||
#define defaultPatchName "mt66xx_patch_hdr.bin"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define BCNT_PATCH_BUF_HEADROOM (8)
|
||||
|
||||
#define DWCNT_HIF_CONF (4)
|
||||
#define DWCNT_STRAP_CONF (4)
|
||||
#define DWCNT_RESERVED (8)
|
||||
#define DWCNT_CTRL_DATA (16)
|
||||
|
||||
|
||||
#if 0 // TODO: [obsolete][GeorgeKuo]: remove ubsolete definitions
|
||||
#define WMT_SET (1)
|
||||
#define WMT_QUERY (0)
|
||||
#define WMT_PKT_FMT_RAW (1)
|
||||
#define WMT_PKT_FMT_STP (0)
|
||||
#endif
|
||||
|
||||
#define WMT_FUNC_CTRL_ON (MTK_WCN_BOOL_TRUE)
|
||||
#define WMT_FUNC_CTRL_OFF (MTK_WCN_BOOL_FALSE)
|
||||
|
||||
#define WMT_HDR_LEN (4) /* header length */
|
||||
#define WMT_STS_LEN (1) /* status length */
|
||||
#define WMT_FLAG_LEN (1)
|
||||
#define WMT_HIF_UART_INFO_LEN (4)
|
||||
#define WMT_FUNC_CTRL_PARAM_LEN (1)
|
||||
#define WMT_LPBK_CMD_LEN (5)
|
||||
#define WMT_LPBK_BUF_LEN (1024+WMT_LPBK_CMD_LEN)
|
||||
#define WMT_DEFAULT_BAUD_RATE (115200)
|
||||
|
||||
#define INIT_CMD(c, e, s) {.cmd= c, .cmdSz=sizeof(c), .evt=e, .evtSz=sizeof(e), .str=s}
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef enum _ENUM_WMT_FM_T
|
||||
{
|
||||
WMT_FM_INVALID = 0,
|
||||
WMT_FM_I2C = 1,
|
||||
WMT_FM_COMM = 2,
|
||||
WMT_FM_MAX
|
||||
} ENUM_WMT_FM_T, *P_ENUM_WMT_FM_T;
|
||||
|
||||
typedef enum _ENUM_WMT_HIF_T
|
||||
{
|
||||
WMT_HIF_UART = 0,
|
||||
WMT_HIF_SDIO = 1,
|
||||
WMT_HIF_MAX
|
||||
} ENUM_WMT_HIF_T, *P_ENUM_WMT_HIF_T;
|
||||
|
||||
#if 0 /* [George] moved to wmt_exp.h for hif_sdio's use */
|
||||
typedef enum {
|
||||
WMT_SDIO_SLOT_INVALID = 0,
|
||||
WMT_SDIO_SLOT_SDIO1 = 1, /* Wi-Fi dedicated SDIO1*/
|
||||
WMT_SDIO_SLOT_SDIO2 = 2,
|
||||
WMT_SDIO_SLOT_MAX
|
||||
} WMT_SDIO_SLOT_NUM;
|
||||
|
||||
typedef enum {
|
||||
WMT_SDIO_FUNC_STP = 0,
|
||||
WMT_SDIO_FUNC_WIFI = 1,
|
||||
WMT_SDIO_FUNC_MAX
|
||||
} WMT_SDIO_FUNC_TYPE;
|
||||
#endif
|
||||
|
||||
typedef enum _ENUM_WMT_OPID_T {
|
||||
WMT_OPID_HIF_CONF = 0,
|
||||
WMT_OPID_PWR_ON = 1,
|
||||
WMT_OPID_PWR_OFF = 2,
|
||||
WMT_OPID_FUNC_ON = 3,
|
||||
WMT_OPID_FUNC_OFF = 4,
|
||||
WMT_OPID_REG_RW = 5, // TODO:[ChangeFeature][George] is this OP obsoleted?
|
||||
WMT_OPID_EXIT = 6,
|
||||
WMT_OPID_PWR_SV = 7,
|
||||
WMT_OPID_DSNS = 8,
|
||||
WMT_OPID_LPBK = 9,
|
||||
WMT_OPID_CMD_TEST = 10,
|
||||
WMT_OPID_HW_RST = 11,
|
||||
WMT_OPID_SW_RST = 12,
|
||||
WMT_OPID_BAUD_RST = 13,
|
||||
WMT_OPID_STP_RST = 14,
|
||||
WMT_OPID_THERM_CTRL = 15,
|
||||
WMT_OPID_EFUSE_RW = 16,
|
||||
WMT_OPID_GPIO_CTRL = 17,
|
||||
WMT_OPID_SDIO_CTRL = 18,
|
||||
WMT_OPID_FW_COREDMP = 19,
|
||||
WMT_OPID_GPIO_STATE = 20,
|
||||
WMT_OPID_MAX
|
||||
} ENUM_WMT_OPID_T, *P_ENUM_WMT_OPID_T;
|
||||
|
||||
typedef OSAL_OP_DAT WMT_OP;
|
||||
typedef P_OSAL_OP_DAT P_WMT_OP;
|
||||
|
||||
typedef enum _ENUM_WMT_UART_FC_T
|
||||
{
|
||||
WMT_UART_NO_FC = 0,
|
||||
WMT_UART_MTK_SW_FC = 1,
|
||||
WMT_UART_LUX_SW_FC = 2,
|
||||
WMT_UART_HW_FC = 3,
|
||||
WMT_UART_MAX
|
||||
} ENUM_WMT_UART_FC_T, *P_ENUM_UART_FC_T;
|
||||
|
||||
|
||||
typedef struct _WMT_HIF_CONF {
|
||||
UINT32 hifType; // HIF Type
|
||||
UINT32 uartFcCtrl; // UART FC config
|
||||
UINT32 au4HifConf[DWCNT_HIF_CONF]; // HIF Config
|
||||
UINT32 au4StrapConf[DWCNT_STRAP_CONF]; // Strap Config
|
||||
} WMT_HIF_CONF, *P_WMT_HIF_CONF;
|
||||
|
||||
typedef INT32 (*WMT_OPID_FUNC)(P_WMT_OP);
|
||||
|
||||
typedef struct _WMT_GEN_CONF {
|
||||
UCHAR cfgExist;
|
||||
|
||||
UCHAR coex_wmt_ant_mode;
|
||||
UCHAR coex_wmt_wifi_time_ctl;
|
||||
UCHAR coex_wmt_ext_pta_dev_on;
|
||||
|
||||
UCHAR coex_bt_rssi_upper_limit;
|
||||
UCHAR coex_bt_rssi_mid_limit;
|
||||
UCHAR coex_bt_rssi_lower_limit;
|
||||
UCHAR coex_bt_pwr_high;
|
||||
UCHAR coex_bt_pwr_mid;
|
||||
UCHAR coex_bt_pwr_low;
|
||||
|
||||
UCHAR coex_wifi_rssi_upper_limit;
|
||||
UCHAR coex_wifi_rssi_mid_limit;
|
||||
UCHAR coex_wifi_rssi_lower_limit;
|
||||
UCHAR coex_wifi_pwr_high;
|
||||
UCHAR coex_wifi_pwr_mid;
|
||||
UCHAR coex_wifi_pwr_low;
|
||||
|
||||
UCHAR coex_ext_pta_hi_tx_tag;
|
||||
UCHAR coex_ext_pta_hi_rx_tag;
|
||||
UCHAR coex_ext_pta_lo_tx_tag;
|
||||
UCHAR coex_ext_pta_lo_rx_tag;
|
||||
UINT16 coex_ext_pta_sample_t1;
|
||||
UINT16 coex_ext_pta_sample_t2;
|
||||
UCHAR coex_ext_pta_wifi_bt_con_trx;
|
||||
|
||||
UINT32 coex_misc_ext_pta_on;
|
||||
UINT32 coex_misc_ext_feature_set;
|
||||
/*GPS LNA setting*/
|
||||
UCHAR wmt_gps_lna_pin;
|
||||
UCHAR wmt_gps_lna_enable;
|
||||
/*Power on sequence*/
|
||||
UCHAR pwr_on_rtc_slot;
|
||||
UCHAR pwr_on_ldo_slot;
|
||||
UCHAR pwr_on_rst_slot;
|
||||
UCHAR pwr_on_off_slot;
|
||||
UCHAR pwr_on_on_slot;
|
||||
UCHAR co_clock_flag;
|
||||
|
||||
/* Combo chip side SDIO driving setting */
|
||||
UINT32 sdio_driving_cfg;
|
||||
|
||||
} WMT_GEN_CONF, *P_WMT_GEN_CONF;
|
||||
|
||||
typedef enum _ENUM_DRV_STS_ {
|
||||
#if 0
|
||||
DRV_STS_INVALID = 0,
|
||||
DRV_STS_UNREG = 1, /* Initial State */
|
||||
#endif
|
||||
DRV_STS_POWER_OFF = 0, /* initial state */
|
||||
DRV_STS_POWER_ON = 1, /* powered on, only WMT */
|
||||
DRV_STS_FUNC_ON = 2, /* FUNC ON */
|
||||
DRV_STS_MAX
|
||||
} ENUM_DRV_STS, *P_ENUM_DRV_STS;
|
||||
|
||||
typedef enum _WMT_IC_PIN_ID_
|
||||
{
|
||||
WMT_IC_PIN_AUDIO = 0,
|
||||
WMT_IC_PIN_EEDI = 1,
|
||||
WMT_IC_PIN_EEDO = 2,
|
||||
WMT_IC_PIN_GSYNC = 3,
|
||||
WMT_IC_PIN_MAX
|
||||
}WMT_IC_PIN_ID, *P_WMT_IC_PIN_ID;
|
||||
|
||||
|
||||
typedef enum _WMT_IC_PIN_STATE_
|
||||
{
|
||||
WMT_IC_PIN_EN = 0,
|
||||
WMT_IC_PIN_DIS = 1,
|
||||
WMT_IC_AIF_0 = 2, // = CMB_STUB_AIF_0,
|
||||
WMT_IC_AIF_1 = 3, // = CMB_STUB_AIF_1,
|
||||
WMT_IC_AIF_2 = 4, // = CMB_STUB_AIF_2,
|
||||
WMT_IC_AIF_3 = 5, // = CMB_STUB_AIF_3,
|
||||
WMT_IC_PIN_MUX = 6,
|
||||
WMT_IC_PIN_GPIO = 7,
|
||||
WMT_IC_PIN_GPIO_HIGH = 8,
|
||||
WMT_IC_PIN_GPIO_LOW = 8,
|
||||
WMT_IC_PIN_STATE_MAX
|
||||
} WMT_IC_PIN_STATE, *P_WMT_IC_PIN_STATE;
|
||||
|
||||
typedef enum _WMT_CO_CLOCK_
|
||||
{
|
||||
WMT_CO_CLOCK_DIS = 0,
|
||||
WMT_CO_CLOCK_EN = 1,
|
||||
WMT_CO_CLOCK_MAX
|
||||
} WMT_CO_CLOCK, *P_WMT_CO_CLOCK;
|
||||
|
||||
|
||||
typedef INT32 (*SW_INIT)(P_WMT_HIF_CONF pWmtHifConf);
|
||||
typedef INT32 (*SW_DEINIT)(P_WMT_HIF_CONF pWmtHifConf);
|
||||
typedef INT32 (*IC_PIN_CTRL)(WMT_IC_PIN_ID id, WMT_IC_PIN_STATE state, UINT32 flag);
|
||||
typedef INT32 (*IC_VER_CHECK)(VOID);
|
||||
typedef INT32 (*CO_CLOCK_CTRL)(WMT_CO_CLOCK on);
|
||||
typedef MTK_WCN_BOOL(*IS_QUICK_SLEEP_SUPPORT)(VOID);
|
||||
typedef MTK_WCN_BOOL(*IS_AEE_DUMP_SUPPORT)(VOID);
|
||||
|
||||
|
||||
typedef struct _WMT_IC_OPS_ {
|
||||
UINT32 icId;
|
||||
SW_INIT sw_init;
|
||||
SW_DEINIT sw_deinit;
|
||||
IC_PIN_CTRL ic_pin_ctrl;
|
||||
IC_VER_CHECK ic_ver_check;
|
||||
CO_CLOCK_CTRL co_clock_ctrl;
|
||||
IS_QUICK_SLEEP_SUPPORT is_quick_sleep;
|
||||
IS_AEE_DUMP_SUPPORT is_aee_dump_support;
|
||||
} WMT_IC_OPS, *P_WMT_IC_OPS;
|
||||
|
||||
typedef struct _WMT_CTX_
|
||||
{
|
||||
ENUM_DRV_STS eDrvStatus[WMTDRV_TYPE_MAX]; /* Controlled driver status */
|
||||
UINT32 wmtInfoBit; /* valid info bit */
|
||||
WMT_HIF_CONF wmtHifConf; /* HIF information */
|
||||
|
||||
/* Pointer to WMT_IC_OPS. Shall be assigned to a correct table in stp_init
|
||||
* if and only if getting chip id successfully. hwver and fwver are kept in
|
||||
* WMT-IC module only.
|
||||
*/
|
||||
P_WMT_IC_OPS p_ic_ops;
|
||||
} WMT_CTX, *P_WMT_CTX;
|
||||
|
||||
// TODO:[ChangeFeature][George] remove WMT_PKT. replace it with hardcoded arrays.
|
||||
// Using this struct relies on compiler's implementation and pack() settings
|
||||
typedef struct _WMT_PKT_ {
|
||||
UINT8 eType; // PKT_TYPE_*
|
||||
UINT8 eOpCode; // OPCODE_*
|
||||
UINT16 u2SduLen; // 2 bytes length, little endian
|
||||
UINT8 aucParam[32];
|
||||
} WMT_PKT, *P_WMT_PKT;
|
||||
|
||||
/* WMT Packet Format */
|
||||
typedef enum _ENUM_PKT_TYPE {
|
||||
PKT_TYPE_INVALID = 0,
|
||||
PKT_TYPE_CMD = 1,
|
||||
PKT_TYPE_EVENT = 2,
|
||||
PKT_TYPE_MAX
|
||||
} ENUM_PKT_TYPE, *P_ENUM_PKT_TYPE;
|
||||
|
||||
typedef enum _ENUM_OPCODE {
|
||||
OPCODE_INVALID = 0,
|
||||
OPCODE_PATCH = 1,
|
||||
OPCODE_TEST = 2,
|
||||
OPCODE_WAKEUP = 3,
|
||||
OPCODE_HIF = 4,
|
||||
OPCODE_STRAP_CONF = 5,
|
||||
OPCODE_FUNC_CTRL = 6,
|
||||
OPCODE_RESET = 7,
|
||||
OPCODE_INT = 8,
|
||||
OPCODE_MAX
|
||||
} ENUM_OPCODE, *P_ENUM_OPCODE;
|
||||
|
||||
typedef enum {
|
||||
WMT_STP_CONF_EN = 0,
|
||||
WMT_STP_CONF_RDY = 1,
|
||||
WMT_STP_CONF_MODE = 2,
|
||||
WMT_STP_CONF_MAX
|
||||
} WMT_STP_CONF_TYPE;
|
||||
|
||||
struct init_script {
|
||||
UCHAR *cmd;
|
||||
UINT32 cmdSz;
|
||||
UCHAR *evt;
|
||||
UINT32 evtSz;
|
||||
UCHAR *str;
|
||||
};
|
||||
|
||||
typedef struct _WMT_PATCH {
|
||||
UINT8 ucDateTime[16];
|
||||
UINT8 ucPLat[4];
|
||||
UINT16 u2HwVer;
|
||||
UINT16 u2SwVer;
|
||||
UINT32 u4PatchVer;
|
||||
} WMT_PATCH, *P_WMT_PATCH;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern INT32 wmt_core_init(VOID);
|
||||
extern INT32 wmt_core_deinit(VOID);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_wmtd
|
||||
* DESCRIPTION
|
||||
* deinit STP kernel
|
||||
* PARAMETERS
|
||||
* void
|
||||
* RETURNS
|
||||
* INT32 0 = success, others = failure
|
||||
*****************************************************************************/
|
||||
extern INT32
|
||||
wmt_core_opid (
|
||||
P_WMT_OP pWmtOp
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_ctrl (
|
||||
ENUM_WMT_CTRL_T ctrId,
|
||||
PUINT32 pPa1,
|
||||
PUINT32 pPa2
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_func_ctrl_cmd (
|
||||
ENUM_WMTDRV_TYPE_T type,
|
||||
MTK_WCN_BOOL fgEn
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_reg_rw_raw (
|
||||
UINT32 isWrite,
|
||||
UINT32 offset,
|
||||
PUINT32 pVal,
|
||||
UINT32 mask
|
||||
);
|
||||
|
||||
extern VOID
|
||||
wmt_core_dump_data (
|
||||
PUINT8 pData,
|
||||
PUINT8 pTitle,
|
||||
UINT32 len
|
||||
);
|
||||
|
||||
extern MTK_WCN_BOOL
|
||||
wmt_core_patch_check (
|
||||
UINT32 u4PatchVer,
|
||||
UINT32 u4HwVer
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_init_script (
|
||||
struct init_script *script,
|
||||
INT32 count
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_rx (
|
||||
PUINT8 pBuf,
|
||||
UINT32 bufLen,
|
||||
UINT32 *readSize
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_core_tx (
|
||||
const UINT8 *pData,
|
||||
UINT32 size,
|
||||
UINT32 *writtenSize,
|
||||
MTK_WCN_BOOL bRawFlag
|
||||
);
|
||||
extern MTK_WCN_BOOL wmt_core_is_quick_ps_support (void);
|
||||
|
||||
extern MTK_WCN_BOOL wmt_core_get_aee_dump_flag(void);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static _osal_inline_ MTK_WCN_BOOL
|
||||
wmt_core_ic_ops_check (
|
||||
P_WMT_IC_OPS p_ops
|
||||
)
|
||||
{
|
||||
if (!p_ops) {
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
if ( (NULL == p_ops->sw_init)
|
||||
|| (NULL == p_ops->sw_deinit)
|
||||
|| (NULL == p_ops->ic_ver_check)
|
||||
|| (NULL == p_ops->ic_pin_ctrl) ) {
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
else {
|
||||
return MTK_WCN_BOOL_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _WMT_CORE_H_ */
|
||||
|
||||
@@ -1,135 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_CTRL_H_
|
||||
#define _WMT_CTRL_H_
|
||||
|
||||
#include "osal.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define DWCNT_CTRL_DATA (16)
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef struct _WMT_CTRL_DATA_ {
|
||||
UINT32 ctrlId;
|
||||
UINT32 au4CtrlData[DWCNT_CTRL_DATA];
|
||||
} WMT_CTRL_DATA, *P_WMT_CTRL_DATA;
|
||||
|
||||
typedef enum _ENUM_WMT_CTRL_T {
|
||||
WMT_CTRL_HW_PWR_OFF = 0, /* whole chip power off */
|
||||
WMT_CTRL_HW_PWR_ON = 1, /* whole chip power on */
|
||||
WMT_CTRL_HW_RST = 2,/* whole chip power on */
|
||||
WMT_CTRL_STP_CLOSE = 3,
|
||||
WMT_CTRL_STP_OPEN = 4,
|
||||
WMT_CTRL_STP_CONF = 5,
|
||||
WMT_CTRL_FREE_PATCH = 6,
|
||||
WMT_CTRL_GET_PATCH = 7,
|
||||
WMT_CTRL_GET_PATCH_NAME = 8,
|
||||
WMT_CTRL_HOST_BAUDRATE_SET = 9,
|
||||
WMT_CTRL_SDIO_HW = 10, /* enable/disable SDIO1/2 of combo chip */
|
||||
WMT_CTRL_SDIO_FUNC = 11, /* probe/remove STP/Wi-Fi driver in SDIO1/2 of combo chip*/
|
||||
WMT_CTRL_HWIDVER_SET = 12, // TODO: rename this and add chip id information in addition to chip version
|
||||
WMT_CTRL_HWVER_GET = 13, // TODO: [FixMe][GeorgeKuo] remove unused functions
|
||||
WMT_CTRL_STP_RST = 14,
|
||||
WMT_CTRL_GET_WMT_CONF = 15,
|
||||
WMT_CTRL_TX = 16, /* [FixMe][GeorgeKuo]: to be removed by Sean's stp integration */
|
||||
WMT_CTRL_RX = 17, /* [FixMe][GeorgeKuo]: to be removed by Sean's stp integration */
|
||||
WMT_CTRL_RX_FLUSH = 18, /* [FixMe][SeanWang]: to be removed by Sean's stp integration */
|
||||
WMT_CTRL_GPS_SYNC_SET = 19,
|
||||
WMT_CTRL_GPS_LNA_SET = 20,
|
||||
WMT_CTRL_PATCH_SEARCH = 21,
|
||||
WMT_CTRL_CRYSTAL_TRIMING_GET = 22,
|
||||
WMT_CTRL_CRYSTAL_TRIMING_PUT = 23,
|
||||
WMT_CTRL_HW_STATE_DUMP = 24,
|
||||
WMT_CTRL_GET_PATCH_NUM = 25,
|
||||
WMT_CTRL_GET_PATCH_INFO = 26,
|
||||
WMT_CTRL_MAX
|
||||
} ENUM_WMT_CTRL_T, *P_ENUM_WMT_CTRL_T;
|
||||
|
||||
typedef INT32 (*WMT_CTRL_FUNC)(P_WMT_CTRL_DATA);
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern INT32
|
||||
wmt_ctrl (
|
||||
P_WMT_CTRL_DATA pWmtCtrlData
|
||||
);
|
||||
|
||||
extern INT32
|
||||
wmt_ctrl_tx_ex (
|
||||
const UINT8 *pData,
|
||||
const UINT32 size,
|
||||
UINT32 *writtenSize,
|
||||
const MTK_WCN_BOOL bRawFlag
|
||||
);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#endif /* _WMT_CTRL_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
|
||||
#ifndef _WMT_DBG_H_
|
||||
#define _WMT_DBG_H_
|
||||
#include "osal.h"
|
||||
|
||||
#define STP_SDIO 0x04
|
||||
#define STP_UART_MAND 0x02
|
||||
#define STP_UART_FULL 0x01
|
||||
|
||||
#define CFG_WMT_DBG_SUPPORT 1 // support wmt_dbg or not
|
||||
|
||||
#if CFG_WMT_DBG_SUPPORT
|
||||
typedef struct _COEX_BUF{
|
||||
UINT8 buffer[128];
|
||||
INT32 availSize;
|
||||
}COEX_BUF, *P_COEX_BUF;
|
||||
|
||||
typedef enum _ENUM_CMD_TYPE_T {
|
||||
WMTDRV_CMD_ASSERT = 0,
|
||||
WMTDRV_CMD_EXCEPTION = 1,
|
||||
WMTDRV_CMD_COEXDBG_00 = 2,
|
||||
WMTDRV_CMD_COEXDBG_01 = 3,
|
||||
WMTDRV_CMD_COEXDBG_02 = 4,
|
||||
WMTDRV_CMD_COEXDBG_03 = 5,
|
||||
WMTDRV_CMD_COEXDBG_04 = 6,
|
||||
WMTDRV_CMD_COEXDBG_05 = 7,
|
||||
WMTDRV_CMD_COEXDBG_06 = 8,
|
||||
WMTDRV_CMD_COEXDBG_07 = 9,
|
||||
WMTDRV_CMD_COEXDBG_08 = 10,
|
||||
WMTDRV_CMD_COEXDBG_09 = 11,
|
||||
WMTDRV_CMD_COEXDBG_10 = 12,
|
||||
WMTDRV_CMD_COEXDBG_11 = 13,
|
||||
WMTDRV_CMD_COEXDBG_12 = 14,
|
||||
WMTDRV_CMD_COEXDBG_13 = 15,
|
||||
WMTDRV_CMD_COEXDBG_14 = 16,
|
||||
WMTDRV_CMD_COEXDBG_15 = 17,
|
||||
WMTDRV_CMD_MAX
|
||||
} ENUM_WMTDRV_CMD_T, *P_ENUM_WMTDRV_CMD_T;
|
||||
|
||||
|
||||
typedef INT32 (*WMT_DEV_DBG_FUNC)(INT32 par1, INT32 par2, INT32 par3);
|
||||
INT32 wmt_dev_dbg_setup(VOID);
|
||||
INT32 wmt_dev_dbg_remove(VOID);
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,134 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_FUNC_H_
|
||||
#define _WMT_FUNC_H_
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "wmt_core.h"
|
||||
#include "wmt_plat.h"
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#if 1//defined(CONFIG_MTK_COMBO_HCI_DRIVER) || defined(CONFIG_MTK_COMBO_BT)
|
||||
#define CFG_FUNC_BT_SUPPORT 1
|
||||
#else
|
||||
#define CFG_FUNC_BT_SUPPORT 0
|
||||
#endif
|
||||
|
||||
|
||||
#if 1//defined(CONFIG_MTK_COMBO_FM)
|
||||
#define CFG_FUNC_FM_SUPPORT 1
|
||||
#else
|
||||
#define CFG_FUNC_FM_SUPPORT 0
|
||||
#endif
|
||||
|
||||
#if 1//defined(CONFIG_MTK_COMBO_GPS)
|
||||
#define CFG_FUNC_GPS_SUPPORT 1
|
||||
#else
|
||||
#define CFG_FUNC_GPS_SUPPORT 0
|
||||
#endif
|
||||
|
||||
#if 1//defined(CONFIG_MTK_COMBO_WIFI)
|
||||
#define CFG_FUNC_WIFI_SUPPORT 1
|
||||
#else
|
||||
#define CFG_FUNC_WIFI_SUPPORT 0
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef INT32 (*SUBSYS_FUNC_ON)(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
typedef INT32 (*SUBSYS_FUNC_OFF)(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
|
||||
typedef struct _WMT_FUNC_OPS_{
|
||||
SUBSYS_FUNC_ON func_on;
|
||||
SUBSYS_FUNC_OFF func_off;
|
||||
}WMT_FUNC_OPS, *P_WMT_FUNC_OPS;
|
||||
|
||||
typedef struct _CMB_PIN_CTRL_REG_
|
||||
{
|
||||
UINT32 regAddr;
|
||||
UINT32 regValue;
|
||||
UINT32 regMask;
|
||||
|
||||
}CMB_PIN_CTRL_REG, *P_CMB_PIN_CTRL_REG;
|
||||
|
||||
typedef struct _CMB_PIN_CTRL_
|
||||
{
|
||||
UINT32 pinId;
|
||||
UINT32 regNum;
|
||||
P_CMB_PIN_CTRL_REG pFuncOnArray;
|
||||
P_CMB_PIN_CTRL_REG pFuncOffArray;
|
||||
|
||||
}CMB_PIN_CTRL, *P_CMB_PIN_CTRL;
|
||||
|
||||
typedef enum _ENUM_CMP_PIN_ID_{
|
||||
CMB_PIN_EEDI_ID = 0,
|
||||
CMB_PIN_EEDO_ID = 1,
|
||||
CMB_PIN_GSYNC_ID = 2,
|
||||
}ENUM_CMP_PIN_ID, *P_ENUM_CMP_PIN_ID;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* _WMT_FUNC_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_IC_H_
|
||||
#define _WMT_IC_H_
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#include "wmt_core.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define WMT_IC_NAME_MT6620 "MT6620"
|
||||
#define WMT_IC_NAME_MT6628 "MT6628"
|
||||
|
||||
|
||||
#define WMT_IC_VER_E1 "E1"
|
||||
#define WMT_IC_VER_E2 "E2"
|
||||
#define WMT_IC_VER_E3 "E3"
|
||||
#define WMT_IC_VER_E4 "E4"
|
||||
#define WMT_IC_VER_E5 "E5"
|
||||
#define WMT_IC_VER_E6 "E6"
|
||||
#define WMT_IC_VER_E7 "E7"
|
||||
|
||||
#define WMT_IC_PATCH_DUMMY_EXT "_ex"
|
||||
#define WMT_IC_PATCH_NO_EXT ""
|
||||
#define WMT_IC_PATCH_E1_EXT "_e1"
|
||||
#define WMT_IC_PATCH_E2_EXT "_e2"
|
||||
#define WMT_IC_PATCH_E3_EXT "_e3"
|
||||
#define WMT_IC_PATCH_E4_EXT "_e4"
|
||||
#define WMT_IC_PATCH_E5_EXT "_e5"
|
||||
#define WMT_IC_PATCH_E6_EXT "_e6"
|
||||
|
||||
#define WMT_IC_PATCH_TAIL "_hdr.bin"
|
||||
|
||||
#define WMT_IC_INVALID_CHIP_ID 0xFFFF
|
||||
|
||||
#define MAJORNUM(x) (x & 0x00F0)
|
||||
#define MINORNUM(x) (x & 0x000F)
|
||||
|
||||
/*******************************************************************************
|
||||
* R E G I S T E R M A P
|
||||
********************************************************************************
|
||||
*/
|
||||
/* General definition used for ALL/UNKNOWN CHIPS */
|
||||
/* Now MT6620 uses these definitions */
|
||||
#define GEN_CONFG_BASE (0x80000000UL)
|
||||
#define GEN_HVR (GEN_CONFG_BASE + 0x0UL) /* HW_VER */
|
||||
#define GEN_FVR (GEN_CONFG_BASE + 0x4UL) /* FW_VER */
|
||||
#define GEN_VER_MASK (0x0000FFFFUL) /* HW_VER and FW_VER valid bits mask */
|
||||
#define GEN_HCR (GEN_CONFG_BASE + 0x8UL) /* HW_CODE, chip id */
|
||||
#define GEN_HCR_MASK (0x0000FFFFUL) /* HW_CODE valid bits mask */
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef struct _WMT_IC_INFO_S
|
||||
{
|
||||
UINT32 u4HwVer; /* u4HwId */
|
||||
PUINT8 cChipName;
|
||||
PUINT8 cChipVersion;
|
||||
PUINT8 cPatchNameExt;
|
||||
MTK_WCN_BOOL bPsmSupport;
|
||||
MTK_WCN_BOOL bWorkWithoutPatch;
|
||||
ENUM_WMTHWVER_TYPE_T eWmtHwVer;
|
||||
} WMT_IC_INFO_S, *P_WMT_IC_INFO_S;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _WMT_IC_H_ */
|
||||
|
||||
@@ -1,327 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_LIB_H_
|
||||
#define _WMT_LIB_H_
|
||||
|
||||
#include "osal.h"
|
||||
#include "wmt_core.h"
|
||||
#include "wmt_exp.h"
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
#include "stp_wmt.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define WMT_OP_BUF_SIZE (16)
|
||||
#if 0 /* moved to wmt_exp.h */
|
||||
#define WMT_LOG_LOUD 4
|
||||
#define WMT_LOG_DBG 3
|
||||
#define WMT_LOG_INFO 2
|
||||
#define WMT_LOG_WARN 1
|
||||
#define WMT_LOG_ERR 0
|
||||
#endif
|
||||
typedef enum _ENUM_WMTRSTRET_TYPE_T{
|
||||
WMTRSTRET_SUCCESS = 0x0,
|
||||
WMTRSTRET_FAIL = 0x1,
|
||||
WMTRSTRET_ONGOING = 0x2,
|
||||
WMTRSTRET_MAX
|
||||
} ENUM_WMTRSTRET_TYPE_T, *P_ENUM_WMTRSTRET_TYPE_T;
|
||||
|
||||
/*
|
||||
3(retry times) * 180 (STP retry time out)
|
||||
+ 10 (firmware process time) +
|
||||
10 (transmit time) +
|
||||
10 (uart process -> WMT response pool) +
|
||||
230 (others)
|
||||
*/
|
||||
#define WMT_LIB_RX_TIMEOUT 2000/*800-->cover v1.2phone BT function on time (~830ms)*/
|
||||
/*
|
||||
open wifi during wifi power on procedure
|
||||
(because wlan is insert to system after mtk_hif_sdio module,
|
||||
so wifi card is not registered to hif module
|
||||
when mtk_wcn_wmt_func_on is called by wifi through rfkill)
|
||||
*/
|
||||
#define MAX_WIFI_ON_TIME 5500
|
||||
|
||||
#define WMT_PWRON_RTY_DFT 2
|
||||
#define MAX_RETRY_TIME_DUE_TO_RX_TIMEOUT WMT_PWRON_RTY_DFT * WMT_LIB_RX_TIMEOUT
|
||||
#define MAX_EACH_FUNC_ON_WHEN_CHIP_POWER_ON_ALREADY WMT_LIB_RX_TIMEOUT /*each WMT command*/
|
||||
#define MAX_FUNC_ON_TIME (MAX_WIFI_ON_TIME + MAX_RETRY_TIME_DUE_TO_RX_TIMEOUT + MAX_EACH_FUNC_ON_WHEN_CHIP_POWER_ON_ALREADY * 3)
|
||||
|
||||
#define MAX_EACH_FUNC_OFF WMT_LIB_RX_TIMEOUT + 1000 /*1000->WMT_LIB_RX_TIMEOUT + 1000, logical judgement*/
|
||||
#define MAX_FUNC_OFF_TIME MAX_EACH_FUNC_OFF * 4
|
||||
|
||||
#define MAX_EACH_WMT_CMD WMT_LIB_RX_TIMEOUT + 1000 /*1000->WMT_LIB_RX_TIMEOUT + 1000, logical judgement*/
|
||||
|
||||
#define MAX_GPIO_CTRL_TIME (2000) /* [FixMe][GeorgeKuo] a temp value */
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if 0 /* moved to wmt_exp.h */
|
||||
/* FIXME: apply KERN_* definition? */
|
||||
extern UINT32 gWmtDbgLvl ;
|
||||
#ifndef DFT_TAG
|
||||
#define DFT_TAG "[WMT-DFT]"
|
||||
#endif
|
||||
|
||||
#define WMT_LOUD_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_LOUD) { osal_dbg_print(DFT_TAG "[L]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_INFO_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_INFO) { osal_info_print(DFT_TAG "[I]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_WARN_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_WARN) { osal_warn_print(DFT_TAG "[W]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_ERR_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_ERR) { osal_err_print(DFT_TAG "[E]%s(%d):" fmt, __FUNCTION__ , __LINE__, ##arg);}
|
||||
#define WMT_DBG_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_DBG) { osal_dbg_print(DFT_TAG "[D]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_TRC_FUNC(f) if (gWmtDbgLvl >= WMT_LOG_DBG) { osal_dbg_print(DFT_TAG "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* AIF FLAG definition */
|
||||
/* bit(0): share pin or not */
|
||||
#define WMT_LIB_AIF_FLAG_MASK (0x1UL)
|
||||
#define WMT_LIB_AIF_FLAG_SHARE (0x1UL << 0)
|
||||
#define WMT_LIB_AIF_FLAG_SEPARATE (0x0UL << 0)
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* bit field offset definition */
|
||||
typedef enum {
|
||||
WMT_STAT_PWR = 0, /* is powered on */
|
||||
WMT_STAT_STP_REG = 1, /* is STP driver registered: */
|
||||
WMT_STAT_STP_OPEN = 2, /* is STP opened: default FALSE*/
|
||||
WMT_STAT_STP_EN = 3, /* is STP enabled: default FALSE*/
|
||||
WMT_STAT_STP_RDY = 4, /* is STP ready for client: default FALSE*/
|
||||
WMT_STAT_RX = 5, /* is rx data available */
|
||||
WMT_STAT_CMD = 6, /* is cmd string to be read */
|
||||
WMT_STAT_SDIO1_ON = 7, /* is SDIO1 on */
|
||||
WMT_STAT_SDIO2_ON = 8, /* is SDIO2 on */
|
||||
WMT_STAT_SDIO_WIFI_ON = 9, /* is Wi-Fi SDIO function on */
|
||||
WMT_STAT_SDIO_STP_ON = 10, /* is STP SDIO function on */
|
||||
WMT_STAT_RST_ON = 11,
|
||||
WMT_STAT_MAX
|
||||
} WMT_STAT;
|
||||
|
||||
typedef enum _ENUM_WMTRSTSRC_TYPE_T{
|
||||
WMTRSTSRC_RESET_BT = 0x0,
|
||||
WMTRSTSRC_RESET_FM = 0x1,
|
||||
WMTRSTSRC_RESET_GPS = 0x2,
|
||||
WMTRSTSRC_RESET_WIFI = 0x3,
|
||||
WMTRSTSRC_RESET_STP = 0x4,
|
||||
WMTRSTSRC_RESET_TEST = 0x5,
|
||||
WMTRSTSRC_RESET_MAX
|
||||
} ENUM_WMTRSTSRC_TYPE_T, *P_ENUM_WMTRSTSRC_TYPE_T;
|
||||
|
||||
|
||||
typedef struct {
|
||||
PF_WMT_CB fDrvRst[4];
|
||||
} WMT_FDRV_CB, *P_WMT_FDRV_CB;
|
||||
|
||||
|
||||
typedef struct {
|
||||
UINT32 dowloadSeq;
|
||||
UCHAR addRess[4];
|
||||
UCHAR patchName[256];
|
||||
}WMT_PATCH_INFO,*P_WMT_PATCH_INFO;
|
||||
|
||||
|
||||
/* OS independent wrapper for WMT_OP */
|
||||
typedef struct _DEV_WMT_ {
|
||||
|
||||
OSAL_SLEEPABLE_LOCK psm_lock;
|
||||
/* WMTd thread information */
|
||||
// struct task_struct *pWmtd; /* main thread (wmtd) handle */
|
||||
OSAL_THREAD thread;
|
||||
// wait_queue_head_t rWmtdWq; /*WMTd command wait queue */
|
||||
OSAL_EVENT rWmtdWq; //rename
|
||||
//ULONG state; /* bit field of WMT_STAT */
|
||||
OSAL_BIT_OP_VAR state;
|
||||
|
||||
/* STP context information */
|
||||
// wait_queue_head_t rWmtRxWq; /* STP Rx wait queue */
|
||||
OSAL_EVENT rWmtRxWq; //rename
|
||||
// WMT_STP_FUNC rStpFunc; /* STP functions */
|
||||
WMT_FDRV_CB rFdrvCb;
|
||||
|
||||
/* WMT Configurations */
|
||||
WMT_HIF_CONF rWmtHifConf;
|
||||
WMT_GEN_CONF rWmtGenConf;
|
||||
|
||||
/* Patch information */
|
||||
UCHAR cPatchName[NAME_MAX + 1];
|
||||
UCHAR cFullPatchName[NAME_MAX + 1];
|
||||
UINT32 patchNum;
|
||||
const osal_firmware *pPatch;
|
||||
|
||||
UCHAR cWmtcfgName[NAME_MAX + 1];
|
||||
const osal_firmware *pWmtCfg;
|
||||
|
||||
const osal_firmware *pNvram;
|
||||
|
||||
/* Current used UART port description*/
|
||||
CHAR cUartName[NAME_MAX + 1];
|
||||
|
||||
OSAL_OP_Q rFreeOpQ; /* free op queue */
|
||||
OSAL_OP_Q rActiveOpQ; /* active op queue */
|
||||
OSAL_OP arQue[WMT_OP_BUF_SIZE]; /* real op instances */
|
||||
P_OSAL_OP pCurOP; /* current op*/
|
||||
|
||||
/* cmd str buffer */
|
||||
UCHAR cCmd[NAME_MAX + 1];
|
||||
INT32 cmdResult;
|
||||
// struct completion cmd_comp;
|
||||
// wait_queue_head_t cmd_wq; /* read command queues */
|
||||
OSAL_SIGNAL cmdResp;
|
||||
OSAL_EVENT cmdReq;
|
||||
|
||||
/* WMT loopback Thread Information */
|
||||
// WMT_CMB_VER combo_ver;
|
||||
//P_WMT_CMB_CHIP_INFO_S pChipInfo;
|
||||
UINT32 chip_id;
|
||||
UINT32 hw_ver;
|
||||
UINT32 fw_ver;
|
||||
// TODO: [FixMe][GeorgeKuo] remove this translated version code in the
|
||||
// future. Just return the above 3 info to querist
|
||||
ENUM_WMTHWVER_TYPE_T eWmtHwVer;
|
||||
|
||||
P_WMT_PATCH_INFO pWmtPatchInfo;
|
||||
}DEV_WMT, *P_DEV_WMT;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
extern INT32 wmt_lib_init(VOID);
|
||||
extern INT32 wmt_lib_deinit(VOID);
|
||||
extern INT32 wmt_lib_tx (UINT8 *data, UINT32 size, UINT32 *writtenSize);
|
||||
extern INT32 wmt_lib_tx_raw (UINT8 *data, UINT32 size, UINT32 *writtenSize);
|
||||
extern INT32 wmt_lib_rx(UINT8 *buff, UINT32 buffLen, UINT32 *readSize);
|
||||
extern VOID
|
||||
wmt_lib_flush_rx(VOID);
|
||||
|
||||
#if CFG_WMT_PS_SUPPORT
|
||||
extern INT32
|
||||
wmt_lib_ps_set_idle_time(UINT32 psIdleTime);
|
||||
extern INT32
|
||||
wmt_lib_ps_init(VOID);
|
||||
extern INT32
|
||||
wmt_lib_ps_deinit(VOID);
|
||||
extern INT32
|
||||
wmt_lib_ps_enable(VOID);
|
||||
extern INT32
|
||||
wmt_lib_ps_ctrl(UINT32 state);
|
||||
|
||||
extern INT32
|
||||
wmt_lib_ps_disable(VOID);
|
||||
extern VOID
|
||||
wmt_lib_ps_irq_cb(VOID);
|
||||
#endif
|
||||
extern VOID
|
||||
wmt_lib_ps_set_sdio_psop (
|
||||
PF_WMT_SDIO_PSOP own_cb
|
||||
);
|
||||
|
||||
/* LXOP functions: */
|
||||
extern P_OSAL_OP wmt_lib_get_free_op (VOID);
|
||||
extern INT32 wmt_lib_put_op_to_free_queue(P_OSAL_OP pOp);
|
||||
extern MTK_WCN_BOOL wmt_lib_put_act_op (P_OSAL_OP pOp);
|
||||
|
||||
//extern ENUM_WMTHWVER_TYPE_T wmt_lib_get_hwver (VOID);
|
||||
extern UINT32 wmt_lib_get_icinfo (ENUM_WMT_CHIPINFO_TYPE_T type);
|
||||
|
||||
extern MTK_WCN_BOOL wmt_lib_is_therm_ctrl_support (VOID);
|
||||
extern MTK_WCN_BOOL wmt_lib_is_dsns_ctrl_support (VOID);
|
||||
extern INT32 wmt_lib_trigger_cmd_signal (INT32 result);
|
||||
extern UCHAR *wmt_lib_get_cmd(VOID);
|
||||
extern P_OSAL_EVENT wmt_lib_get_cmd_event(VOID);
|
||||
extern INT32 wmt_lib_set_patch_name(UCHAR *cPatchName);
|
||||
extern INT32 wmt_lib_set_uart_name(CHAR *cUartName);
|
||||
extern INT32 wmt_lib_set_hif(ULONG hifconf);
|
||||
extern P_WMT_HIF_CONF wmt_lib_get_hif(VOID);
|
||||
extern MTK_WCN_BOOL wmt_lib_get_cmd_status(VOID);
|
||||
|
||||
/* GeorgeKuo: replace set_chip_gpio() with more specific ones */
|
||||
#if 0/* moved to wmt_exp.h */
|
||||
extern INT32 wmt_lib_set_aif (CMB_STUB_AIF_X aif, MTK_WCN_BOOL share); /* set AUDIO interface options */
|
||||
#endif
|
||||
extern INT32 wmt_lib_host_awake_get(VOID);
|
||||
extern INT32 wmt_lib_host_awake_put(VOID);
|
||||
extern UINT32 wmt_lib_dbg_level_set(UINT32 level);
|
||||
|
||||
extern INT32 wmt_lib_msgcb_reg (
|
||||
ENUM_WMTDRV_TYPE_T eType,
|
||||
PF_WMT_CB pCb
|
||||
);
|
||||
|
||||
extern INT32 wmt_lib_msgcb_unreg (
|
||||
ENUM_WMTDRV_TYPE_T eType
|
||||
);
|
||||
ENUM_WMTRSTRET_TYPE_T wmt_lib_cmb_rst( ENUM_WMTRSTSRC_TYPE_T src);
|
||||
MTK_WCN_BOOL wmt_lib_sw_rst(INT32 baudRst);
|
||||
MTK_WCN_BOOL wmt_lib_hw_rst(VOID);
|
||||
INT32 wmt_lib_reg_rw (
|
||||
UINT32 isWrite,
|
||||
UINT32 offset,
|
||||
PUINT32 pvalue,
|
||||
UINT32 mask
|
||||
);
|
||||
INT32 wmt_lib_efuse_rw (
|
||||
UINT32 isWrite,
|
||||
UINT32 offset,
|
||||
PUINT32 pvalue,
|
||||
UINT32 mask
|
||||
);
|
||||
INT32 wmt_lib_sdio_ctrl(UINT32 on);
|
||||
|
||||
extern INT32 DISABLE_PSM_MONITOR(void);
|
||||
extern VOID ENABLE_PSM_MONITOR(void);
|
||||
extern INT32 wmt_lib_notify_stp_sleep(void);
|
||||
extern void wmt_lib_psm_lock_release(void);
|
||||
extern INT32 wmt_lib_psm_lock_aquire(void);
|
||||
extern INT32 wmt_lib_set_stp_wmt_last_close(UINT32 value);
|
||||
|
||||
extern VOID wmt_lib_set_patch_num(ULONG num);
|
||||
extern VOID wmt_lib_set_patch_info(P_WMT_PATCH_INFO pPatchinfo);
|
||||
|
||||
extern INT32 wmt_lib_set_current_op(P_DEV_WMT pWmtDev, P_OSAL_OP pOp);
|
||||
extern P_OSAL_OP wmt_lib_get_current_op(P_DEV_WMT pWmtDev);
|
||||
|
||||
extern INT32 wmt_lib_merge_if_flag_ctrl(UINT32 enable);
|
||||
extern INT32 wmt_lib_merge_if_flag_get(UINT32 enable);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _WMT_LIB_H_ */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,259 +0,0 @@
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if 0 //to do---- need check why need this header file
|
||||
#include <linux/types.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/audit.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/delay.h> /* udelay() */
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
#endif
|
||||
#include "stp_core.h"
|
||||
#include "stp_exp.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
static MTK_WCN_STP_IF_TX stp_uart_if_tx = NULL;
|
||||
static MTK_WCN_STP_IF_TX stp_sdio_if_tx = NULL;
|
||||
static ENUM_STP_TX_IF_TYPE g_stp_if_type = STP_MAX_IF_TX;
|
||||
static MTK_WCN_STP_IF_RX stp_if_rx = NULL;
|
||||
static MTK_WCN_STP_EVENT_CB event_callback_tbl[MTKSTP_MAX_TASK_NUM] = {0x0};
|
||||
static MTK_WCN_STP_EVENT_CB tx_event_callback_tbl[MTKSTP_MAX_TASK_NUM] = {0x0};
|
||||
|
||||
/******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32 mtk_wcn_sys_if_rx(UINT8 *data, INT32 size)
|
||||
{
|
||||
if(stp_if_rx == 0x0)
|
||||
{
|
||||
return (-1);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*stp_if_rx)(data, size);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 mtk_wcn_sys_if_tx (
|
||||
const UINT8 *data,
|
||||
const UINT32 size,
|
||||
UINT32 *written_size
|
||||
)
|
||||
{
|
||||
|
||||
if (STP_UART_IF_TX == g_stp_if_type) {
|
||||
return stp_uart_if_tx != NULL ? (*stp_uart_if_tx)(data, size, written_size) : -1;
|
||||
}
|
||||
else if (STP_SDIO_IF_TX == g_stp_if_type) {
|
||||
return stp_sdio_if_tx != NULL ? (*stp_sdio_if_tx)(data, size, written_size) : -1;
|
||||
}
|
||||
else {
|
||||
/*if (g_stp_if_type >= STP_MAX_IF_TX) */ /* George: remove ALWAYS TRUE condition */
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
|
||||
static INT32 mtk_wcn_sys_event_set(UINT8 function_type)
|
||||
{
|
||||
if((function_type < MTKSTP_MAX_TASK_NUM) && (event_callback_tbl[function_type] != 0x0))
|
||||
{
|
||||
(*event_callback_tbl[function_type])();
|
||||
}
|
||||
else {
|
||||
/* FIXME: error handling */
|
||||
osal_dbg_print("[%s] STP set event fail. It seems the function is not active.\n", __func__);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 mtk_wcn_sys_event_tx_resume(UINT8 winspace)
|
||||
{
|
||||
int type = 0;
|
||||
|
||||
for(type = 0 ; type < MTKSTP_MAX_TASK_NUM ; type ++ )
|
||||
{
|
||||
if(tx_event_callback_tbl[type])
|
||||
{
|
||||
tx_event_callback_tbl[type]();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 mtk_wcn_sys_check_function_status(UINT8 type, UINT8 op){
|
||||
|
||||
/*op == FUNCTION_ACTIVE, to check if funciton[type] is active ?*/
|
||||
if(!(type >= 0 && type < MTKSTP_MAX_TASK_NUM))
|
||||
{
|
||||
return STATUS_FUNCTION_INVALID;
|
||||
}
|
||||
|
||||
if(op == OP_FUNCTION_ACTIVE)
|
||||
{
|
||||
if(event_callback_tbl[type] != 0x0)
|
||||
{
|
||||
return STATUS_FUNCTION_ACTIVE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return STATUS_FUNCTION_INACTIVE;
|
||||
}
|
||||
}
|
||||
/*you can define more operation here ..., to queury function's status/information*/
|
||||
|
||||
return STATUS_OP_INVALID;
|
||||
}
|
||||
|
||||
INT32 mtk_wcn_stp_register_if_rx(MTK_WCN_STP_IF_RX func)
|
||||
{
|
||||
stp_if_rx = func;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
VOID mtk_wcn_stp_set_if_tx_type (
|
||||
ENUM_STP_TX_IF_TYPE stp_if_type
|
||||
)
|
||||
{
|
||||
g_stp_if_type = stp_if_type;
|
||||
osal_dbg_print("[%s] set STP_IF_TX to %s.\n",
|
||||
__FUNCTION__,
|
||||
(STP_UART_IF_TX == stp_if_type)? "UART" : ((STP_SDIO_IF_TX == stp_if_type) ? "SDIO" : "NULL"));
|
||||
}
|
||||
|
||||
INT32 mtk_wcn_stp_register_if_tx (
|
||||
ENUM_STP_TX_IF_TYPE stp_if,
|
||||
MTK_WCN_STP_IF_TX func
|
||||
)
|
||||
{
|
||||
if (STP_UART_IF_TX == stp_if)
|
||||
{
|
||||
stp_uart_if_tx = func;
|
||||
}
|
||||
else if (STP_SDIO_IF_TX == stp_if)
|
||||
{
|
||||
stp_sdio_if_tx = func;
|
||||
}
|
||||
else
|
||||
{
|
||||
osal_dbg_print("[%s] STP_IF_TX(%d) out of boundary.\n", __FUNCTION__, stp_if);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 mtk_wcn_stp_register_event_cb(INT32 type, MTK_WCN_STP_EVENT_CB func)
|
||||
{
|
||||
if (type < MTKSTP_MAX_TASK_NUM)
|
||||
{
|
||||
event_callback_tbl[type] = func;
|
||||
|
||||
/*clear rx queue*/
|
||||
osal_dbg_print("Flush type = %d Rx Queue\n", type);
|
||||
mtk_wcn_stp_flush_rx_queue(type);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 mtk_wcn_stp_register_tx_event_cb(INT32 type, MTK_WCN_STP_EVENT_CB func)
|
||||
{
|
||||
if(type < MTKSTP_MAX_TASK_NUM)
|
||||
{
|
||||
tx_event_callback_tbl[type] = func;
|
||||
}
|
||||
else
|
||||
{
|
||||
osal_bug_on(0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 stp_drv_init(VOID)
|
||||
{
|
||||
mtkstp_callback cb =
|
||||
{
|
||||
.cb_if_tx = mtk_wcn_sys_if_tx,
|
||||
.cb_event_set = mtk_wcn_sys_event_set,
|
||||
.cb_event_tx_resume = mtk_wcn_sys_event_tx_resume,
|
||||
.cb_check_funciton_status = mtk_wcn_sys_check_function_status
|
||||
};
|
||||
|
||||
return mtk_wcn_stp_init(&cb);
|
||||
}
|
||||
|
||||
VOID stp_drv_exit(VOID)
|
||||
{
|
||||
mtk_wcn_stp_deinit();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_register_if_tx);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_register_if_rx);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_register_event_cb);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_register_tx_event_cb);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_parser_data);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_send_data);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_send_data_raw);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_receive_data);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_is_rxqueue_empty);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_set_bluez);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_is_ready);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_dbg_log_ctrl);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,525 +0,0 @@
|
||||
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-CONF]"
|
||||
|
||||
|
||||
#include "osal_typedef.h"
|
||||
//#include "osal.h"
|
||||
#include "wmt_lib.h"
|
||||
#include "wmt_dev.h"
|
||||
#include "wmt_conf.h"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
struct parse_data {
|
||||
PCHAR name;
|
||||
INT32 (*parser)(P_DEV_WMT pWmtDev, const struct parse_data *data,const PCHAR value);
|
||||
PCHAR (*writer)(P_DEV_WMT pWmtDev, const struct parse_data *data);
|
||||
/*PCHAR param1, *param2, *param3;*/
|
||||
// TODO:[FixMe][George] CLARIFY WHAT SHOULD BE USED HERE!!!
|
||||
PCHAR param1;
|
||||
PCHAR param2;
|
||||
PCHAR param3;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern DEV_WMT gDevWmt;
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
*******************************************************************************
|
||||
*/
|
||||
static INT32 wmt_conf_parse_char(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data,
|
||||
const PCHAR pos
|
||||
);
|
||||
|
||||
static PCHAR wmt_conf_write_char(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data
|
||||
);
|
||||
|
||||
static INT32 wmt_conf_parse_short(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data,
|
||||
const PCHAR pos
|
||||
);
|
||||
|
||||
static PCHAR wmt_conf_write_short(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data
|
||||
);
|
||||
|
||||
static INT32 wmt_conf_parse_int(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data,
|
||||
const PCHAR pos
|
||||
);
|
||||
|
||||
static PCHAR wmt_conf_write_int(
|
||||
P_DEV_WMT pWmtDev,
|
||||
const struct parse_data *data
|
||||
);
|
||||
|
||||
static INT32 wmt_conf_parse_pair (
|
||||
P_DEV_WMT pWmtDev,
|
||||
const PCHAR pKey,
|
||||
const PCHAR pVal
|
||||
);
|
||||
|
||||
static INT32 wmt_conf_parse (
|
||||
P_DEV_WMT pWmtDev,
|
||||
const PCHAR pInBuf,
|
||||
UINT32 size
|
||||
);
|
||||
|
||||
#define OFFSET(v) ((void *) &((P_DEV_WMT) 0)->v)
|
||||
|
||||
#define _CHAR(f) #f, wmt_conf_parse_char, wmt_conf_write_char, OFFSET(rWmtGenConf.f)
|
||||
#define CHAR(f) _CHAR(f), NULL, NULL
|
||||
|
||||
#define _SHORT(f) #f, wmt_conf_parse_short, wmt_conf_write_short, OFFSET(rWmtGenConf.f)
|
||||
#define SHORT(f) _SHORT(f), NULL, NULL
|
||||
|
||||
#define _INT(f) #f, wmt_conf_parse_int, wmt_conf_write_int, OFFSET(rWmtGenConf.f)
|
||||
#define INT(f) _INT(f), NULL, NULL
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static const struct parse_data wmtcfg_fields[] = {
|
||||
{ CHAR(coex_wmt_ant_mode) },
|
||||
{ CHAR(coex_wmt_wifi_time_ctl) },
|
||||
{ CHAR(coex_wmt_ext_pta_dev_on) },
|
||||
|
||||
{ CHAR(coex_bt_rssi_upper_limit) },
|
||||
{ CHAR(coex_bt_rssi_mid_limit) },
|
||||
{ CHAR(coex_bt_rssi_lower_limit) },
|
||||
{ CHAR(coex_bt_pwr_high) },
|
||||
{ CHAR(coex_bt_pwr_mid) },
|
||||
{ CHAR(coex_bt_pwr_low) },
|
||||
|
||||
{ CHAR(coex_wifi_rssi_upper_limit) },
|
||||
{ CHAR(coex_wifi_rssi_mid_limit) },
|
||||
{ CHAR(coex_wifi_rssi_lower_limit) },
|
||||
{ CHAR(coex_wifi_pwr_high) },
|
||||
{ CHAR(coex_wifi_pwr_mid) },
|
||||
{ CHAR(coex_wifi_pwr_low) },
|
||||
|
||||
{ CHAR(coex_ext_pta_hi_tx_tag) },
|
||||
{ CHAR(coex_ext_pta_hi_rx_tag) },
|
||||
{ CHAR(coex_ext_pta_lo_tx_tag) },
|
||||
{ CHAR(coex_ext_pta_lo_rx_tag) },
|
||||
{ SHORT(coex_ext_pta_sample_t1) },
|
||||
{ SHORT(coex_ext_pta_sample_t2) },
|
||||
{ CHAR(coex_ext_pta_wifi_bt_con_trx) },
|
||||
|
||||
{ INT(coex_misc_ext_pta_on) },
|
||||
{ INT(coex_misc_ext_feature_set) },
|
||||
|
||||
{ CHAR(wmt_gps_lna_pin) },
|
||||
{ CHAR(wmt_gps_lna_enable) },
|
||||
|
||||
{ CHAR(pwr_on_rtc_slot) },
|
||||
{ CHAR(pwr_on_ldo_slot) },
|
||||
{ CHAR(pwr_on_rst_slot) },
|
||||
{ CHAR(pwr_on_off_slot) },
|
||||
{ CHAR(pwr_on_on_slot) },
|
||||
{ CHAR(co_clock_flag) },
|
||||
|
||||
{ INT(sdio_driving_cfg) },
|
||||
|
||||
};
|
||||
|
||||
#define NUM_WMTCFG_FIELDS (osal_sizeof(wmtcfg_fields) / osal_sizeof(wmtcfg_fields[0]))
|
||||
|
||||
static INT32 wmt_conf_parse_char(P_DEV_WMT pWmtDev, const struct parse_data *data,
|
||||
const PCHAR pos)
|
||||
{
|
||||
PUCHAR dst;
|
||||
dst = (PCHAR ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
if((osal_strlen(pos) > 2) &&
|
||||
((*pos)=='0') && (*(pos+1)=='x') ){
|
||||
*dst = osal_strtol(pos+2, NULL, 16);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=0x%x\n", data->name, *dst);
|
||||
} else {
|
||||
*dst = osal_strtol(pos, NULL, 10);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=%d\n", data->name, *dst);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PCHAR wmt_conf_write_char(P_DEV_WMT pWmtDev, const struct parse_data *data)
|
||||
{
|
||||
PCHAR src;
|
||||
INT32 res;
|
||||
PCHAR value;
|
||||
|
||||
src = (PCHAR ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
value = osal_malloc(20);
|
||||
if (value == NULL)
|
||||
return NULL;
|
||||
res = osal_snprintf(value, 20, "0x%x", *src);
|
||||
if (res < 0 || res >= 20) {
|
||||
osal_free(value);
|
||||
return NULL;
|
||||
}
|
||||
value[20 - 1] = '\0';
|
||||
return value;
|
||||
}
|
||||
|
||||
static INT32 wmt_conf_parse_short(P_DEV_WMT pWmtDev, const struct parse_data *data,
|
||||
const PCHAR pos)
|
||||
{
|
||||
PUINT16 dst;
|
||||
dst = (PINT16 ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
//WMT_INFO_FUNC(">strlen(pos)=%d\n", strlen(pos));
|
||||
|
||||
if((osal_strlen(pos) > 2) &&
|
||||
((*pos)=='0') && (*(pos+1)=='x') ){
|
||||
*dst = osal_strtol(pos+2, NULL, 16);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=0x%x\n", data->name, *dst);
|
||||
} else {
|
||||
*dst = osal_strtol(pos, NULL, 10);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=%d\n", data->name, *dst);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PCHAR wmt_conf_write_short(P_DEV_WMT pWmtDev, const struct parse_data *data)
|
||||
{
|
||||
PINT16 src;
|
||||
INT32 res;
|
||||
PCHAR value;
|
||||
|
||||
// TODO: [FixMe][George] FIX COMPILE WARNING HERE!
|
||||
src = (PINT16 ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
value = osal_malloc(20);
|
||||
if (value == NULL)
|
||||
return NULL;
|
||||
res = osal_snprintf(value, 20, "0x%x", *src);
|
||||
if (res < 0 || res >= 20) {
|
||||
osal_free(value);
|
||||
return NULL;
|
||||
}
|
||||
value[20 - 1] = '\0';
|
||||
return value;
|
||||
}
|
||||
|
||||
static INT32 wmt_conf_parse_int(P_DEV_WMT pWmtDev, const struct parse_data *data,
|
||||
const PCHAR pos)
|
||||
{
|
||||
PUINT32 dst;
|
||||
dst = (PINT32 ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
//WMT_INFO_FUNC(">strlen(pos)=%d\n", strlen(pos));
|
||||
|
||||
if((osal_strlen(pos) > 2) &&
|
||||
((*pos)=='0') && (*(pos+1)=='x') ){
|
||||
*dst = osal_strtol(pos+2, NULL, 16);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=0x%x\n", data->name, *dst);
|
||||
} else {
|
||||
*dst = osal_strtol(pos, NULL, 10);
|
||||
WMT_DBG_FUNC("wmtcfg==> %s=%d\n", data->name, *dst);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PCHAR wmt_conf_write_int(P_DEV_WMT pWmtDev, const struct parse_data *data)
|
||||
{
|
||||
PINT32 src;
|
||||
INT32 res;
|
||||
PCHAR value;
|
||||
|
||||
src = (PUINT32 ) (((PUINT8) pWmtDev) + (LONG) data->param1);
|
||||
|
||||
value = osal_malloc(20);
|
||||
if (value == NULL)
|
||||
return NULL;
|
||||
res = osal_snprintf(value, 20, "0x%x", *src);
|
||||
if (res < 0 || res >= 20) {
|
||||
osal_free(value);
|
||||
return NULL;
|
||||
}
|
||||
value[20 - 1] = '\0';
|
||||
return value;
|
||||
}
|
||||
|
||||
static INT32 wmt_conf_parse_pair (
|
||||
P_DEV_WMT pWmtDev,
|
||||
const PCHAR pKey,
|
||||
const PCHAR pVal
|
||||
)
|
||||
{
|
||||
INT32 i = 0;
|
||||
INT32 ret = 0;
|
||||
|
||||
//WMT_INFO_FUNC( DBG_NAME "cfg(%s) val(%s) \n", pKey, pVal);
|
||||
|
||||
for (i = 0; i < NUM_WMTCFG_FIELDS; i++) {
|
||||
const struct parse_data *field = &wmtcfg_fields[i];
|
||||
if (osal_strcmp(pKey, field->name) != 0)
|
||||
continue;
|
||||
if (field->parser(pWmtDev, field, pVal)) {
|
||||
WMT_ERR_FUNC("failed to parse %s '%s'.\n", pKey, pVal);
|
||||
ret = -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (i == NUM_WMTCFG_FIELDS) {
|
||||
WMT_ERR_FUNC("unknown field '%s'.\n", pKey);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static INT32 wmt_conf_parse (
|
||||
P_DEV_WMT pWmtDev,
|
||||
const PCHAR pInBuf,
|
||||
UINT32 size
|
||||
)
|
||||
{
|
||||
CHAR *pch;
|
||||
CHAR * pBuf;
|
||||
CHAR * pLine;
|
||||
CHAR * pKey;
|
||||
CHAR * pVal;
|
||||
CHAR * pPos;
|
||||
INT32 ret = 0;
|
||||
INT32 i = 0;
|
||||
PCHAR pa = NULL;
|
||||
|
||||
pBuf = osal_malloc(size);
|
||||
if (!pBuf) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
osal_memcpy(pBuf, pInBuf, size);
|
||||
pBuf[size] = '\0';
|
||||
|
||||
pch = pBuf;
|
||||
/* pch is to be updated by strsep(). Keep pBuf unchanged!! */
|
||||
|
||||
#if 0
|
||||
{
|
||||
PCHAR buf_ptr = pBuf;
|
||||
INT32 k=0;
|
||||
WMT_INFO_FUNC("%s len=%d", "wmcfg.content:", size);
|
||||
for(k=0; k < size ; k++){
|
||||
//if(k%16 == 0) WMT_INFO_FUNC("\n");
|
||||
WMT_INFO_FUNC("%c", buf_ptr[k]);
|
||||
}
|
||||
WMT_INFO_FUNC("--end\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
while ((pLine = osal_strsep(&pch, "\r\n")) != NULL) {
|
||||
/* pch is updated to the end of pLine by strsep() and updated to '\0' */
|
||||
/*WMT_INFO_FUNC("strsep offset(%d), char(%d, '%c' ) \n", pLine-pBuf, *pLine, *pLine);*/
|
||||
/* parse each line */
|
||||
|
||||
// WMT_INFO_FUNC("==> Line = (%s)\n", pLine);
|
||||
|
||||
if (!*pLine) {
|
||||
continue;
|
||||
}
|
||||
|
||||
pVal = osal_strchr(pLine, '=');
|
||||
if (!pVal) {
|
||||
WMT_WARN_FUNC("mal-format cfg string(%s)\n", pLine);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* |<-pLine->|'='<-pVal->|'\n' ('\0')| */
|
||||
*pVal = '\0'; /* replace '=' with '\0' to get key */
|
||||
/* |<-pKey->|'\0'|<-pVal->|'\n' ('\0')| */
|
||||
pKey = pLine;
|
||||
|
||||
if((pVal - pBuf) < size){
|
||||
pVal++;
|
||||
}
|
||||
|
||||
/*key handling*/
|
||||
pPos = pKey;
|
||||
/*skip space characeter*/
|
||||
while(((*pPos)==' ') || ((*pPos)=='\t') || ((*pPos)=='\n')){
|
||||
if((pPos - pBuf) >= size)
|
||||
break;
|
||||
pPos++;
|
||||
}
|
||||
/*key head*/
|
||||
pKey=pPos;
|
||||
while(((*pPos)!=' ') && ((*pPos)!='\t') && ((*pPos)!='\0') && ((*pPos)!='\n')){
|
||||
if((pPos - pBuf) >= size)
|
||||
break;
|
||||
pPos++;
|
||||
}
|
||||
/*key tail*/
|
||||
(*pPos)='\0';
|
||||
|
||||
/*value handling*/
|
||||
pPos = pVal;
|
||||
/*skip space characeter*/
|
||||
while(((*pPos)==' ') || ((*pPos)=='\t') || ((*pPos)=='\n')){
|
||||
if((pPos - pBuf) >= size)
|
||||
break;
|
||||
pPos++;
|
||||
}
|
||||
/*value head*/
|
||||
pVal=pPos;
|
||||
while(((*pPos)!=' ') && ((*pPos)!='\t') && ((*pPos)!='\0') && ((*pPos)!='\n')){
|
||||
if((pPos - pBuf) >= size)
|
||||
break;
|
||||
pPos++;
|
||||
}
|
||||
/*value tail*/
|
||||
(*pPos)='\0';
|
||||
|
||||
//WMT_DBG_FUNC("parse (key: #%s#, value: #%s#)\n", pKey, pVal);
|
||||
ret = wmt_conf_parse_pair(pWmtDev, pKey, pVal);
|
||||
WMT_WARN_FUNC("parse (%s, %s, %d)\n", pKey, pVal, ret);
|
||||
if (ret) {
|
||||
WMT_WARN_FUNC("parse fail (%s, %s, %d)\n", pKey, pVal, ret);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_WMTCFG_FIELDS; i++) {
|
||||
const struct parse_data *field = &wmtcfg_fields[i];
|
||||
pa = field->writer(pWmtDev, field);
|
||||
if(pa)
|
||||
{
|
||||
WMT_INFO_FUNC("#%d(%s)=>%s\n", i, field->name, pa);
|
||||
osal_free(pa);
|
||||
} else {
|
||||
WMT_ERR_FUNC("failed to parse '%s'.\n", field->name);
|
||||
}
|
||||
}
|
||||
osal_free(pBuf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_conf_set_cfg_file(const CHAR *name)
|
||||
{
|
||||
if (NULL == name)
|
||||
{
|
||||
WMT_ERR_FUNC("name is NULL\n");
|
||||
return -1;
|
||||
}
|
||||
if (osal_strlen(name) >= osal_sizeof(gDevWmt.cWmtcfgName))
|
||||
{
|
||||
WMT_ERR_FUNC("name is too long, length=%d, expect to < %d \n", osal_strlen(name), osal_sizeof(gDevWmt.cWmtcfgName));
|
||||
return -2;
|
||||
}
|
||||
osal_memset(&gDevWmt.cWmtcfgName[0], 0, osal_sizeof(gDevWmt.cWmtcfgName));
|
||||
osal_strcpy(&(gDevWmt.cWmtcfgName[0]), name);
|
||||
WMT_ERR_FUNC("WMT config file is set to (%s)\n", &(gDevWmt.cWmtcfgName[0]));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_conf_read_file(VOID)
|
||||
{
|
||||
INT32 ret = -1;
|
||||
|
||||
osal_memset(&gDevWmt.rWmtGenConf, 0, osal_sizeof(gDevWmt.rWmtGenConf));
|
||||
osal_memset(&gDevWmt.pWmtCfg, 0, osal_sizeof(gDevWmt.pWmtCfg));
|
||||
|
||||
#if 0
|
||||
osal_memset(&gDevWmt.cWmtcfgName[0], 0, osal_sizeof(gDevWmt.cWmtcfgName));
|
||||
|
||||
osal_strncat(&(gDevWmt.cWmtcfgName[0]), CUST_CFG_WMT_PREFIX, osal_sizeof(CUST_CFG_WMT_PREFIX));
|
||||
osal_strncat(&(gDevWmt.cWmtcfgName[0]), CUST_CFG_WMT, osal_sizeof(CUST_CFG_WMT));
|
||||
#endif
|
||||
|
||||
if (!osal_strlen(&(gDevWmt.cWmtcfgName[0])))
|
||||
{
|
||||
WMT_ERR_FUNC("empty Wmtcfg name\n");
|
||||
osal_assert(0);
|
||||
return ret;
|
||||
}
|
||||
WMT_INFO_FUNC("WMT config file:%s\n", &(gDevWmt.cWmtcfgName[0]));
|
||||
if ( 0 == wmt_dev_patch_get(&gDevWmt.cWmtcfgName[0], (osal_firmware **)&gDevWmt.pWmtCfg, 0) )
|
||||
{
|
||||
/*get full name patch success*/
|
||||
WMT_INFO_FUNC("get full file name(%s) buf(0x%p) size(%d)\n",
|
||||
&gDevWmt.cWmtcfgName[0], gDevWmt.pWmtCfg->data, gDevWmt.pWmtCfg->size);
|
||||
|
||||
if( 0 == wmt_conf_parse(&gDevWmt, (const PCHAR)gDevWmt.pWmtCfg->data, gDevWmt.pWmtCfg->size))
|
||||
{
|
||||
/*config file exists*/
|
||||
gDevWmt.rWmtGenConf.cfgExist = 1;
|
||||
|
||||
WMT_INFO_FUNC("&gDevWmt.rWmtGenConf=%p\n", &gDevWmt.rWmtGenConf);
|
||||
ret = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_ERR_FUNC("wmt conf parsing fail\n");
|
||||
osal_assert(0);
|
||||
ret = -1;
|
||||
}
|
||||
wmt_dev_patch_put((osal_firmware **)&gDevWmt.pWmtCfg);
|
||||
/*
|
||||
if (gDevWmt.pWmtCfg)
|
||||
{
|
||||
if (gDevWmt.pWmtCfg->data)
|
||||
{
|
||||
osal_free(gDevWmt.pWmtCfg->data);
|
||||
}
|
||||
osal_free(gDevWmt.pWmtCfg);
|
||||
gDevWmt.pWmtCfg = 0;
|
||||
}
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_ERR_FUNC("read %s file fails\n", &(gDevWmt.cWmtcfgName[0]));
|
||||
osal_assert(0);
|
||||
|
||||
gDevWmt.rWmtGenConf.cfgExist = 0;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
P_WMT_GEN_CONF wmt_conf_get_cfg(VOID)
|
||||
{
|
||||
if (0 == gDevWmt.rWmtGenConf.cfgExist)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
return &gDevWmt.rWmtGenConf;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,946 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-CTRL]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
|
||||
#include "wmt_ctrl.h"
|
||||
#include "wmt_core.h"
|
||||
#include "wmt_lib.h"
|
||||
#include "wmt_dev.h"
|
||||
#include "wmt_plat.h"
|
||||
#include "hif_sdio.h"
|
||||
#include "stp_core.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
// moved to wmt_ctrl.h
|
||||
/*static INT32 wmt_ctrl_tx_ex (UINT8 *pData, UINT32 size, UINT32 *writtenSize, MTK_WCN_BOOL bRawFlag);*/
|
||||
|
||||
static INT32 wmt_ctrl_stp_conf_ex (WMT_STP_CONF_TYPE type, UINT32 value);
|
||||
|
||||
static INT32 wmt_ctrl_hw_pwr_off(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_hw_pwr_on(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_hw_rst(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_stp_close(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_stp_open(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_stp_conf(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_free_patch(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_get_patch(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_host_baudrate_set(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_sdio_hw(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_sdio_func(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_hwidver_set (P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_stp_rst(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_get_wmt_conf(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_others(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_tx(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_rx(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_patch_search(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_crystal_triming_put(P_WMT_CTRL_DATA pWmtCtrlData);
|
||||
static INT32 wmt_ctrl_crystal_triming_get(P_WMT_CTRL_DATA pWmtCtrlData);
|
||||
INT32 wmt_ctrl_hw_state_show(P_WMT_CTRL_DATA pWmtCtrlData);
|
||||
static INT32 wmt_ctrl_get_patch_num(P_WMT_CTRL_DATA);
|
||||
static INT32 wmt_ctrl_get_patch_info(P_WMT_CTRL_DATA);
|
||||
static INT32
|
||||
wmt_ctrl_rx_flush (
|
||||
P_WMT_CTRL_DATA
|
||||
);
|
||||
|
||||
static INT32
|
||||
wmt_ctrl_gps_sync_set (
|
||||
P_WMT_CTRL_DATA pData
|
||||
);
|
||||
|
||||
static INT32
|
||||
wmt_ctrl_gps_lna_set (
|
||||
P_WMT_CTRL_DATA pData
|
||||
);
|
||||
|
||||
|
||||
static INT32 wmt_ctrl_get_patch_name(P_WMT_CTRL_DATA pWmtCtrlData);
|
||||
|
||||
// TODO: [FixMe][GeorgeKuo]: remove unused function
|
||||
/*static INT32 wmt_ctrl_hwver_get(P_WMT_CTRL_DATA);*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
// TODO:[FixMe][GeorgeKuo]: use module APIs instead of direct access to internal data
|
||||
extern DEV_WMT gDevWmt;
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* GeorgeKuo: Use designated initializers described in
|
||||
* http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Designated-Inits.html
|
||||
*/
|
||||
const static WMT_CTRL_FUNC wmt_ctrl_func[] =
|
||||
{
|
||||
[WMT_CTRL_HW_PWR_OFF] = wmt_ctrl_hw_pwr_off,
|
||||
[WMT_CTRL_HW_PWR_ON] = wmt_ctrl_hw_pwr_on,
|
||||
[WMT_CTRL_HW_RST] = wmt_ctrl_hw_rst,
|
||||
[WMT_CTRL_STP_CLOSE] = wmt_ctrl_stp_close,
|
||||
[WMT_CTRL_STP_OPEN] = wmt_ctrl_stp_open,
|
||||
[WMT_CTRL_STP_CONF] = wmt_ctrl_stp_conf,
|
||||
[WMT_CTRL_FREE_PATCH] = wmt_ctrl_free_patch,
|
||||
[WMT_CTRL_GET_PATCH] = wmt_ctrl_get_patch,
|
||||
[WMT_CTRL_GET_PATCH_NAME] = wmt_ctrl_get_patch_name,
|
||||
[WMT_CTRL_HOST_BAUDRATE_SET] = wmt_ctrl_host_baudrate_set,
|
||||
[WMT_CTRL_SDIO_HW] = wmt_ctrl_sdio_hw,
|
||||
[WMT_CTRL_SDIO_FUNC] = wmt_ctrl_sdio_func,
|
||||
[WMT_CTRL_HWIDVER_SET] = wmt_ctrl_hwidver_set,
|
||||
[WMT_CTRL_HWVER_GET] = NULL, // TODO: [FixMe][GeorgeKuo]: remove unused function.
|
||||
[WMT_CTRL_STP_RST] = wmt_ctrl_stp_rst,
|
||||
[WMT_CTRL_GET_WMT_CONF] = wmt_ctrl_get_wmt_conf,
|
||||
[WMT_CTRL_TX] = wmt_ctrl_tx,
|
||||
[WMT_CTRL_RX] = wmt_ctrl_rx,
|
||||
[WMT_CTRL_RX_FLUSH] = wmt_ctrl_rx_flush,
|
||||
[WMT_CTRL_GPS_SYNC_SET] = wmt_ctrl_gps_sync_set,
|
||||
[WMT_CTRL_GPS_LNA_SET] = wmt_ctrl_gps_lna_set,
|
||||
[WMT_CTRL_PATCH_SEARCH] = wmt_ctrl_patch_search,
|
||||
[WMT_CTRL_CRYSTAL_TRIMING_GET] = wmt_ctrl_crystal_triming_get,
|
||||
[WMT_CTRL_CRYSTAL_TRIMING_PUT] = wmt_ctrl_crystal_triming_put,
|
||||
[WMT_CTRL_HW_STATE_DUMP] = wmt_ctrl_hw_state_show,
|
||||
[WMT_CTRL_GET_PATCH_NUM] = wmt_ctrl_get_patch_num,
|
||||
[WMT_CTRL_GET_PATCH_INFO] = wmt_ctrl_get_patch_info,
|
||||
[WMT_CTRL_MAX] = wmt_ctrl_others,
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32 wmt_ctrl (P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
UINT32 ctrlId = pWmtCtrlData->ctrlId;
|
||||
|
||||
if (NULL == pWmtCtrlData) {
|
||||
osal_assert(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*1sanity check, including wmtCtrlId*/
|
||||
if ( (NULL == pWmtCtrlData)
|
||||
|| (WMT_CTRL_MAX <= ctrlId) )
|
||||
/* || (ctrlId < WMT_CTRL_HW_PWR_OFF) ) [FixMe][GeorgeKuo]: useless comparison */
|
||||
{
|
||||
osal_assert(NULL != pWmtCtrlData);
|
||||
osal_assert(WMT_CTRL_MAX > ctrlId);
|
||||
/* osal_assert(ctrlId >= WMT_CTRL_HW_PWR_OFF); [FixMe][GeorgeKuo]: useless comparison */
|
||||
return -2;
|
||||
}
|
||||
|
||||
// TODO: [FixMe][GeorgeKuo] do sanity check to const function table when init and skip checking here
|
||||
if (wmt_ctrl_func[ctrlId]) {
|
||||
/*call servicd handling API*/
|
||||
return (*(wmt_ctrl_func[ctrlId]))(pWmtCtrlData); /* serviceHandlerPack[ctrlId].serviceHandler */
|
||||
}
|
||||
else {
|
||||
osal_assert(NULL != wmt_ctrl_func[ctrlId]);
|
||||
return -3;
|
||||
}
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_tx (P_WMT_CTRL_DATA pWmtCtrlData/*UINT8 *pData, UINT32 size, UINT32 *writtenSize*/)
|
||||
{
|
||||
UINT8 *pData = (UINT8 *)pWmtCtrlData->au4CtrlData[0];
|
||||
UINT32 size = pWmtCtrlData->au4CtrlData[1];
|
||||
UINT32 *writtenSize = (UINT32 *)pWmtCtrlData->au4CtrlData[2];
|
||||
MTK_WCN_BOOL bRawFlag = pWmtCtrlData->au4CtrlData[3];
|
||||
|
||||
return wmt_ctrl_tx_ex(pData, size, writtenSize, bRawFlag);
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_rx(P_WMT_CTRL_DATA pWmtCtrlData/*UINT8 *pBuff, UINT32 buffLen, UINT32 *readSize*/)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
INT32 readLen;
|
||||
LONG waitRet = -1;
|
||||
UINT8 *pBuff = (UINT8 *)pWmtCtrlData->au4CtrlData[0];
|
||||
UINT32 buffLen = pWmtCtrlData->au4CtrlData[1];
|
||||
UINT32 *readSize = (UINT32 *)pWmtCtrlData->au4CtrlData[2];
|
||||
|
||||
if (readSize) {
|
||||
*readSize = 0;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if (!buffLen ) {
|
||||
WMT_WARN_FUNC("buffLen = 0\n");
|
||||
osal_assert(buffLen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (!pDev) {
|
||||
WMT_WARN_FUNC("gpDevWmt = NULL\n");
|
||||
osal_assert(pDev);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state)) {
|
||||
WMT_WARN_FUNC("state(0x%lx) \n", pDev->state);
|
||||
osal_assert(osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state));
|
||||
return -2;
|
||||
}
|
||||
|
||||
/* sanity ok, proceeding rx operation */
|
||||
/* read_len = mtk_wcn_stp_receive_data(data, size, WMT_TASK_INDX); */
|
||||
readLen = mtk_wcn_stp_receive_data(pBuff, buffLen, WMT_TASK_INDX);
|
||||
|
||||
while (readLen == 0) { // got nothing, wait for STP's signal
|
||||
WMT_LOUD_FUNC("before wmt_dev_rx_timeout\n");
|
||||
//iRet = wait_event_interruptible(pdev->rWmtRxWq, osal_test_bit(WMT_STAT_RX, &pdev->state));
|
||||
//waitRet = wait_event_interruptible_timeout(pDev->rWmtRxWq, osal_test_bit(WMT_STAT_RX, &pdev->state), msecs_to_jiffies(WMT_LIB_RX_TIMEOUT));
|
||||
pDev->rWmtRxWq.timeoutValue = WMT_LIB_RX_TIMEOUT;
|
||||
//waitRet = osal_wait_for_event_bit_timeout(&pDev->rWmtRxWq, &pDev->state, WMT_STAT_RX);
|
||||
waitRet = wmt_dev_rx_timeout(&pDev->rWmtRxWq);
|
||||
|
||||
WMT_LOUD_FUNC("wmt_dev_rx_timeout returned\n");
|
||||
|
||||
if (0 == waitRet) {
|
||||
WMT_ERR_FUNC("wmt_dev_rx_timeout: timeout \n");
|
||||
return -1;
|
||||
}
|
||||
else if (waitRet < 0) {
|
||||
WMT_WARN_FUNC("wmt_dev_rx_timeout: interrupted by signal (%ld)\n", waitRet);
|
||||
return waitRet;
|
||||
}
|
||||
WMT_DBG_FUNC("wmt_dev_rx_timeout, iRet(%ld)\n", waitRet);
|
||||
/* read_len = mtk_wcn_stp_receive_data(data, size, WMT_TASK_INDX); */
|
||||
readLen = mtk_wcn_stp_receive_data(pBuff, buffLen, WMT_TASK_INDX);
|
||||
|
||||
if (0 == readLen) {
|
||||
WMT_WARN_FUNC("wmt_ctrl_rx be signaled, but no rx data(%ld)\n", waitRet);
|
||||
}
|
||||
WMT_DBG_FUNC("readLen(%d) \n", readLen);
|
||||
}
|
||||
|
||||
if (readSize) {
|
||||
*readSize = readLen ;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT32
|
||||
wmt_ctrl_tx_ex (
|
||||
const UINT8 *pData,
|
||||
const UINT32 size,
|
||||
UINT32 *writtenSize,
|
||||
const MTK_WCN_BOOL bRawFlag
|
||||
)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
INT32 iRet;
|
||||
|
||||
if (NULL != writtenSize) {
|
||||
*writtenSize = 0;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if (0 == size) {
|
||||
WMT_WARN_FUNC("size to tx is 0\n");
|
||||
osal_assert(size);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* if STP is not enabled yet, can't use this function. Use tx_raw instead */
|
||||
if ( !osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state) ||
|
||||
!osal_test_bit(WMT_STAT_STP_EN, &pDev->state) ) {
|
||||
WMT_ERR_FUNC("wmt state(0x%lx) \n", pDev->state);
|
||||
osal_assert(osal_test_bit(WMT_STAT_STP_EN, &pDev->state));
|
||||
osal_assert(osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state));
|
||||
return -2;
|
||||
}
|
||||
|
||||
/* sanity ok, proceeding tx operation */
|
||||
/*retval = mtk_wcn_stp_send_data(data, size, WMTDRV_TYPE_WMT);*/
|
||||
mtk_wcn_stp_flush_rx_queue(WMT_TASK_INDX);
|
||||
if (bRawFlag) {
|
||||
iRet = mtk_wcn_stp_send_data_raw(pData, size, WMT_TASK_INDX);
|
||||
}
|
||||
else {
|
||||
iRet = mtk_wcn_stp_send_data(pData, size, WMT_TASK_INDX);
|
||||
}
|
||||
|
||||
if (iRet != size){
|
||||
WMT_WARN_FUNC("write(%d) written(%d)\n", size, iRet);
|
||||
osal_assert(iRet == size);
|
||||
}
|
||||
|
||||
if (writtenSize) {
|
||||
*writtenSize = iRet;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
INT32
|
||||
wmt_ctrl_rx_flush (
|
||||
P_WMT_CTRL_DATA pWmtCtrlData
|
||||
)
|
||||
{
|
||||
UINT32 type = pWmtCtrlData->au4CtrlData[0];
|
||||
|
||||
WMT_INFO_FUNC("flush rx %d queue\n", type);
|
||||
mtk_wcn_stp_flush_rx_queue(type);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_hw_pwr_off(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iret;
|
||||
|
||||
/*psm should be disabled before wmt_ic_deinit*/
|
||||
P_DEV_WMT pDev = &gDevWmt;
|
||||
if (osal_test_and_clear_bit(WMT_STAT_PWR, &pDev->state)) {
|
||||
WMT_DBG_FUNC("on->off \n");
|
||||
iret = wmt_plat_pwr_ctrl(FUNC_OFF);
|
||||
}
|
||||
else {
|
||||
WMT_WARN_FUNC("already off \n");
|
||||
iret = 0;
|
||||
}
|
||||
|
||||
return iret;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_hw_pwr_on(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iret;
|
||||
|
||||
/*psm should be enabled right after wmt_ic_init*/
|
||||
P_DEV_WMT pDev = &gDevWmt;
|
||||
if (osal_test_and_set_bit(WMT_STAT_PWR, &pDev->state)) {
|
||||
WMT_WARN_FUNC("already on\n");
|
||||
iret = 0;
|
||||
}
|
||||
else {
|
||||
WMT_DBG_FUNC("off->on \n");
|
||||
iret = wmt_plat_pwr_ctrl(FUNC_ON);
|
||||
}
|
||||
|
||||
return iret;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_ul_cmd (
|
||||
P_DEV_WMT pWmtDev,
|
||||
const UCHAR *pCmdStr
|
||||
)
|
||||
{
|
||||
INT32 waitRet = -1;
|
||||
P_OSAL_SIGNAL pCmdSignal;
|
||||
P_OSAL_EVENT pCmdReq;
|
||||
if (osal_test_and_set_bit(WMT_STAT_CMD, &pWmtDev->state)) {
|
||||
WMT_WARN_FUNC("cmd buf is occupied by (%s) \n", pWmtDev->cCmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* indicate baud rate change to user space app */
|
||||
#if 0
|
||||
INIT_COMPLETION(pWmtDev->cmd_comp);
|
||||
pWmtDev->cmd_result = -1;
|
||||
strncpy(pWmtDev->cCmd, pCmdStr, NAME_MAX);
|
||||
pWmtDev->cCmd[NAME_MAX] = '\0';
|
||||
wake_up_interruptible(&pWmtDev->cmd_wq);
|
||||
#endif
|
||||
|
||||
pCmdSignal = &pWmtDev->cmdResp;
|
||||
osal_signal_init(pCmdSignal);
|
||||
pCmdSignal->timeoutValue = 2000;
|
||||
osal_strncpy(pWmtDev->cCmd, pCmdStr, NAME_MAX);
|
||||
pWmtDev->cCmd[NAME_MAX] = '\0';
|
||||
|
||||
pCmdReq = &pWmtDev->cmdReq;
|
||||
|
||||
osal_trigger_event(&pWmtDev->cmdReq);
|
||||
WMT_DBG_FUNC("str(%s) request ok\n", pCmdStr);
|
||||
|
||||
// waitRet = wait_for_completion_interruptible_timeout(&pWmtDev->cmd_comp, msecs_to_jiffies(2000));
|
||||
waitRet = osal_wait_for_signal_timeout(pCmdSignal);
|
||||
WMT_LOUD_FUNC("wait signal iRet:%d\n", waitRet);
|
||||
if (0 == waitRet) {
|
||||
WMT_ERR_FUNC("wait signal timeout \n");
|
||||
return -2;
|
||||
}
|
||||
|
||||
WMT_INFO_FUNC("str(%s) result(%d)\n", pCmdStr, pWmtDev->cmdResult);
|
||||
|
||||
return pWmtDev->cmdResult;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_hw_rst(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
wmt_plat_pwr_ctrl(FUNC_RST);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_hw_state_show(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
wmt_plat_pwr_ctrl(FUNC_STAT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_stp_close(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
INT32 iRet = 0;
|
||||
UCHAR cmdStr[NAME_MAX + 1] = {0};
|
||||
/* un-register to STP-core for rx */
|
||||
iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, NULL); /* mtk_wcn_stp_register_event_cb */
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("stp_reg cb unregister fail(%d)\n", iRet);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (WMT_HIF_UART == pDev->rWmtHifConf.hifType) {
|
||||
|
||||
osal_snprintf(cmdStr, NAME_MAX, "close_stp");
|
||||
|
||||
iRet = wmt_ctrl_ul_cmd(pDev, cmdStr);
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("wmt_ctrl_ul_cmd fail(%d)\n", iRet);
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
osal_clear_bit(WMT_STAT_STP_OPEN, &pDev->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_stp_open(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
INT32 iRet;
|
||||
UCHAR cmdStr[NAME_MAX + 1] = {0};
|
||||
|
||||
if (WMT_HIF_UART == pDev->rWmtHifConf.hifType) {
|
||||
osal_snprintf(cmdStr, NAME_MAX, "open_stp");
|
||||
iRet = wmt_ctrl_ul_cmd(pDev, cmdStr);
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("wmt_ctrl_ul_cmd fail(%d)\n", iRet);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* register to STP-core for rx */
|
||||
iRet = mtk_wcn_stp_register_event_cb(WMT_TASK_INDX, wmt_dev_rx_event_cb); /* mtk_wcn_stp_register_event_cb */
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("stp_reg cb fail(%d)\n", iRet);
|
||||
return -2;
|
||||
}
|
||||
|
||||
osal_set_bit(WMT_STAT_STP_OPEN, &pDev->state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_patch_search(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
INT32 iRet;
|
||||
UCHAR cmdStr[NAME_MAX + 1] = {0};
|
||||
osal_snprintf(cmdStr, NAME_MAX, "srh_patch");
|
||||
iRet = wmt_ctrl_ul_cmd(pDev, cmdStr);
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("wmt_ctrl_ul_cmd fail(%d)\n", iRet);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_get_patch_num(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
pWmtCtrlData->au4CtrlData[0] = pDev->patchNum;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_get_patch_info(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
UINT32 downLoadSeq = 0;
|
||||
P_WMT_PATCH_INFO pPatchinfo = NULL;
|
||||
PUCHAR pNbuf = NULL;
|
||||
PUCHAR pAbuf =NULL;
|
||||
|
||||
downLoadSeq = pWmtCtrlData->au4CtrlData[0];
|
||||
WMT_DBG_FUNC("download seq is %d\n",downLoadSeq);
|
||||
|
||||
pPatchinfo = pDev->pWmtPatchInfo + downLoadSeq - 1;
|
||||
pNbuf = (PUCHAR)pWmtCtrlData->au4CtrlData[1];
|
||||
pAbuf = (PUCHAR)pWmtCtrlData->au4CtrlData[2];
|
||||
if(pPatchinfo)
|
||||
{
|
||||
osal_memcpy(pNbuf,pPatchinfo->patchName,osal_sizeof(pPatchinfo->patchName));
|
||||
osal_memcpy(pAbuf,pPatchinfo->addRess,osal_sizeof(pPatchinfo->addRess));
|
||||
WMT_DBG_FUNC("get 4 address bytes is 0x%2x,0x%2x,0x%2x,0x%2x",pAbuf[0],pAbuf[1],pAbuf[2],pAbuf[3]);
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_ERR_FUNC("NULL patchinfo pointer\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_stp_conf_ex (WMT_STP_CONF_TYPE type, UINT32 value)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
switch (type) {
|
||||
case WMT_STP_CONF_EN:
|
||||
iRet = mtk_wcn_stp_enable(value);
|
||||
break;
|
||||
|
||||
case WMT_STP_CONF_RDY:
|
||||
iRet = mtk_wcn_stp_ready(value);
|
||||
break;
|
||||
|
||||
case WMT_STP_CONF_MODE:
|
||||
mtk_wcn_stp_set_mode(value);
|
||||
iRet = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
WMT_WARN_FUNC("invalid type(%d) value(%d) \n", type, value);
|
||||
break;
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_stp_conf(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
UINT32 type;
|
||||
UINT32 value;
|
||||
if (!osal_test_bit(WMT_STAT_STP_OPEN, &pDev->state)) {
|
||||
WMT_WARN_FUNC("CTRL_STP_ENABLE but invalid Handle of WmtStp \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
type = pWmtCtrlData->au4CtrlData[0];
|
||||
value = pWmtCtrlData->au4CtrlData[1];
|
||||
iRet = wmt_ctrl_stp_conf_ex(type, value);
|
||||
|
||||
if (!iRet) {
|
||||
if (WMT_STP_CONF_EN == type) {
|
||||
if (value) {
|
||||
osal_set_bit(WMT_STAT_STP_EN, &pDev->state);
|
||||
WMT_DBG_FUNC("enable STP\n");
|
||||
}
|
||||
else {
|
||||
osal_clear_bit(WMT_STAT_STP_EN, &pDev->state);
|
||||
WMT_DBG_FUNC("disable STP\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_free_patch(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
UINT32 patchSeq = pWmtCtrlData->au4CtrlData[0];
|
||||
WMT_DBG_FUNC("BF free patch, gDevWmt.pPatch(0x%08x)\n", gDevWmt.pPatch);
|
||||
if (NULL != gDevWmt.pPatch)
|
||||
{
|
||||
wmt_dev_patch_put((osal_firmware **)&(gDevWmt.pPatch));
|
||||
}
|
||||
WMT_DBG_FUNC("AF free patch, gDevWmt.pPatch(0x%08x)\n", gDevWmt.pPatch);
|
||||
if (patchSeq == gDevWmt.patchNum)
|
||||
{
|
||||
WMT_DBG_FUNC("the %d patch has been download\n",patchSeq);
|
||||
wmt_dev_patch_info_free();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
INT32 wmt_ctrl_get_patch_name(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
PUCHAR pBuf = (PUCHAR)pWmtCtrlData->au4CtrlData[0];
|
||||
osal_memcpy(pBuf, gDevWmt.cPatchName, osal_sizeof(gDevWmt.cPatchName));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
INT32 wmt_ctrl_crystal_triming_put(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
WMT_DBG_FUNC("BF free patch, gDevWmt.pPatch(0x%08x)\n", gDevWmt.pPatch);
|
||||
if (NULL != gDevWmt.pNvram)
|
||||
{
|
||||
wmt_dev_patch_put((osal_firmware **)&(gDevWmt.pNvram));
|
||||
}
|
||||
WMT_DBG_FUNC("AF free patch, gDevWmt.pNvram(0x%08x)\n", gDevWmt.pNvram);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_crystal_triming_get(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iRet = 0x0;
|
||||
UCHAR *pFileName = (UCHAR *)pWmtCtrlData->au4CtrlData[0];
|
||||
PUINT8 *ppBuf = (PUINT8 *)pWmtCtrlData->au4CtrlData[1];
|
||||
PUINT32 pSize = (PUINT32)pWmtCtrlData->au4CtrlData[2];
|
||||
|
||||
osal_firmware *pNvram = NULL;
|
||||
|
||||
if ((NULL == pFileName) || (NULL == pSize))
|
||||
{
|
||||
WMT_ERR_FUNC("parameter error, pFileName(0x%08x), pSize(0x%08x)\n", pFileName, pSize);
|
||||
iRet = -1;
|
||||
return iRet;
|
||||
}
|
||||
if (0 == wmt_dev_patch_get(pFileName, &pNvram, 0))
|
||||
{
|
||||
*ppBuf = (PUINT8)(pNvram)->data;
|
||||
*pSize = (pNvram)->size;
|
||||
gDevWmt.pNvram = pNvram;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_get_patch(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
UCHAR *pFullPatchName = NULL;
|
||||
UCHAR *pDefPatchName = NULL;
|
||||
PUINT8 *ppBuf = (PUINT8 *)pWmtCtrlData->au4CtrlData[2];
|
||||
PUINT32 pSize = (PUINT32)pWmtCtrlData->au4CtrlData[3];
|
||||
|
||||
osal_firmware *pPatch = NULL;
|
||||
pFullPatchName = (UCHAR *)pWmtCtrlData->au4CtrlData[1];
|
||||
WMT_DBG_FUNC("BF get patch, pPatch(0x%08x)\n", pPatch);
|
||||
if ( (NULL != pFullPatchName)
|
||||
&& (0 == wmt_dev_patch_get(pFullPatchName, &pPatch, BCNT_PATCH_BUF_HEADROOM)) ) {
|
||||
/*get full name patch success*/
|
||||
WMT_DBG_FUNC("get full patch name(%s) buf(0x%p) size(%d)\n",
|
||||
pFullPatchName, (pPatch)->data, (pPatch)->size);
|
||||
WMT_DBG_FUNC("AF get patch, pPatch(0x%08x)\n", pPatch);
|
||||
*ppBuf = (PUINT8)(pPatch)->data;
|
||||
*pSize = (pPatch)->size;
|
||||
gDevWmt.pPatch = pPatch;
|
||||
return 0;
|
||||
}
|
||||
|
||||
pDefPatchName = (UCHAR *)pWmtCtrlData->au4CtrlData[0];
|
||||
if ( (NULL != pDefPatchName)
|
||||
&& (0 == wmt_dev_patch_get(pDefPatchName, &pPatch, BCNT_PATCH_BUF_HEADROOM)) ) {
|
||||
WMT_DBG_FUNC("get def patch name(%s) buf(0x%p) size(%d)\n",
|
||||
pDefPatchName, (pPatch)->data, (pPatch)->size);
|
||||
WMT_DBG_FUNC("AF get patch, pPatch(0x%08x)\n", pPatch);
|
||||
/*get full name patch success*/
|
||||
*ppBuf = (PUINT8)(pPatch)->data;
|
||||
*pSize = (pPatch)->size;
|
||||
gDevWmt.pPatch = pPatch;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_host_baudrate_set(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
CHAR cmdStr[NAME_MAX + 1] = {0};
|
||||
UINT32 u4Baudrate = pWmtCtrlData->au4CtrlData[0];
|
||||
UINT32 u4FlowCtrl = pWmtCtrlData->au4CtrlData[1];
|
||||
|
||||
WMT_DBG_FUNC("baud(%d), flowctrl(%d) \n", u4Baudrate, u4FlowCtrl);
|
||||
|
||||
if (osal_test_bit(WMT_STAT_STP_OPEN, &gDevWmt.state)) {
|
||||
osal_snprintf(cmdStr, NAME_MAX, "baud_%d_%d", u4Baudrate, u4FlowCtrl);
|
||||
iRet = wmt_ctrl_ul_cmd(&gDevWmt, cmdStr);
|
||||
if (iRet) {
|
||||
WMT_WARN_FUNC("CTRL_BAUDRATE baud(%d), flowctrl(%d) fail(%d) \n",
|
||||
u4Baudrate,
|
||||
pWmtCtrlData->au4CtrlData[1],
|
||||
iRet);
|
||||
}
|
||||
else {
|
||||
WMT_DBG_FUNC("CTRL_BAUDRATE baud(%d), flowctrl(%d) ok\n",
|
||||
u4Baudrate,
|
||||
u4FlowCtrl);
|
||||
}
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("CTRL_BAUDRATE but invalid Handle of WmtStp \n");
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_sdio_hw(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
UINT32 statBit = WMT_STAT_SDIO1_ON;
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
|
||||
WMT_SDIO_SLOT_NUM sdioSlotNum = pWmtCtrlData->au4CtrlData[0];
|
||||
ENUM_FUNC_STATE funcState = pWmtCtrlData->au4CtrlData[1];
|
||||
|
||||
if ((WMT_SDIO_SLOT_INVALID == sdioSlotNum)
|
||||
|| (WMT_SDIO_SLOT_MAX <= sdioSlotNum)) {
|
||||
WMT_WARN_FUNC("CTRL_SDIO_SLOT(%d) but invalid slot num \n", sdioSlotNum);
|
||||
return -1;
|
||||
}
|
||||
|
||||
WMT_DBG_FUNC("WMT_CTRL_SDIO_HW (0x%x, %d)\n", sdioSlotNum, funcState);
|
||||
|
||||
if (WMT_SDIO_SLOT_SDIO2 == sdioSlotNum) {
|
||||
statBit = WMT_STAT_SDIO2_ON;
|
||||
}
|
||||
|
||||
if (funcState) {
|
||||
if (osal_test_and_set_bit(statBit, &pDev->state)) {
|
||||
WMT_WARN_FUNC("CTRL_SDIO_SLOT slotNum(%d) already ON \n", sdioSlotNum);
|
||||
//still return 0
|
||||
iRet = 0;
|
||||
}
|
||||
else {
|
||||
iRet = wmt_plat_sdio_ctrl(sdioSlotNum, FUNC_ON);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (osal_test_and_clear_bit(statBit, &pDev->state)) {
|
||||
iRet = wmt_plat_sdio_ctrl(sdioSlotNum, FUNC_OFF);
|
||||
}
|
||||
else {
|
||||
WMT_WARN_FUNC("CTRL_SDIO_SLOT slotNum(%d) already OFF \n", sdioSlotNum);
|
||||
//still return 0
|
||||
iRet = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_sdio_func(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
UINT32 statBit = WMT_STAT_SDIO_WIFI_ON;
|
||||
INT32 retry = 10;
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
WMT_SDIO_FUNC_TYPE sdioFuncType = pWmtCtrlData->au4CtrlData[0];
|
||||
UINT32 u4On = pWmtCtrlData->au4CtrlData[1];
|
||||
|
||||
if (WMT_SDIO_FUNC_MAX <= sdioFuncType) {
|
||||
WMT_ERR_FUNC("CTRL_SDIO_FUNC, invalid func type (%d) \n", sdioFuncType);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (WMT_SDIO_FUNC_STP == sdioFuncType) {
|
||||
statBit = WMT_STAT_SDIO_STP_ON;
|
||||
}
|
||||
|
||||
if (u4On) {
|
||||
if (osal_test_bit(statBit, &pDev->state)) {
|
||||
WMT_WARN_FUNC("CTRL_SDIO_FUNC(%d) but already ON \n", sdioFuncType);
|
||||
iRet = 0;
|
||||
}
|
||||
else {
|
||||
while (retry-- > 0 && iRet != 0) {
|
||||
if (iRet) {
|
||||
/* sleep 150ms before sdio slot ON ready */
|
||||
osal_msleep(150);
|
||||
}
|
||||
iRet = mtk_wcn_hif_sdio_wmt_control(sdioFuncType, MTK_WCN_BOOL_TRUE);
|
||||
if (HIF_SDIO_ERR_NOT_PROBED == iRet) {
|
||||
/* not probed case, retry */
|
||||
continue;
|
||||
}
|
||||
else if (HIF_SDIO_ERR_CLT_NOT_REG == iRet){
|
||||
/* For WiFi, client not reg yet, no need to retry, WiFi function can work any time when wlan.ko is insert into system*/
|
||||
iRet = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* other fail cases, stop */
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!retry || iRet) {
|
||||
WMT_ERR_FUNC("mtk_wcn_hif_sdio_wmt_control(%d, TRUE) fail(%d) retry(%d)\n", sdioFuncType, iRet, retry);
|
||||
}
|
||||
else
|
||||
{
|
||||
osal_set_bit(statBit, &pDev->state);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (osal_test_bit(statBit, &pDev->state)) {
|
||||
iRet = mtk_wcn_hif_sdio_wmt_control(sdioFuncType, MTK_WCN_BOOL_FALSE);
|
||||
if (iRet) {
|
||||
WMT_ERR_FUNC("mtk_wcn_hif_sdio_wmt_control(%d, FALSE) fail(%d)\n", sdioFuncType, iRet);
|
||||
}
|
||||
/*any way, set to OFF state*/
|
||||
osal_clear_bit(statBit, &pDev->state);
|
||||
}
|
||||
else {
|
||||
WMT_WARN_FUNC("CTRL_SDIO_FUNC(%d) but already OFF \n", sdioFuncType);
|
||||
iRet = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return iRet;
|
||||
}
|
||||
|
||||
#if 0 // TODO: [FixMe][GeorgeKuo]: remove unused function. get hwver from core is not needed.
|
||||
INT32 wmt_ctrl_hwver_get(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
INT32 wmt_ctrl_hwidver_set(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
|
||||
/* input sanity check is done in wmt_ctrl() */
|
||||
pDev->chip_id = (pWmtCtrlData->au4CtrlData[0] & 0xFFFF0000) >> 16;
|
||||
pDev->hw_ver = pWmtCtrlData->au4CtrlData[0] & 0x0000FFFF;
|
||||
pDev->fw_ver = pWmtCtrlData->au4CtrlData[1] & 0x0000FFFF;
|
||||
|
||||
// TODO: [FixMe][GeorgeKuo] remove translated ENUM_WMTHWVER_TYPE_T in the future!!!
|
||||
// Only use hw_ver read from hw.
|
||||
pDev->eWmtHwVer =
|
||||
(ENUM_WMTHWVER_TYPE_T)(pWmtCtrlData->au4CtrlData[1] & 0xFFFF0000) >> 16;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32
|
||||
wmt_ctrl_gps_sync_set (
|
||||
P_WMT_CTRL_DATA pData
|
||||
)
|
||||
{
|
||||
INT32 iret;
|
||||
|
||||
WMT_INFO_FUNC("ctrl GPS_SYNC(%d)\n", (0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_MUX);
|
||||
iret = wmt_plat_gpio_ctrl(PIN_GPS_SYNC,
|
||||
(0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_MUX);
|
||||
|
||||
if (iret) {
|
||||
WMT_WARN_FUNC("ctrl GPS_SYNC(%d) fail!(%d) ignore it...\n",
|
||||
(0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_MUX,
|
||||
iret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static INT32
|
||||
wmt_ctrl_gps_lna_set (
|
||||
P_WMT_CTRL_DATA pData
|
||||
)
|
||||
{
|
||||
INT32 iret;
|
||||
|
||||
WMT_INFO_FUNC("ctrl GPS_LNA(%d)\n", (0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_OUT_H);
|
||||
iret = wmt_plat_gpio_ctrl(PIN_GPS_LNA,
|
||||
(0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_OUT_H);
|
||||
|
||||
if (iret) {
|
||||
WMT_WARN_FUNC("ctrl GPS_SYNC(%d) fail!(%d) ignore it...\n",
|
||||
(0 == pData->au4CtrlData[0]) ? PIN_STA_DEINIT : PIN_STA_OUT_H,
|
||||
iret);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_ctrl_stp_rst(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_get_wmt_conf(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
P_DEV_WMT pDev = &gDevWmt; /* single instance */
|
||||
|
||||
pWmtCtrlData->au4CtrlData[0] = (UINT32)&pDev->rWmtGenConf;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_ctrl_others(P_WMT_CTRL_DATA pWmtCtrlData)
|
||||
{
|
||||
WMT_ERR_FUNC("wmt_ctrl_others, invalid CTRL ID (%d)\n", pWmtCtrlData->ctrlId);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,706 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
/*! \file
|
||||
\brief brief description
|
||||
|
||||
Detailed descriptions here.
|
||||
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#include "wmt_dbg.h"
|
||||
#include "wmt_core.h"
|
||||
#include "wmt_lib.h"
|
||||
#include "wmt_conf.h"
|
||||
#include "psm_core.h"
|
||||
#include "stp_core.h"
|
||||
|
||||
#if CFG_WMT_DBG_SUPPORT
|
||||
|
||||
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-DEV]"
|
||||
|
||||
|
||||
|
||||
#define WMT_DBG_PROCNAME "driver/wmt_dbg"
|
||||
|
||||
static struct proc_dir_entry *gWmtDbgEntry = NULL;
|
||||
COEX_BUF gCoexBuf;
|
||||
|
||||
static INT32 wmt_dbg_psm_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_dsns_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_hwver_get(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_inband_rst(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_chip_rst(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_func_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_raed_chipid(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_wmt_dbg_level(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_stp_dbg_level(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_reg_read(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_reg_write(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_coex_test(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_assert_test(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_cmd_test_api(ENUM_WMTDRV_CMD_T cmd);
|
||||
static INT32 wmt_dbg_rst_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_ut_test(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_efuse_read(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_efuse_write(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_sdio_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_stp_dbg_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_stp_dbg_log_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
static INT32 wmt_dbg_wmt_assert_ctrl(INT32 par1, INT32 par2, INT32 par3);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
const static WMT_DEV_DBG_FUNC wmt_dev_dbg_func[] =
|
||||
{
|
||||
[0] = wmt_dbg_psm_ctrl,
|
||||
[1] = wmt_dbg_psm_ctrl,
|
||||
[2] = wmt_dbg_dsns_ctrl,
|
||||
[3] = wmt_dbg_hwver_get,
|
||||
[4] = wmt_dbg_assert_test,
|
||||
[5] = wmt_dbg_inband_rst,
|
||||
[6] = wmt_dbg_chip_rst,
|
||||
[7] = wmt_dbg_func_ctrl,
|
||||
[8] = wmt_dbg_raed_chipid,
|
||||
[9] = wmt_dbg_wmt_dbg_level,
|
||||
[0xa] = wmt_dbg_stp_dbg_level,
|
||||
[0xb] = wmt_dbg_reg_read,
|
||||
[0xc] = wmt_dbg_reg_write,
|
||||
[0xd] = wmt_dbg_coex_test,
|
||||
[0xe] = wmt_dbg_rst_ctrl,
|
||||
[0xf] = wmt_dbg_ut_test,
|
||||
[0x10] = wmt_dbg_efuse_read,
|
||||
[0x11] = wmt_dbg_efuse_write,
|
||||
[0x12] = wmt_dbg_sdio_ctrl,
|
||||
[0x13] = wmt_dbg_stp_dbg_ctrl,
|
||||
[0x14] = wmt_dbg_stp_dbg_log_ctrl,
|
||||
[0x15] = wmt_dbg_wmt_assert_ctrl,
|
||||
};
|
||||
|
||||
INT32 wmt_dbg_psm_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
#if CFG_WMT_PS_SUPPORT
|
||||
if (0 == par2)
|
||||
{
|
||||
wmt_lib_ps_ctrl(0);
|
||||
WMT_INFO_FUNC("disable PSM\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
par2 = (1 > par2 || 20000 < par2) ? STP_PSM_IDLE_TIME_SLEEP : par2;
|
||||
wmt_lib_ps_set_idle_time(par2);
|
||||
wmt_lib_ps_ctrl(1);
|
||||
WMT_INFO_FUNC("enable PSM, idle to sleep time = %d ms\n", par2);
|
||||
}
|
||||
#else
|
||||
WMT_INFO_FUNC("WMT PS not supported\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_dsns_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (WMTDSNS_FM_DISABLE <= par2 && WMTDSNS_MAX > par2 )
|
||||
{
|
||||
WMT_INFO_FUNC("DSNS type (%d)\n", par2);
|
||||
mtk_wcn_wmt_dsns_ctrl(par2);
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_WARN_FUNC("invalid DSNS type\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_hwver_get(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
WMT_INFO_FUNC("query chip version\n");
|
||||
mtk_wcn_wmt_hwver_get();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_assert_test(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (0 == par3)
|
||||
{
|
||||
//par2 = 0: send assert command
|
||||
//par2 != 0: send exception command
|
||||
return wmt_dbg_cmd_test_api(0 == par2 ? 0 : 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
INT32 sec = 8;
|
||||
INT32 times = 0;
|
||||
times = par3;
|
||||
do{
|
||||
WMT_INFO_FUNC("Send Assert Command per 8 secs!!\n");
|
||||
wmt_dbg_cmd_test_api(0);
|
||||
osal_msleep(sec * 1000);
|
||||
}while(--times);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_cmd_test_api(ENUM_WMTDRV_CMD_T cmd)
|
||||
{
|
||||
|
||||
P_OSAL_OP pOp = NULL;
|
||||
MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE;
|
||||
P_OSAL_SIGNAL pSignal;
|
||||
|
||||
pOp = wmt_lib_get_free_op();
|
||||
if (!pOp ) {
|
||||
WMT_WARN_FUNC("get_free_lxop fail\n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pSignal = &pOp ->signal;
|
||||
|
||||
pOp ->op.opId = WMT_OPID_CMD_TEST;
|
||||
|
||||
pSignal->timeoutValue= MAX_EACH_WMT_CMD;
|
||||
/*this test command should be run with usb cable connected, so no host awake is needed*/
|
||||
//wmt_lib_host_awake_get();
|
||||
switch (cmd)
|
||||
{
|
||||
case WMTDRV_CMD_ASSERT:
|
||||
pOp->op.au4OpData[0] = 0;
|
||||
break;
|
||||
case WMTDRV_CMD_EXCEPTION:
|
||||
pOp->op.au4OpData[0] = 1;
|
||||
break;
|
||||
default:
|
||||
if (WMTDRV_CMD_COEXDBG_00 <= cmd && WMTDRV_CMD_COEXDBG_15 >= cmd)
|
||||
{
|
||||
pOp->op.au4OpData[0] = 2;
|
||||
pOp->op.au4OpData[1] = cmd - 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
pOp->op.au4OpData[0] = 0xff;
|
||||
pOp->op.au4OpData[1] = 0xff;
|
||||
}
|
||||
pOp->op.au4OpData[2] = (ULONG)gCoexBuf.buffer;
|
||||
pOp->op.au4OpData[3] = osal_sizeof(gCoexBuf.buffer);
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("CMD_TEST, opid(%d), par(%d, %d)\n", pOp->op.opId, pOp->op.au4OpData[0], pOp->op.au4OpData[1]);
|
||||
/*wake up chip first*/
|
||||
if (DISABLE_PSM_MONITOR()) {
|
||||
WMT_ERR_FUNC("wake up failed\n");
|
||||
wmt_lib_put_op_to_free_queue(pOp);
|
||||
return -1;
|
||||
}
|
||||
bRet = wmt_lib_put_act_op(pOp);
|
||||
ENABLE_PSM_MONITOR();
|
||||
if ((cmd != WMTDRV_CMD_ASSERT) && (cmd != WMTDRV_CMD_EXCEPTION))
|
||||
{
|
||||
if (MTK_WCN_BOOL_FALSE == bRet)
|
||||
{
|
||||
gCoexBuf.availSize = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
gCoexBuf.availSize = pOp->op.au4OpData[3];
|
||||
WMT_INFO_FUNC("gCoexBuf.availSize = %d\n", gCoexBuf.availSize);
|
||||
}
|
||||
}
|
||||
//wmt_lib_host_awake_put();
|
||||
WMT_INFO_FUNC("CMD_TEST, opid (%d), par(%d, %d), ret(%d), result(%s)\n", \
|
||||
pOp->op.opId, \
|
||||
pOp->op.au4OpData[0], \
|
||||
pOp->op.au4OpData[1], \
|
||||
bRet, \
|
||||
MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"\
|
||||
);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_inband_rst(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (0 == par2)
|
||||
{
|
||||
WMT_INFO_FUNC("inband reset test!!\n");
|
||||
mtk_wcn_stp_inband_reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("STP context reset in host side!!\n");
|
||||
mtk_wcn_stp_flush_context();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_chip_rst(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (0 == par2)
|
||||
{
|
||||
if (mtk_wcn_stp_is_ready())
|
||||
{
|
||||
WMT_INFO_FUNC("whole chip reset test\n");
|
||||
wmt_lib_cmb_rst(WMTRSTSRC_RESET_TEST);
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("STP not ready , not to launch whole chip reset test\n");
|
||||
}
|
||||
}
|
||||
else if (1 == par2)
|
||||
{
|
||||
WMT_INFO_FUNC("chip hardware reset test\n");
|
||||
wmt_lib_hw_rst();
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("chip software reset test\n");
|
||||
wmt_lib_sw_rst(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_func_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (WMTDRV_TYPE_WMT > par2 || WMTDRV_TYPE_LPBK == par2)
|
||||
{
|
||||
if (0 == par3)
|
||||
{
|
||||
WMT_INFO_FUNC("function off test, type(%d)\n", par2);
|
||||
mtk_wcn_wmt_func_off(par2);
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("function on test, type(%d)\n", par2);
|
||||
mtk_wcn_wmt_func_on(par2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("function ctrl test, invalid type(%d)\n", par2);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_raed_chipid(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
WMT_INFO_FUNC("chip version = %d\n", wmt_lib_get_icinfo(WMTCHIN_MAPPINGHWVER));
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_wmt_dbg_level(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
par2 = (WMT_LOG_ERR <= par2 && WMT_LOG_LOUD >= par2) ? par2 : WMT_LOG_INFO;
|
||||
wmt_lib_dbg_level_set(par2);
|
||||
WMT_INFO_FUNC("set wmt log level to %d\n", par2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_stp_dbg_level(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
par2 = (0 <= par2 && 4 >= par2) ? par2 : 2;
|
||||
mtk_wcn_stp_dbg_level(par2);
|
||||
WMT_INFO_FUNC("set stp log level to %d\n", par2);
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_reg_read(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
//par2-->register address
|
||||
//par3-->register mask
|
||||
UINT32 value = 0x0;
|
||||
UINT32 iRet = -1;
|
||||
#if 0
|
||||
DISABLE_PSM_MONITOR();
|
||||
iRet = wmt_core_reg_rw_raw(0, par2, &value, par3);
|
||||
ENABLE_PSM_MONITOR();
|
||||
#endif
|
||||
iRet = wmt_lib_reg_rw(0, par2, &value, par3);
|
||||
WMT_INFO_FUNC("read combo chip register (0x%08x) with mask (0x%08x) %s, value = 0x%08x\n", \
|
||||
par2, \
|
||||
par3, \
|
||||
iRet != 0 ? "failed" : "succeed", \
|
||||
iRet != 0 ? -1: value\
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_reg_write(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
//par2-->register address
|
||||
//par3-->value to set
|
||||
UINT32 iRet = -1;
|
||||
#if 0
|
||||
DISABLE_PSM_MONITOR();
|
||||
iRet = wmt_core_reg_rw_raw(1, par2, &par3, 0xffffffff);
|
||||
ENABLE_PSM_MONITOR();
|
||||
#endif
|
||||
iRet = wmt_lib_reg_rw(1, par2, &par3, 0xffffffff);
|
||||
WMT_INFO_FUNC("write combo chip register (0x%08x) with value (0x%08x) %s\n", \
|
||||
par2, \
|
||||
par3, \
|
||||
iRet != 0 ? "failed" : "succeed"\
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_efuse_read(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
//par2-->efuse address
|
||||
//par3-->register mask
|
||||
UINT32 value = 0x0;
|
||||
UINT32 iRet = -1;
|
||||
|
||||
iRet = wmt_lib_efuse_rw(0, par2, &value, par3);
|
||||
WMT_INFO_FUNC("read combo chip efuse (0x%08x) with mask (0x%08x) %s, value = 0x%08x\n", \
|
||||
par2, \
|
||||
par3, \
|
||||
iRet != 0 ? "failed" : "succeed", \
|
||||
iRet != 0 ? -1: value\
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_efuse_write(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
//par2-->efuse address
|
||||
//par3-->value to set
|
||||
UINT32 iRet = -1;
|
||||
iRet = wmt_lib_efuse_rw(1, par2, &par3, 0xffffffff);
|
||||
WMT_INFO_FUNC("write combo chip efuse (0x%08x) with value (0x%08x) %s\n", \
|
||||
par2, \
|
||||
par3, \
|
||||
iRet != 0 ? "failed" : "succeed"\
|
||||
);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_dbg_sdio_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
iRet = wmt_lib_sdio_ctrl (0 != par2 ? 1 : 0);
|
||||
WMT_INFO_FUNC("ctrl SDIO function %s\n", 0 == iRet ? "succeed" : "failed");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_dbg_stp_dbg_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
if (1 < par2)
|
||||
{
|
||||
mtk_wcn_stp_dbg_dump_package();
|
||||
return 0;
|
||||
}
|
||||
WMT_INFO_FUNC("%s stp debug function\n", 0 == par2 ? "disable" : "enable");
|
||||
if (0 == par2)
|
||||
{
|
||||
mtk_wcn_stp_dbg_disable();
|
||||
}
|
||||
else if (1 == par2)
|
||||
{
|
||||
mtk_wcn_stp_dbg_enable();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_stp_dbg_log_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
mtk_wcn_stp_dbg_log_ctrl(0 != par2 ? 1 : 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
INT32 wmt_dbg_wmt_assert_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
mtk_wcn_stp_coredump_flag_ctrl(0 != par2 ? 1 : 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_dbg_coex_test(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
WMT_INFO_FUNC("coexistance test cmd!!\n");
|
||||
return wmt_dbg_cmd_test_api(par2 + WMTDRV_CMD_COEXDBG_00);
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_rst_ctrl(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
WMT_INFO_FUNC("%s audo rst\n", 0 == par2 ? "disable" : "enable");
|
||||
mtk_wcn_stp_set_auto_rst(0 == par2 ? 0 : 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static INT32 wmt_dev_dbg_read(CHAR *page, CHAR **start, off_t off, INT32 count, INT32 *eof, void *data){
|
||||
INT32 len = 0;
|
||||
|
||||
if(off > 0){
|
||||
len = 0;
|
||||
} else {
|
||||
/*len = sprintf(page, "%d\n", g_psm_enable);*/
|
||||
if ( gCoexBuf.availSize <= 0)
|
||||
{
|
||||
WMT_INFO_FUNC("no data available, please run echo 15 xx > /proc/driver/wmt_psm first\n");
|
||||
len = osal_sprintf(page, "no data available, please run echo 15 xx > /proc/driver/wmt_psm first\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
INT32 i = 0;
|
||||
/*we do not check page buffer, because there are only 100 bytes in g_coex_buf, no reason page buffer is not enough, a bomb is placed here on unexpected condition*/
|
||||
for (i = 0; i < gCoexBuf.availSize; i++)
|
||||
{
|
||||
len += osal_sprintf(page + len, "0x%02x ", gCoexBuf.buffer[i]);
|
||||
}
|
||||
len += osal_sprintf(page + len, "\n");
|
||||
}
|
||||
}
|
||||
gCoexBuf.availSize = 0;
|
||||
return len;
|
||||
}
|
||||
|
||||
INT32 wmt_dbg_ut_test(INT32 par1, INT32 par2, INT32 par3)
|
||||
{
|
||||
|
||||
INT32 i = 0;
|
||||
INT32 j = 0;
|
||||
INT32 iRet = 0;
|
||||
|
||||
i = 20;
|
||||
while((i--) > 0){
|
||||
WMT_INFO_FUNC("#### UT WMT and STP Function On/Off .... %d\n", i);
|
||||
j = 10;
|
||||
while((j--) > 0){
|
||||
WMT_INFO_FUNC("#### BT On .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_BT);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### GPS On .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_GPS);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### FM On .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_FM);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### WIFI On .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### BT Off .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_BT);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### GPS Off ....(%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_GPS);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### FM Off .... (%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_FM);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
WMT_INFO_FUNC("#### WIFI Off ....(%d, %d) \n", i, j);
|
||||
iRet = mtk_wcn_wmt_func_off(WMTDRV_TYPE_WIFI);
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(iRet == MTK_WCN_BOOL_FALSE){
|
||||
WMT_INFO_FUNC("#### UT FAIL!!\n");
|
||||
} else {
|
||||
WMT_INFO_FUNC("#### UT PASS!!\n");
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
static INT32 wmt_dev_dbg_write(struct file *file, const CHAR *buffer, ULONG count, void *data){
|
||||
|
||||
CHAR buf[256];
|
||||
CHAR *pBuf;
|
||||
ULONG len = count;
|
||||
INT32 x = 0,y = 0, z=0;
|
||||
CHAR *pToken = NULL;
|
||||
CHAR *pDelimiter = " \t";
|
||||
|
||||
WMT_INFO_FUNC("write parameter len = %d\n\r", (INT32)len);
|
||||
if(len >= osal_sizeof(buf)){
|
||||
WMT_ERR_FUNC("input handling fail!\n");
|
||||
len = osal_sizeof(buf) - 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(copy_from_user(buf, buffer, len)){
|
||||
return -EFAULT;
|
||||
}
|
||||
buf[len] = '\0';
|
||||
WMT_INFO_FUNC("write parameter data = %s\n\r", buf);
|
||||
|
||||
pBuf = buf;
|
||||
pToken = osal_strsep(&pBuf, pDelimiter);
|
||||
x = NULL != pToken ? osal_strtol(pToken, NULL, 16) : 0;
|
||||
|
||||
pToken = osal_strsep(&pBuf, "\t\n ");
|
||||
if(pToken != NULL){
|
||||
y = osal_strtol(pToken, NULL, 16);
|
||||
WMT_INFO_FUNC("y = 0x%08x \n\r", y);
|
||||
} else {
|
||||
y = 3000;
|
||||
/*efuse, register read write default value*/
|
||||
if(0x11 == x || 0x12 == x || 0x13 == x) {
|
||||
y = 0x80000000;
|
||||
}
|
||||
}
|
||||
|
||||
pToken = osal_strsep(&pBuf, "\t\n ");
|
||||
if(pToken != NULL){
|
||||
z = osal_strtol(pToken, NULL, 16);
|
||||
} else {
|
||||
z = 10;
|
||||
/*efuse, register read write default value*/
|
||||
if(0x11 == x || 0x12 == x || 0x13 == x) {
|
||||
z = 0xffffffff;
|
||||
}
|
||||
}
|
||||
|
||||
WMT_INFO_FUNC("x(0x%08x), y(0x%08x), z(0x%08x)\n\r", x, y, z);
|
||||
|
||||
if (osal_array_size(wmt_dev_dbg_func) > x && NULL != wmt_dev_dbg_func[x])
|
||||
{
|
||||
(*wmt_dev_dbg_func[x])(x, y, z);
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_WARN_FUNC("no handler defined for command id(0x%08x)\n\r", x);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
INT32 wmt_dev_dbg_setup(VOID)
|
||||
{
|
||||
gWmtDbgEntry = create_proc_entry(WMT_DBG_PROCNAME, 0664, NULL);
|
||||
if(gWmtDbgEntry == NULL){
|
||||
WMT_ERR_FUNC("Unable to create /proc entry\n\r");
|
||||
return -1;
|
||||
}
|
||||
gWmtDbgEntry->read_proc = wmt_dev_dbg_read;
|
||||
gWmtDbgEntry->write_proc = wmt_dev_dbg_write;
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 wmt_dev_dbg_remove(VOID)
|
||||
{
|
||||
if (NULL != gWmtDbgEntry)
|
||||
{
|
||||
remove_proc_entry(WMT_DBG_PROCNAME, NULL);
|
||||
}
|
||||
#if CFG_WMT_PS_SUPPORT
|
||||
wmt_lib_ps_deinit();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1,414 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-EXP]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "osal_typedef.h"
|
||||
|
||||
#include <wmt_exp.h>
|
||||
#include <wmt_lib.h>
|
||||
#include <hif_sdio.h>
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_ctrl (
|
||||
ENUM_WMTDRV_TYPE_T type,
|
||||
ENUM_WMT_OPID_T opId
|
||||
);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_ctrl (
|
||||
ENUM_WMTDRV_TYPE_T type,
|
||||
ENUM_WMT_OPID_T opId
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp;
|
||||
MTK_WCN_BOOL bRet;
|
||||
P_OSAL_SIGNAL pSignal;
|
||||
|
||||
pOp = wmt_lib_get_free_op();
|
||||
if (!pOp) {
|
||||
WMT_WARN_FUNC("get_free_lxop fail\n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pSignal = &pOp->signal;
|
||||
|
||||
pOp->op.opId = opId;
|
||||
pOp->op.au4OpData[0] = type;
|
||||
pSignal->timeoutValue= (WMT_OPID_FUNC_ON == pOp->op.opId) ? MAX_FUNC_ON_TIME : MAX_FUNC_OFF_TIME;
|
||||
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) start\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0]);
|
||||
|
||||
/*do not check return value, we will do this either way*/
|
||||
wmt_lib_host_awake_get();
|
||||
/*wake up chip first*/
|
||||
if (DISABLE_PSM_MONITOR()) {
|
||||
WMT_ERR_FUNC("wake up failed\n");
|
||||
wmt_lib_put_op_to_free_queue(pOp);
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
bRet = wmt_lib_put_act_op(pOp);
|
||||
ENABLE_PSM_MONITOR();
|
||||
wmt_lib_host_awake_put();
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == bRet) {
|
||||
WMT_WARN_FUNC("OPID(%d) type(%d) fail\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0]);
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) ok\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0]);
|
||||
}
|
||||
return bRet;
|
||||
}
|
||||
|
||||
MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_off (
|
||||
ENUM_WMTDRV_TYPE_T type
|
||||
)
|
||||
{
|
||||
MTK_WCN_BOOL ret;
|
||||
|
||||
if(type == WMTDRV_TYPE_BT)
|
||||
{
|
||||
osal_printtimeofday("############ BT OFF ====>");
|
||||
}
|
||||
|
||||
ret = mtk_wcn_wmt_func_ctrl(type, WMT_OPID_FUNC_OFF);
|
||||
|
||||
if(type == WMTDRV_TYPE_BT)
|
||||
{
|
||||
osal_printtimeofday("############ BT OFF <====");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_on (
|
||||
ENUM_WMTDRV_TYPE_T type
|
||||
)
|
||||
{
|
||||
MTK_WCN_BOOL ret;
|
||||
|
||||
if(type == WMTDRV_TYPE_BT)
|
||||
{
|
||||
osal_printtimeofday("############ BT ON ====>");
|
||||
}
|
||||
|
||||
ret = mtk_wcn_wmt_func_ctrl(type, WMT_OPID_FUNC_ON);
|
||||
|
||||
if(type == WMTDRV_TYPE_BT)
|
||||
{
|
||||
osal_printtimeofday(" ############BT ON <====");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
return value:
|
||||
enable/disable thermal sensor function: true(1)/false(0)
|
||||
read thermal sensor function:thermal value
|
||||
|
||||
*/
|
||||
INT8
|
||||
mtk_wcn_wmt_therm_ctrl (
|
||||
ENUM_WMTTHERM_TYPE_T eType
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp;
|
||||
P_WMT_OP pOpData;
|
||||
MTK_WCN_BOOL bRet;
|
||||
P_OSAL_SIGNAL pSignal;
|
||||
|
||||
/*parameter validation check*/
|
||||
if( WMTTHERM_MAX < eType || WMTTHERM_ENABLE > eType){
|
||||
WMT_ERR_FUNC("invalid thermal control command (%d)\n", eType);
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
/*check if chip support thermal control function or not*/
|
||||
bRet = wmt_lib_is_therm_ctrl_support();
|
||||
if (MTK_WCN_BOOL_FALSE == bRet) {
|
||||
WMT_ERR_FUNC("thermal ctrl function not supported\n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pOp = wmt_lib_get_free_op();
|
||||
if (!pOp) {
|
||||
WMT_WARN_FUNC("get_free_lxop fail \n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pSignal = &pOp->signal;
|
||||
pOpData = &pOp->op;
|
||||
pOpData->opId = WMT_OPID_THERM_CTRL;
|
||||
/*parameter fill*/
|
||||
pOpData->au4OpData[0] = eType;
|
||||
pSignal->timeoutValue = MAX_EACH_WMT_CMD;
|
||||
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) start\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0]);
|
||||
|
||||
if (DISABLE_PSM_MONITOR()) {
|
||||
WMT_ERR_FUNC("wake up failed\n");
|
||||
wmt_lib_put_op_to_free_queue(pOp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bRet = wmt_lib_put_act_op(pOp);
|
||||
ENABLE_PSM_MONITOR();
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == bRet) {
|
||||
WMT_WARN_FUNC("OPID(%d) type(%d) fail\n\n",
|
||||
pOpData->opId,
|
||||
pOpData->au4OpData[0]);
|
||||
/*0xFF means read error occurs*/
|
||||
pOpData->au4OpData[1] = (eType == WMTTHERM_READ) ? 0xFF : MTK_WCN_BOOL_FALSE;/*will return to function driver*/
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) return(%d) ok\n\n",
|
||||
pOpData->opId,
|
||||
pOpData->au4OpData[0],
|
||||
pOpData->au4OpData[1]);
|
||||
}
|
||||
/*return value will be put to lxop->op.au4OpData[1]*/
|
||||
WMT_DBG_FUNC("therm ctrl type(%d), iRet(0x%08x) \n", eType, pOpData->au4OpData[1]);
|
||||
return (INT8)pOpData->au4OpData[1];
|
||||
}
|
||||
|
||||
ENUM_WMTHWVER_TYPE_T
|
||||
mtk_wcn_wmt_hwver_get (VOID)
|
||||
{
|
||||
// TODO: [ChangeFeature][GeorgeKuo] Reconsider usage of this type
|
||||
// TODO: how do we extend for new chip and newer revision?
|
||||
// TODO: This way is hard to extend
|
||||
return wmt_lib_get_icinfo(WMTCHIN_MAPPINGHWVER);
|
||||
}
|
||||
|
||||
MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_dsns_ctrl (
|
||||
ENUM_WMTDSNS_TYPE_T eType
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp;
|
||||
P_WMT_OP pOpData;
|
||||
MTK_WCN_BOOL bRet;
|
||||
P_OSAL_SIGNAL pSignal;
|
||||
|
||||
if (WMTDSNS_MAX <= eType) {
|
||||
WMT_ERR_FUNC("invalid desense control command (%d)\n", eType);
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
/*check if chip support thermal control function or not*/
|
||||
bRet = wmt_lib_is_dsns_ctrl_support();
|
||||
if (MTK_WCN_BOOL_FALSE == bRet) {
|
||||
WMT_ERR_FUNC("thermal ctrl function not supported\n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pOp = wmt_lib_get_free_op();
|
||||
if (!pOp) {
|
||||
WMT_WARN_FUNC("get_free_lxop fail \n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pSignal = &pOp->signal;
|
||||
pOpData = &pOp->op;
|
||||
pOpData->opId = WMT_OPID_DSNS;
|
||||
pSignal->timeoutValue = MAX_EACH_WMT_CMD;
|
||||
/*parameter fill*/
|
||||
if ((WMTDSNS_FM_DISABLE <= eType) && (WMTDSNS_FM_GPS_ENABLE >= eType)) {
|
||||
pOpData->au4OpData[0] = WMTDRV_TYPE_FM;
|
||||
pOpData->au4OpData[1] = eType;
|
||||
}
|
||||
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) start\n",
|
||||
pOp->op.opId,
|
||||
pOp->op.au4OpData[0]);
|
||||
|
||||
if (DISABLE_PSM_MONITOR()) {
|
||||
WMT_ERR_FUNC("wake up failed\n");
|
||||
wmt_lib_put_op_to_free_queue(pOp);
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
bRet = wmt_lib_put_act_op(pOp);
|
||||
ENABLE_PSM_MONITOR();
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == bRet) {
|
||||
WMT_WARN_FUNC("OPID(%d) type(%d) fail\n\n",
|
||||
pOpData->opId,
|
||||
pOpData->au4OpData[0]);
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("OPID(%d) type(%d) ok\n\n",
|
||||
pOpData->opId,
|
||||
pOpData->au4OpData[0]);
|
||||
}
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_wmt_msgcb_reg (
|
||||
ENUM_WMTDRV_TYPE_T eType,
|
||||
PF_WMT_CB pCb
|
||||
)
|
||||
{
|
||||
return (INT32)wmt_lib_msgcb_reg(eType, pCb);
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_wmt_msgcb_unreg (
|
||||
ENUM_WMTDRV_TYPE_T eType
|
||||
)
|
||||
{
|
||||
return (INT32)wmt_lib_msgcb_unreg(eType);
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_stp_wmt_sdio_op_reg (
|
||||
PF_WMT_SDIO_PSOP own_cb
|
||||
)
|
||||
{
|
||||
wmt_lib_ps_set_sdio_psop(own_cb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32
|
||||
mtk_wcn_stp_wmt_sdio_host_awake(
|
||||
VOID
|
||||
)
|
||||
{
|
||||
wmt_lib_ps_irq_cb();
|
||||
return 0;
|
||||
}
|
||||
|
||||
MTK_WCN_BOOL mtk_wcn_wmt_assert (
|
||||
void
|
||||
)
|
||||
{
|
||||
P_OSAL_OP pOp = NULL;
|
||||
MTK_WCN_BOOL bRet = MTK_WCN_BOOL_FALSE;
|
||||
P_OSAL_SIGNAL pSignal;
|
||||
|
||||
pOp = wmt_lib_get_free_op();
|
||||
if (!pOp ) {
|
||||
WMT_WARN_FUNC("get_free_lxop fail\n");
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
pSignal = &pOp ->signal;
|
||||
|
||||
pOp ->op.opId = WMT_OPID_CMD_TEST;
|
||||
|
||||
pSignal->timeoutValue= MAX_EACH_WMT_CMD;
|
||||
/*this test command should be run with usb cable connected, so no host awake is needed*/
|
||||
//wmt_lib_host_awake_get();
|
||||
pOp->op.au4OpData[0] = 0;
|
||||
|
||||
/*wake up chip first*/
|
||||
if (DISABLE_PSM_MONITOR()) {
|
||||
WMT_ERR_FUNC("wake up failed\n");
|
||||
wmt_lib_put_op_to_free_queue(pOp);
|
||||
return MTK_WCN_BOOL_FALSE;
|
||||
}
|
||||
|
||||
bRet = wmt_lib_put_act_op(pOp);
|
||||
ENABLE_PSM_MONITOR();
|
||||
|
||||
//wmt_lib_host_awake_put();
|
||||
WMT_INFO_FUNC("CMD_TEST, opid (%d), par(%d, %d), ret(%d), result(%s)\n", \
|
||||
pOp->op.opId, \
|
||||
pOp->op.au4OpData[0], \
|
||||
pOp->op.au4OpData[1], \
|
||||
bRet, \
|
||||
MTK_WCN_BOOL_FALSE == bRet ? "failed" : "succeed"\
|
||||
);
|
||||
|
||||
return bRet;
|
||||
}
|
||||
|
||||
extern INT32 mtk_wcn_wmt_chipid_query (VOID)
|
||||
{
|
||||
return mtk_wcn_hif_sdio_query_chipid(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_assert);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_wmt_sdio_host_awake);
|
||||
EXPORT_SYMBOL(mtk_wcn_stp_wmt_sdio_op_reg);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_msgcb_unreg);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_msgcb_reg);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_dsns_ctrl);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_hwver_get);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_therm_ctrl);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_func_on);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_func_off);
|
||||
EXPORT_SYMBOL(mtk_wcn_wmt_chipid_query);
|
||||
|
||||
|
||||
@@ -1,510 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-FUNC]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "osal_typedef.h"
|
||||
|
||||
#include "wmt_func.h"
|
||||
#include "wmt_lib.h"
|
||||
#include "wmt_core.h"
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
#if CFG_FUNC_BT_SUPPORT
|
||||
|
||||
static INT32 wmt_func_bt_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
static INT32 wmt_func_bt_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
|
||||
WMT_FUNC_OPS wmt_func_bt_ops = {
|
||||
//BT subsystem function on/off
|
||||
.func_on = wmt_func_bt_on,
|
||||
.func_off = wmt_func_bt_off
|
||||
};
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_FM_SUPPORT
|
||||
|
||||
static INT32 wmt_func_fm_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
static INT32 wmt_func_fm_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
|
||||
WMT_FUNC_OPS wmt_func_fm_ops = {
|
||||
//FM subsystem function on/off
|
||||
.func_on = wmt_func_fm_on,
|
||||
.func_off = wmt_func_fm_off
|
||||
};
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_GPS_SUPPORT
|
||||
|
||||
static INT32 wmt_func_gps_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
static INT32 wmt_func_gps_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
|
||||
WMT_FUNC_OPS wmt_func_gps_ops = {
|
||||
//GPS subsystem function on/off
|
||||
.func_on = wmt_func_gps_on,
|
||||
.func_off = wmt_func_gps_off
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_WIFI_SUPPORT
|
||||
static INT32 wmt_func_wifi_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
static INT32 wmt_func_wifi_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf);
|
||||
|
||||
WMT_FUNC_OPS wmt_func_wifi_ops = {
|
||||
//Wi-Fi subsystem function on/off
|
||||
.func_on = wmt_func_wifi_on,
|
||||
.func_off = wmt_func_wifi_off
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
#if CFG_FUNC_GPS_SUPPORT
|
||||
CMB_PIN_CTRL_REG eediPinOhRegs[] = {
|
||||
{
|
||||
//pull down ctrl register
|
||||
.regAddr = 0x80050020,
|
||||
.regValue = ~(0x1UL << 5),
|
||||
.regMask = 0x00000020UL,
|
||||
},
|
||||
{
|
||||
//pull up ctrl register
|
||||
.regAddr = 0x80050000,
|
||||
.regValue = 0x1UL << 5,
|
||||
.regMask = 0x00000020UL,
|
||||
},
|
||||
{
|
||||
//iomode ctrl register
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x1UL << 0,
|
||||
.regMask = 0x00000007UL,
|
||||
},
|
||||
{
|
||||
//output high/low ctrl register
|
||||
.regAddr = 0x80050040,
|
||||
.regValue = 0x1UL << 5,
|
||||
.regMask = 0x00000020UL,
|
||||
}
|
||||
|
||||
};
|
||||
CMB_PIN_CTRL_REG eediPinOlRegs[] = {
|
||||
{
|
||||
.regAddr = 0x80050020,
|
||||
.regValue = 0x1UL << 5,
|
||||
.regMask = 0x00000020UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050000,
|
||||
.regValue = ~(0x1UL << 5),
|
||||
.regMask = 0x00000020UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x1UL << 0,
|
||||
.regMask = 0x00000007UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050040,
|
||||
.regValue = ~(0x1UL << 5),
|
||||
.regMask = 0x00000020UL,
|
||||
}
|
||||
};
|
||||
|
||||
CMB_PIN_CTRL_REG eedoPinOhRegs[] =
|
||||
{
|
||||
{
|
||||
.regAddr = 0x80050020,
|
||||
.regValue = ~(0x1UL << 7),
|
||||
.regMask = 0x00000080UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050000,
|
||||
.regValue = 0x1UL << 7,
|
||||
.regMask = 0x00000080UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x1UL << 12,
|
||||
.regMask = 0x00007000UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050040,
|
||||
.regValue = 0x1UL << 7,
|
||||
.regMask = 0x00000080UL,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
CMB_PIN_CTRL_REG eedoPinOlRegs[] =
|
||||
{
|
||||
{
|
||||
.regAddr = 0x80050020,
|
||||
.regValue = 0x1UL << 7,
|
||||
.regMask = 0x00000080UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050000,
|
||||
.regValue = ~(0x1UL << 7),
|
||||
.regMask = 0x00000080UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x1UL << 12,
|
||||
.regMask = 0x00007000UL,
|
||||
},
|
||||
{
|
||||
.regAddr = 0x80050040,
|
||||
.regValue = ~(0x1UL << 7),
|
||||
.regMask = 0x00000080UL,
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CMB_PIN_CTRL_REG gsyncPinOnRegs[] =
|
||||
{
|
||||
{
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x3UL << 20,
|
||||
.regMask = 0x7UL << 20,
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
CMB_PIN_CTRL_REG gsyncPinOffRegs[] =
|
||||
{
|
||||
{
|
||||
.regAddr = 0x80050110,
|
||||
.regValue = 0x0UL << 20,
|
||||
.regMask = 0x7UL << 20,
|
||||
}
|
||||
};
|
||||
|
||||
//templete usage for GPIO control
|
||||
CMB_PIN_CTRL gCmbPinCtrl[3] =
|
||||
{
|
||||
{
|
||||
.pinId = CMB_PIN_EEDI_ID,
|
||||
.regNum = 4,
|
||||
.pFuncOnArray = eediPinOhRegs,
|
||||
.pFuncOffArray = eediPinOlRegs,
|
||||
},
|
||||
{
|
||||
.pinId = CMB_PIN_EEDO_ID,
|
||||
.regNum = 4,
|
||||
.pFuncOnArray = eedoPinOhRegs,
|
||||
.pFuncOffArray = eedoPinOlRegs,
|
||||
},
|
||||
{
|
||||
.pinId = CMB_PIN_GSYNC_ID,
|
||||
.regNum = 1,
|
||||
.pFuncOnArray = gsyncPinOnRegs,
|
||||
.pFuncOffArray = gsyncPinOffRegs,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#if CFG_FUNC_BT_SUPPORT
|
||||
|
||||
INT32 _osal_inline_ wmt_func_bt_ctrl(ENUM_FUNC_STATE funcState)
|
||||
{
|
||||
/*only need to send turn BT subsystem wmt command*/
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, (FUNC_ON == funcState) ? MTK_WCN_BOOL_TRUE : MTK_WCN_BOOL_FALSE);
|
||||
}
|
||||
|
||||
INT32 wmt_func_bt_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
//return wmt_func_bt_ctrl(FUNC_ON);
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, MTK_WCN_BOOL_TRUE);
|
||||
}
|
||||
|
||||
INT32 wmt_func_bt_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
//return wmt_func_bt_ctrl(FUNC_OFF);
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT, MTK_WCN_BOOL_FALSE);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_GPS_SUPPORT
|
||||
|
||||
INT32 _osal_inline_ wmt_func_gps_ctrl (ENUM_FUNC_STATE funcState)
|
||||
{
|
||||
/*send turn GPS subsystem wmt command*/
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_GPS, (FUNC_ON == funcState) ? MTK_WCN_BOOL_TRUE : MTK_WCN_BOOL_FALSE);
|
||||
}
|
||||
|
||||
INT32 wmt_func_gps_pre_ctrl(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf, ENUM_FUNC_STATE funcStatus)
|
||||
{
|
||||
UINT32 i = 0;
|
||||
UINT32 iRet =0;
|
||||
UINT32 regAddr = 0;
|
||||
UINT32 regValue = 0;
|
||||
UINT32 regMask = 0;
|
||||
UINT32 regNum = 0;
|
||||
P_CMB_PIN_CTRL_REG pReg;
|
||||
P_CMB_PIN_CTRL pCmbPinCtrl;
|
||||
WMT_CTRL_DATA ctrlData;
|
||||
WMT_IC_PIN_ID wmtIcPinId = WMT_IC_PIN_MAX;
|
||||
//sanity check
|
||||
if (FUNC_ON != funcStatus && FUNC_OFF != funcStatus)
|
||||
{
|
||||
WMT_ERR_FUNC("invalid funcStatus(%d)\n", funcStatus);
|
||||
return -1;
|
||||
}
|
||||
|
||||
//turn on GPS sync function on both side
|
||||
ctrlData.ctrlId = WMT_CTRL_GPS_SYNC_SET;
|
||||
ctrlData.au4CtrlData[0] = (FUNC_ON == funcStatus) ? 1 : 0;
|
||||
iRet = wmt_ctrl(&ctrlData) ;
|
||||
if (iRet) {
|
||||
/*we suppose this would never print*/
|
||||
WMT_ERR_FUNC("ctrl GPS_SYNC_SET(%d) fail, ret(%d)\n", funcStatus, iRet);
|
||||
// TODO:[FixMe][George] error handling?
|
||||
return -2;
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("ctrl GPS_SYNC_SET(%d) ok \n", funcStatus);
|
||||
}
|
||||
if((NULL == pOps->ic_pin_ctrl) ||
|
||||
(0 > pOps->ic_pin_ctrl(
|
||||
WMT_IC_PIN_GSYNC,
|
||||
FUNC_ON == funcStatus ? WMT_IC_PIN_MUX : WMT_IC_PIN_GPIO,
|
||||
1)))/*WMT_IC_PIN_GSYNC*/
|
||||
{
|
||||
pCmbPinCtrl = &gCmbPinCtrl[CMB_PIN_GSYNC_ID];
|
||||
regNum = pCmbPinCtrl->regNum;
|
||||
for (i = 0; i < regNum; i++)
|
||||
{
|
||||
pReg = FUNC_ON == funcStatus ? &pCmbPinCtrl->pFuncOnArray[i] : &pCmbPinCtrl->pFuncOffArray[i];
|
||||
regAddr = pReg->regAddr;
|
||||
regValue = pReg->regValue;
|
||||
regMask = pReg->regMask;
|
||||
|
||||
iRet = wmt_core_reg_rw_raw(1, regAddr, ®Value, regMask);
|
||||
if (iRet) {
|
||||
WMT_ERR_FUNC("set reg for GPS_SYNC function fail(%d) \n", iRet);
|
||||
//TODO:[FixMe][Chaozhong] error handling?
|
||||
return -2;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("set reg for GPS_SYNC function okay by chip ic_pin_ctrl\n");
|
||||
}
|
||||
WMT_INFO_FUNC("ctrl combo chip gps sync function succeed\n");
|
||||
//turn on GPS lna ctrl function
|
||||
if (NULL != pConf)
|
||||
{
|
||||
if (0 == pConf->wmt_gps_lna_enable)
|
||||
{
|
||||
|
||||
WMT_INFO_FUNC("host pin used for gps lna\n");
|
||||
//host LNA ctrl pin needed
|
||||
ctrlData.ctrlId = WMT_CTRL_GPS_LNA_SET;
|
||||
ctrlData.au4CtrlData[0] = FUNC_ON == funcStatus ? 1 : 0 ;
|
||||
iRet = wmt_ctrl(&ctrlData) ;
|
||||
if (iRet) {
|
||||
/*we suppose this would never print*/
|
||||
WMT_ERR_FUNC("ctrl host GPS_LNA output high fail, ret(%d)\n", iRet);
|
||||
// TODO:[FixMe][Chaozhong] error handling?
|
||||
return -3;
|
||||
}
|
||||
else {
|
||||
WMT_INFO_FUNC("ctrl host gps lna function succeed\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("combo chip pin(%s) used for gps lna\n", 0 == pConf->wmt_gps_lna_pin ? "EEDI" : "EEDO");
|
||||
wmtIcPinId = 0 == pConf->wmt_gps_lna_pin ? WMT_IC_PIN_EEDI: WMT_IC_PIN_EEDO;
|
||||
if((NULL == pOps->ic_pin_ctrl) ||
|
||||
(0 > pOps->ic_pin_ctrl(
|
||||
wmtIcPinId,
|
||||
FUNC_ON == funcStatus ? WMT_IC_PIN_GPIO_HIGH : WMT_IC_PIN_GPIO_LOW,
|
||||
1)))/*WMT_IC_PIN_GSYNC*/
|
||||
{
|
||||
if (0 == pConf->wmt_gps_lna_pin)
|
||||
{
|
||||
//EEDI needed
|
||||
pCmbPinCtrl = &gCmbPinCtrl[CMB_PIN_EEDI_ID];
|
||||
}
|
||||
else if (1 == pConf->wmt_gps_lna_pin)
|
||||
{
|
||||
//EEDO needed
|
||||
pCmbPinCtrl = &gCmbPinCtrl[CMB_PIN_EEDO_ID];
|
||||
}
|
||||
regNum = pCmbPinCtrl->regNum;
|
||||
for (i = 0; i < regNum; i++)
|
||||
{
|
||||
pReg = FUNC_ON == funcStatus ? &pCmbPinCtrl->pFuncOnArray[i] : &pCmbPinCtrl->pFuncOffArray[i];
|
||||
regAddr = pReg->regAddr;
|
||||
regValue = pReg->regValue;
|
||||
regMask = pReg->regMask;
|
||||
|
||||
iRet = wmt_core_reg_rw_raw(1, regAddr, ®Value, regMask);
|
||||
if (iRet) {
|
||||
WMT_ERR_FUNC("set reg for GPS_LNA function fail(%d) \n", iRet);
|
||||
//TODO:[FixMe][Chaozhong] error handling?
|
||||
return -3;
|
||||
}
|
||||
}
|
||||
WMT_INFO_FUNC("ctrl combo chip gps lna succeed\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
WMT_INFO_FUNC("set reg for GPS_LNA function okay by chip ic_pin_ctrl\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
INT32 wmt_func_gps_pre_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
return wmt_func_gps_pre_ctrl(pOps, pConf, FUNC_ON);
|
||||
}
|
||||
|
||||
INT32 wmt_func_gps_pre_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
|
||||
return wmt_func_gps_pre_ctrl(pOps, pConf, FUNC_OFF);
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_func_gps_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
iRet = wmt_func_gps_pre_on(pOps, pConf);
|
||||
if (0 == iRet)
|
||||
{
|
||||
iRet = wmt_func_gps_ctrl(FUNC_ON);
|
||||
}
|
||||
return iRet;
|
||||
}
|
||||
|
||||
INT32 wmt_func_gps_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
iRet = wmt_func_gps_pre_off(pOps, pConf);
|
||||
if (0 == iRet)
|
||||
{
|
||||
iRet = wmt_func_gps_ctrl(FUNC_OFF);
|
||||
}
|
||||
return iRet;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_FM_SUPPORT
|
||||
|
||||
INT32 _osal_inline_ wmt_func_fm_ctrl(ENUM_FUNC_STATE funcState)
|
||||
{
|
||||
/*only need to send turn FM subsystem wmt command*/
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_FM, (FUNC_ON == funcState) ? MTK_WCN_BOOL_TRUE : MTK_WCN_BOOL_FALSE);
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_func_fm_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
//return wmt_func_fm_ctrl(FUNC_ON);
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_FM, MTK_WCN_BOOL_TRUE);
|
||||
}
|
||||
|
||||
INT32 wmt_func_fm_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
//return wmt_func_fm_ctrl(FUNC_OFF);
|
||||
return wmt_core_func_ctrl_cmd(WMTDRV_TYPE_FM, MTK_WCN_BOOL_FALSE);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if CFG_FUNC_WIFI_SUPPORT
|
||||
|
||||
INT32
|
||||
wmt_func_wifi_ctrl (
|
||||
ENUM_FUNC_STATE funcState
|
||||
)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
UINT32 ctrlPa1 = WMT_SDIO_FUNC_WIFI;
|
||||
UINT32 ctrlPa2 = (FUNC_ON == funcState) ? 1 : 0; /* turn on Wi-Fi driver */
|
||||
iRet = wmt_core_ctrl(WMT_CTRL_SDIO_FUNC, &ctrlPa1, &ctrlPa2) ;
|
||||
if (iRet) {
|
||||
WMT_ERR_FUNC("WMT-FUNC: turn on WIFI function fail (%d)", iRet);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_func_wifi_on(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
return wmt_func_wifi_ctrl(FUNC_ON);
|
||||
}
|
||||
|
||||
INT32 wmt_func_wifi_off(P_WMT_IC_OPS pOps, P_WMT_GEN_CONF pConf)
|
||||
{
|
||||
return wmt_func_wifi_ctrl(FUNC_OFF);
|
||||
}
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,90 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _MTK_WCN_CMB_HW_H_
|
||||
#define _MTK_WCN_CMB_HW_H_
|
||||
|
||||
#include "osal_typedef.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef struct _PWR_SEQ_TIME_
|
||||
{
|
||||
UINT32 rtcStableTime;
|
||||
UINT32 ldoStableTime;
|
||||
UINT32 rstStableTime;
|
||||
UINT32 offStableTime;
|
||||
UINT32 onStableTime;
|
||||
}PWR_SEQ_TIME, *P_PWR_SEQ_TIME;
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern INT32 mtk_wcn_cmb_hw_pwr_off (VOID);
|
||||
extern INT32 mtk_wcn_cmb_hw_pwr_on (VOID);
|
||||
extern INT32 mtk_wcn_cmb_hw_rst (VOID);
|
||||
extern INT32 mtk_wcn_cmb_hw_init (P_PWR_SEQ_TIME pPwrSeqTime);
|
||||
extern INT32 mtk_wcn_cmb_hw_deinit (VOID);
|
||||
extern INT32 mtk_wcn_cmb_hw_state_show(VOID);
|
||||
|
||||
|
||||
#endif /* _MTK_WCN_CMB_HW_H_ */
|
||||
|
||||
@@ -1,227 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _STP_EXP_H_
|
||||
#define _STP_EXP_H_
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define BT_TASK_INDX (0)
|
||||
#define FM_TASK_INDX (1)
|
||||
#define GPS_TASK_INDX (2)
|
||||
#define WIFI_TASK_INDX (3)
|
||||
#define WMT_TASK_INDX (4)
|
||||
#define STP_TASK_INDX (5)
|
||||
#define INFO_TASK_INDX (6)
|
||||
#define MTKSTP_MAX_TASK_NUM (7)
|
||||
|
||||
#define MTKSTP_BUFFER_SIZE (16384) //Size of RX Queue
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef void (*MTK_WCN_STP_EVENT_CB)(void);
|
||||
typedef INT32 (*MTK_WCN_STP_IF_TX)(const UINT8 *data, const UINT32 size, UINT32 *written_size);
|
||||
/* export for HIF driver */
|
||||
typedef void (*MTK_WCN_STP_IF_RX)(const UINT8 *data, INT32 size);
|
||||
|
||||
typedef enum {
|
||||
STP_UART_IF_TX = 0,
|
||||
STP_SDIO_IF_TX,
|
||||
STP_MAX_IF_TX
|
||||
}ENUM_STP_TX_IF_TYPE;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_receive_data
|
||||
* DESCRIPTION
|
||||
* receive data from serial protocol engine
|
||||
* PARAMETERS
|
||||
* buffer [IN] data buffer
|
||||
* length [IN] data buffer length
|
||||
* RETURNS
|
||||
* INT32 >= 0: size of data received; < 0: error
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_receive_data(UINT8 *buffer, UINT32 length, UINT8 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_send_data
|
||||
* DESCRIPTION
|
||||
* subfunction send data through STP
|
||||
* PARAMETERS
|
||||
* buffer [IN] data buffer
|
||||
* length [IN] data buffer length
|
||||
* type [IN] subfunction type
|
||||
* RETURNS
|
||||
* INT32 >= 0: length transmitted; < 0: error
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_send_data(const UINT8 *buffer, const UINT32 length, const UINT8 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_is_rxqueue_empty
|
||||
* DESCRIPTION
|
||||
* Is certain rx queue empty?
|
||||
* PARAMETERS
|
||||
* type [IN] subfunction type
|
||||
* RETURNS
|
||||
* INT32 0: queue is NOT empyt; !0: queue is empty
|
||||
*****************************************************************************/
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_is_rxqueue_empty(UINT8 type);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_is_enable
|
||||
* DESCRIPTION
|
||||
* Is STP ready?
|
||||
* PARAMETERS
|
||||
* none.
|
||||
* RETURNS
|
||||
* MTK_WCN_BOOL TRUE:ready, FALSE:not ready
|
||||
*****************************************************************************/
|
||||
extern MTK_WCN_BOOL mtk_wcn_stp_is_ready(void);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_parser_data
|
||||
* DESCRIPTION
|
||||
* push data to serial transport protocol parser engine
|
||||
* PARAMETERS
|
||||
* buffer [IN] data buffer
|
||||
* length [IN] data buffer length
|
||||
* RETURNS
|
||||
* void
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_parser_data(UINT8 *buffer, UINT32 length);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* set_bluetooth_rx_interface
|
||||
* DESCRIPTION
|
||||
* Set bluetooth rx interface
|
||||
* PARAMETERS
|
||||
* rx interface type
|
||||
* RETURNS
|
||||
* void
|
||||
*****************************************************************************/
|
||||
extern void mtk_wcn_stp_set_bluez(MTK_WCN_BOOL sdio_flag);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_register_tx_event_cb
|
||||
* DESCRIPTION
|
||||
* regiter Tx event callback function
|
||||
* PARAMETERS
|
||||
* func
|
||||
* RETURNS
|
||||
* INT32: 0:successful , -1: fail
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_register_tx_event_cb(INT32 type, MTK_WCN_STP_EVENT_CB func);
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_register_event_cb
|
||||
* DESCRIPTION
|
||||
* regiter Rx event callback function
|
||||
* PARAMETERS
|
||||
* func
|
||||
* RETURNS
|
||||
* INT32: 0:successful , -1: fail
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_register_event_cb(INT32 type, MTK_WCN_STP_EVENT_CB func);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_register_if_tx
|
||||
* DESCRIPTION
|
||||
* regiter Tx event callback function
|
||||
* PARAMETERS
|
||||
* stp_if: SDIO or UART, fnnc: Call back function
|
||||
* RETURNS
|
||||
* INT32: 0:successful , -1: fail
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_register_if_tx(ENUM_STP_TX_IF_TYPE stp_if, MTK_WCN_STP_IF_TX func);
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* FUNCTION
|
||||
* mtk_wcn_stp_register_if_rx
|
||||
* DESCRIPTION
|
||||
* regiter Rx event callback function
|
||||
* PARAMETERS
|
||||
* stp_if: SDIO or UART, fnnc: Call back function
|
||||
* RETURNS
|
||||
* INT32: 0:successful , -1: fail
|
||||
*****************************************************************************/
|
||||
extern INT32 mtk_wcn_stp_register_if_rx(MTK_WCN_STP_IF_RX func);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _WMT_EXP_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
#ifndef _MTKWMT_H_
|
||||
#define _MTKWMT_H_
|
||||
#include "wmt_core.h"
|
||||
|
||||
|
||||
|
||||
#endif /*_MTKWMT_H_*/
|
||||
@@ -1,257 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_EXP_H_
|
||||
#define _WMT_EXP_H_
|
||||
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
#include "osal.h"
|
||||
//not to reference to internal wmt
|
||||
//#include "wmt_core.h"
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if 1 /* moved from wmt_lib.h */
|
||||
#ifndef DFT_TAG
|
||||
#define DFT_TAG "[WMT-DFT]"
|
||||
#endif
|
||||
|
||||
#define WMT_LOUD_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_LOUD) { osal_dbg_print(DFT_TAG "[L]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_INFO_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_INFO) { osal_info_print(DFT_TAG "[I]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_WARN_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_WARN) { osal_warn_print(DFT_TAG "[W]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_ERR_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_ERR) { osal_err_print(DFT_TAG "[E]%s(%d):" fmt, __FUNCTION__ , __LINE__, ##arg);}
|
||||
#define WMT_DBG_FUNC(fmt, arg...) if (gWmtDbgLvl >= WMT_LOG_DBG) { osal_dbg_print(DFT_TAG "[D]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define WMT_TRC_FUNC(f) if (gWmtDbgLvl >= WMT_LOG_DBG) { osal_dbg_print(DFT_TAG "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if 1 /* moved from wmt_lib.h */
|
||||
extern UINT32 gWmtDbgLvl ;
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
#if 1 /* moved from wmt_lib.h */
|
||||
#define WMT_LOG_LOUD 4
|
||||
#define WMT_LOG_DBG 3
|
||||
#define WMT_LOG_INFO 2
|
||||
#define WMT_LOG_WARN 1
|
||||
#define WMT_LOG_ERR 0
|
||||
#endif
|
||||
|
||||
#define CFG_WMT_PS_SUPPORT 1 /* moved from wmt_lib.h */
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef enum _ENUM_WMTDRV_TYPE_T {
|
||||
WMTDRV_TYPE_BT = 0,
|
||||
WMTDRV_TYPE_FM = 1,
|
||||
WMTDRV_TYPE_GPS = 2,
|
||||
WMTDRV_TYPE_WIFI = 3,
|
||||
WMTDRV_TYPE_WMT = 4,
|
||||
WMTDRV_TYPE_STP = 5,
|
||||
WMTDRV_TYPE_SDIO1 = 6,
|
||||
WMTDRV_TYPE_SDIO2 = 7,
|
||||
WMTDRV_TYPE_LPBK = 8,
|
||||
WMTDRV_TYPE_COREDUMP = 9,
|
||||
WMTDRV_TYPE_MAX
|
||||
} ENUM_WMTDRV_TYPE_T, *P_ENUM_WMTDRV_TYPE_T;
|
||||
|
||||
// TODO: [ChangeFeature][GeorgeKuo] Reconsider usage of this type
|
||||
// TODO: how do we extend for new chip and newer revision?
|
||||
// TODO: This way is hard to extend
|
||||
typedef enum _ENUM_WMTHWVER_TYPE_T{
|
||||
WMTHWVER_MT6620_E1 = 0x0,
|
||||
WMTHWVER_MT6620_E2 = 0x1,
|
||||
WMTHWVER_MT6620_E3 = 0x2,
|
||||
WMTHWVER_MT6620_E4 = 0x3,
|
||||
WMTHWVER_MT6620_E5 = 0x4,
|
||||
WMTHWVER_MT6620_E6 = 0x5,
|
||||
WMTHWVER_MT6620_E7 = 0x6,
|
||||
WMTHWVER_MT6620_MAX,
|
||||
WMTHWVER_INVALID = 0xff
|
||||
} ENUM_WMTHWVER_TYPE_T, *P_ENUM_WMTHWVER_TYPE_T;
|
||||
|
||||
typedef enum _ENUM_WMTCHIN_TYPE_T{
|
||||
WMTCHIN_CHIPID = 0x0,
|
||||
WMTCHIN_HWVER = WMTCHIN_CHIPID + 1,
|
||||
WMTCHIN_MAPPINGHWVER = WMTCHIN_HWVER + 1,
|
||||
WMTCHIN_FWVER = WMTCHIN_MAPPINGHWVER + 1,
|
||||
WMTCHIN_MAX,
|
||||
|
||||
}ENUM_WMT_CHIPINFO_TYPE_T, *P_ENUM_WMT_CHIPINFO_TYPE_T;
|
||||
|
||||
typedef enum _ENUM_WMTDSNS_TYPE_T{
|
||||
WMTDSNS_FM_DISABLE = 0,
|
||||
WMTDSNS_FM_ENABLE = 1,
|
||||
WMTDSNS_FM_GPS_DISABLE = 2,
|
||||
WMTDSNS_FM_GPS_ENABLE = 3,
|
||||
WMTDSNS_MAX
|
||||
} ENUM_WMTDSNS_TYPE_T, *P_ENUM_WMTDSNS_TYPE_T;
|
||||
|
||||
typedef enum _ENUM_WMTTHERM_TYPE_T{
|
||||
WMTTHERM_ZERO = 0,
|
||||
WMTTHERM_ENABLE = WMTTHERM_ZERO + 1,
|
||||
WMTTHERM_READ = WMTTHERM_ENABLE + 1,
|
||||
WMTTHERM_DISABLE = WMTTHERM_READ + 1,
|
||||
WMTTHERM_MAX
|
||||
}ENUM_WMTTHERM_TYPE_T, *P_ENUM_WMTTHERM_TYPE_T;
|
||||
|
||||
typedef enum _ENUM_WMTMSG_TYPE_T {
|
||||
WMTMSG_TYPE_POWER_ON = 0,
|
||||
WMTMSG_TYPE_POWER_OFF = 1,
|
||||
WMTMSG_TYPE_RESET = 2,
|
||||
WMTMSG_TYPE_STP_RDY= 3,
|
||||
WMTMSG_TYPE_HW_FUNC_ON= 4,
|
||||
WMTMSG_TYPE_MAX
|
||||
} ENUM_WMTMSG_TYPE_T, *P_ENUM_WMTMSG_TYPE_T;
|
||||
|
||||
typedef enum _ENUM_WMTRSTMSG_TYPE_T{
|
||||
WMTRSTMSG_RESET_START = 0x0,
|
||||
WMTRSTMSG_RESET_END = 0x1,
|
||||
WMTRSTMSG_RESET_MAX,
|
||||
WMTRSTMSG_RESET_INVALID = 0xff
|
||||
} ENUM_WMTRSTMSG_TYPE_T, *P_ENUM_WMTRSTMSG_TYPE_T;
|
||||
|
||||
typedef void (*PF_WMT_CB)(
|
||||
ENUM_WMTDRV_TYPE_T, /* Source driver type */
|
||||
ENUM_WMTDRV_TYPE_T, /* Destination driver type */
|
||||
ENUM_WMTMSG_TYPE_T, /* Message type */
|
||||
VOID *, /* READ-ONLY buffer. Buffer is allocated and freed by WMT_drv. Client
|
||||
can't touch this buffer after this function return. */
|
||||
UINT32 /* Buffer size in unit of byte */
|
||||
);
|
||||
|
||||
typedef enum _SDIO_PS_OP{
|
||||
OWN_SET = 0,
|
||||
OWN_CLR = 1,
|
||||
OWN_STATE = 2,
|
||||
} SDIO_PS_OP;
|
||||
|
||||
|
||||
typedef INT32 (*PF_WMT_SDIO_PSOP)(SDIO_PS_OP);
|
||||
|
||||
#if 1 /* moved from wmt_core.h */
|
||||
typedef enum {
|
||||
WMT_SDIO_SLOT_INVALID = 0,
|
||||
WMT_SDIO_SLOT_SDIO1 = 1, /* Wi-Fi dedicated SDIO1*/
|
||||
WMT_SDIO_SLOT_SDIO2 = 2,
|
||||
WMT_SDIO_SLOT_MAX
|
||||
} WMT_SDIO_SLOT_NUM;
|
||||
|
||||
typedef enum {
|
||||
WMT_SDIO_FUNC_STP = 0,
|
||||
WMT_SDIO_FUNC_WIFI = 1,
|
||||
WMT_SDIO_FUNC_MAX
|
||||
} WMT_SDIO_FUNC_TYPE;
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
/*subsystem function ctrl APIs*/
|
||||
extern MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_off (
|
||||
ENUM_WMTDRV_TYPE_T type
|
||||
);
|
||||
|
||||
extern MTK_WCN_BOOL
|
||||
mtk_wcn_wmt_func_on (
|
||||
ENUM_WMTDRV_TYPE_T type
|
||||
);
|
||||
|
||||
extern MTK_WCN_BOOL mtk_wcn_wmt_dsns_ctrl (
|
||||
ENUM_WMTDSNS_TYPE_T eType
|
||||
);
|
||||
|
||||
extern MTK_WCN_BOOL mtk_wcn_wmt_assert (
|
||||
VOID
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_wmt_msgcb_reg (
|
||||
ENUM_WMTDRV_TYPE_T eType,
|
||||
PF_WMT_CB pCb
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_wmt_msgcb_unreg (
|
||||
ENUM_WMTDRV_TYPE_T eType
|
||||
);
|
||||
|
||||
extern INT32
|
||||
mtk_wcn_stp_wmt_sdio_op_reg (
|
||||
PF_WMT_SDIO_PSOP own_cb
|
||||
);
|
||||
|
||||
extern INT32
|
||||
mtk_wcn_stp_wmt_sdio_host_awake(
|
||||
VOID
|
||||
);
|
||||
/*
|
||||
return value:
|
||||
enable/disable thermal sensor function: true(1)/false(0)
|
||||
read thermal sensor function: thermal value
|
||||
|
||||
*/
|
||||
extern INT8
|
||||
mtk_wcn_wmt_therm_ctrl (
|
||||
ENUM_WMTTHERM_TYPE_T eType
|
||||
);
|
||||
|
||||
extern ENUM_WMTHWVER_TYPE_T
|
||||
mtk_wcn_wmt_hwver_get (VOID);
|
||||
|
||||
extern INT32
|
||||
mtk_wcn_wmt_chipid_query (VOID);
|
||||
|
||||
|
||||
extern INT32 wmt_lib_set_aif (
|
||||
CMB_STUB_AIF_X aif,
|
||||
MTK_WCN_BOOL share
|
||||
); /* set AUDIO interface options */
|
||||
extern VOID
|
||||
wmt_lib_ps_irq_cb(VOID);
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _WMT_EXP_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _WMT_PLAT_H_
|
||||
#define _WMT_PLAT_H_
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
#include "mtk_wcn_cmb_hw.h"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#if (CONFIG_ARCH_MT6589)
|
||||
#if defined(MTK_MERGE_INTERFACE_SUPPORT) && defined(MT6628)
|
||||
#define MTK_WCN_CMB_MERGE_INTERFACE_SUPPORT 1
|
||||
#else
|
||||
#define MTK_WCN_CMB_MERGE_INTERFACE_SUPPORT 0
|
||||
#endif
|
||||
#else
|
||||
#define MTK_WCN_CMB_MERGE_INTERFACE_SUPPORT 0
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#if 0 /* [GeorgeKuo] remove COMBO_AUDIO FLAG */
|
||||
#define COMBO_AUDIO_BT_MASK (0x1UL)
|
||||
#define COMBO_AUDIO_BT_PCM_ON (0x1UL << 0)
|
||||
#define COMBO_AUDIO_BT_PCM_OFF (0x0UL << 0)
|
||||
|
||||
#define COMBO_AUDIO_FM_MASK (0x2UL)
|
||||
#define COMBO_AUDIO_FM_LINEIN (0x0UL << 1)
|
||||
#define COMBO_AUDIO_FM_I2S (0x1UL << 1)
|
||||
|
||||
#define COMBO_AUDIO_PIN_MASK (0x4UL)
|
||||
#define COMBO_AUDIO_PIN_SHARE (0x1UL << 2)
|
||||
#define COMBO_AUDIO_PIN_SEPARATE (0x0UL << 2)
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
typedef enum _ENUM_FUNC_STATE_{
|
||||
FUNC_ON = 0,
|
||||
FUNC_OFF = 1,
|
||||
FUNC_RST = 2,
|
||||
FUNC_STAT = 3,
|
||||
FUNC_CTRL_MAX,
|
||||
} ENUM_FUNC_STATE, *P_ENUM_FUNC_STATE;
|
||||
|
||||
typedef enum _ENUM_PIN_ID_{
|
||||
PIN_LDO = 0,
|
||||
PIN_PMU = 1,
|
||||
PIN_RTC = 2,
|
||||
PIN_RST = 3,
|
||||
PIN_BGF_EINT = 4,
|
||||
PIN_WIFI_EINT = 5,
|
||||
PIN_ALL_EINT = 6,
|
||||
PIN_UART_GRP = 7,
|
||||
PIN_PCM_GRP = 8,
|
||||
PIN_I2S_GRP = 9,
|
||||
PIN_SDIO_GRP = 10,
|
||||
PIN_GPS_SYNC = 11,
|
||||
PIN_GPS_LNA = 12,
|
||||
PIN_ID_MAX
|
||||
} ENUM_PIN_ID, *P_ENUM_PIN_ID;
|
||||
|
||||
typedef enum _ENUM_PIN_STATE_{
|
||||
PIN_STA_INIT = 0,
|
||||
PIN_STA_OUT_L = 1,
|
||||
PIN_STA_OUT_H = 2,
|
||||
PIN_STA_IN_L = 3,
|
||||
PIN_STA_MUX = 4,
|
||||
PIN_STA_EINT_EN = 5,
|
||||
PIN_STA_EINT_DIS = 6,
|
||||
PIN_STA_DEINIT = 7,
|
||||
PIN_STA_SHOW = 8,
|
||||
PIN_STA_MAX
|
||||
} ENUM_PIN_STATE, *P_ENUM_PIN_STATE;
|
||||
|
||||
typedef enum _CMB_IF_TYPE_{
|
||||
CMB_IF_UART = 0,
|
||||
CMB_IF_WIFI_SDIO = 1,
|
||||
CMB_IF_BGF_SDIO = 2,
|
||||
CMB_IF_BGWF_SDIO = 3,
|
||||
CMB_IF_TYPE_MAX
|
||||
} CMB_IF_TYPE, *P_CMB_IF_TYPE;
|
||||
|
||||
typedef INT32 (*fp_set_pin)(ENUM_PIN_STATE);
|
||||
|
||||
typedef enum _ENUM_WL_OP_{
|
||||
WL_OP_GET = 0,
|
||||
WL_OP_PUT = 1,
|
||||
WL_OP_MAX
|
||||
} ENUM_WL_OP, *P_ENUM_WL_OP;
|
||||
|
||||
typedef VOID (*irq_cb)(VOID);
|
||||
typedef INT32 (*device_audio_if_cb) (CMB_STUB_AIF_X aif, MTK_WCN_BOOL share);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32
|
||||
wmt_plat_init (P_PWR_SEQ_TIME pPwrSeqTime);
|
||||
|
||||
INT32
|
||||
wmt_plat_deinit (VOID);
|
||||
|
||||
INT32
|
||||
wmt_plat_irq_ctrl (
|
||||
ENUM_FUNC_STATE state
|
||||
);
|
||||
|
||||
INT32
|
||||
wmt_plat_pwr_ctrl (
|
||||
ENUM_FUNC_STATE state
|
||||
);
|
||||
|
||||
INT32
|
||||
wmt_plat_ps_ctrl (
|
||||
ENUM_FUNC_STATE state
|
||||
);
|
||||
|
||||
INT32
|
||||
wmt_plat_gpio_ctrl (
|
||||
ENUM_PIN_ID id,
|
||||
ENUM_PIN_STATE state
|
||||
);
|
||||
|
||||
INT32
|
||||
wmt_plat_eirq_ctrl (
|
||||
ENUM_PIN_ID id,
|
||||
ENUM_PIN_STATE state
|
||||
);
|
||||
|
||||
INT32
|
||||
wmt_plat_sdio_ctrl (
|
||||
UINT32 sdioPortNum,
|
||||
ENUM_FUNC_STATE on
|
||||
);
|
||||
|
||||
|
||||
INT32
|
||||
wmt_plat_wake_lock_ctrl(
|
||||
ENUM_WL_OP opId
|
||||
);
|
||||
|
||||
VOID wmt_lib_plat_irq_cb_reg (irq_cb bgf_irq_cb);
|
||||
|
||||
INT32
|
||||
wmt_plat_audio_ctrl (
|
||||
CMB_STUB_AIF_X state,
|
||||
CMB_STUB_AIF_CTRL ctrl
|
||||
);
|
||||
|
||||
VOID wmt_lib_plat_aif_cb_reg (device_audio_if_cb aif_ctrl_cb);
|
||||
|
||||
INT32
|
||||
wmt_plat_merge_if_flag_ctrl (UINT32 enagle);
|
||||
|
||||
INT32
|
||||
wmt_plat_merge_if_flag_get (VOID);
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#endif /* _WMT_PLAT_H_ */
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
#ifndef _WMT_PLAT_STUB_H_
|
||||
#define _WMT_PLAT_STUB_H_
|
||||
|
||||
|
||||
INT32
|
||||
wmt_plat_audio_ctrl (
|
||||
CMB_STUB_AIF_X state,
|
||||
CMB_STUB_AIF_CTRL ctrl
|
||||
);
|
||||
|
||||
INT32 wmt_plat_stub_init (void);
|
||||
|
||||
#endif /*_WMT_PLAT_STUB_H_*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,354 +0,0 @@
|
||||
#include "hif_sdio.h"
|
||||
#include "hif_sdio_chrdev.h"
|
||||
|
||||
|
||||
|
||||
static int hif_sdio_proc(void * pvData);
|
||||
static int hif_sdio_open(struct inode *inode, struct file *file);
|
||||
static int hif_sdio_release(struct inode *inode, struct file *file);
|
||||
static long hif_sdio_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
|
||||
static ssize_t hif_sdio_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos);
|
||||
|
||||
|
||||
|
||||
unsigned int hifSdioMajor = 0;
|
||||
|
||||
#define COMBO_IOC_MAGIC 'h'
|
||||
#define COMBO_IOCTL_GET_CHIP_ID _IOR(COMBO_IOC_MAGIC, 0, int)
|
||||
#define COMBO_IOCTL_SET_CHIP_ID _IOW(COMBO_IOC_MAGIC, 1, int)
|
||||
|
||||
MTK_WCN_HIF_SDIO_CHIP_INFO gChipInfoArray[] = {
|
||||
/* MT6620 */ /* Not an SDIO standard class device */
|
||||
{ {SDIO_DEVICE(0x037A, 0x020A)}, 0x6620 }, /* SDIO1:FUNC1:WIFI */
|
||||
{ {SDIO_DEVICE(0x037A, 0x020B)}, 0x6620 }, /* SDIO2:FUNC1:BT+FM+GPS */
|
||||
{ {SDIO_DEVICE(0x037A, 0x020C)}, 0x6620 }, /* 2-function (SDIO2:FUNC1:BT+FM+GPS, FUNC2:WIFI) */
|
||||
|
||||
/* MT6628 */ /* SDIO1: Wi-Fi, SDIO2: BGF */
|
||||
{ {SDIO_DEVICE(0x037A, 0x6628)}, 0x6628},
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct file_operations hifDevOps =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
.open = hif_sdio_open,
|
||||
.release = hif_sdio_release,
|
||||
.unlocked_ioctl = hif_sdio_unlocked_ioctl,
|
||||
.read = hif_sdio_read,
|
||||
};
|
||||
|
||||
struct class *pHifClass = NULL;
|
||||
struct device *pHifDev = NULL;
|
||||
UCHAR *HifClassName = "hifsdiod";
|
||||
UCHAR *kObjName = "hifsdiod";
|
||||
|
||||
|
||||
struct task_struct *gConIdQueryThread;
|
||||
wait_queue_head_t gHifsdiodEvent;
|
||||
|
||||
//OSAL_THREAD gConIdQueryThread;
|
||||
//OSAL_EVENT gHifsdiodEvent;
|
||||
UCHAR *gConIdQueryName = "consys-id-query";
|
||||
INT32 gComboChipId = -1;
|
||||
|
||||
|
||||
|
||||
INT32 hifsdiod_start(void)
|
||||
{
|
||||
int iRet = -1;
|
||||
init_waitqueue_head(&gHifsdiodEvent);
|
||||
#if 0
|
||||
osal_event_init(&gHifsdiodEvent);
|
||||
gConIdQueryThread.pThreadData = (VOID *)NULL;
|
||||
gConIdQueryThread.pThreadFunc = (VOID *)hif_sdio_proc;
|
||||
osal_memcpy(gConIdQueryThread.threadName, gConIdQueryName , osal_strlen(gConIdQueryName));
|
||||
|
||||
|
||||
iRet = osal_thread_create(&gConIdQueryThread);
|
||||
if (iRet < 0)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("osal_thread_create fail...\n");
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
#else
|
||||
gConIdQueryThread = kthread_create(hif_sdio_proc, NULL, gConIdQueryName);
|
||||
if (NULL == gConIdQueryThread)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("osal_thread_create fail...\n");
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/* Start STPd thread*/
|
||||
iRet = osal_thread_run(&gConIdQueryThread);
|
||||
if(iRet < 0)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("osal_thread_run FAILS\n");
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
#else
|
||||
if (gConIdQueryThread) {
|
||||
wake_up_process(gConIdQueryThread);
|
||||
}
|
||||
else
|
||||
{
|
||||
goto ERR_EXIT1;
|
||||
}
|
||||
#endif
|
||||
iRet = 0;
|
||||
HIF_SDIO_INFO_FUNC("succeed\n");
|
||||
|
||||
return iRet;
|
||||
|
||||
ERR_EXIT1:
|
||||
HIF_SDIO_ERR_FUNC("failed\n");
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
INT32 hifsdiod_stop(void)
|
||||
{
|
||||
if (gConIdQueryThread) {
|
||||
HIF_SDIO_INFO_FUNC("inform hifsdiod exit..\n");
|
||||
kthread_stop(gConIdQueryThread);
|
||||
gConIdQueryThread = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int hif_sdio_proc(void * pvData)
|
||||
{
|
||||
while (!kthread_should_stop())
|
||||
{
|
||||
//HIF_SDIO_INFO_FUNC("enter sleep.\n");
|
||||
osal_msleep(10000);
|
||||
//HIF_SDIO_INFO_FUNC("wakeup\n");
|
||||
}
|
||||
HIF_SDIO_INFO_FUNC("hifsdiod exit.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int hif_sdio_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
HIF_SDIO_INFO_FUNC(" ++\n");
|
||||
HIF_SDIO_INFO_FUNC(" --\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hif_sdio_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
HIF_SDIO_INFO_FUNC(" ++\n");
|
||||
HIF_SDIO_INFO_FUNC(" --\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static ssize_t hif_sdio_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
|
||||
|
||||
{
|
||||
HIF_SDIO_INFO_FUNC(" ++\n");
|
||||
HIF_SDIO_INFO_FUNC(" --\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static long hif_sdio_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
HIF_SDIO_DBG_FUNC("cmd (%d)\n", cmd);
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case COMBO_IOCTL_GET_CHIP_ID:
|
||||
gComboChipId = 0x6628;
|
||||
retval = gComboChipId;
|
||||
HIF_SDIO_INFO_FUNC("get combo chip id: 0x%x\n", gComboChipId);
|
||||
break;
|
||||
case COMBO_IOCTL_SET_CHIP_ID:
|
||||
gComboChipId = arg;
|
||||
HIF_SDIO_INFO_FUNC("set combo chip id to 0x%x\n", gComboChipId);
|
||||
break;
|
||||
default:
|
||||
HIF_SDIO_WARN_FUNC("unknown cmd (%d)\n", cmd);
|
||||
retval = 0;
|
||||
break;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
INT32 hif_sdio_is_chipid_valid (INT32 chipId)
|
||||
{
|
||||
INT32 index = -1;
|
||||
|
||||
INT32 left = 0;
|
||||
INT32 middle = 0;
|
||||
INT32 right = sizeof (gChipInfoArray) / sizeof (gChipInfoArray[0]) - 1;
|
||||
if ((chipId < gChipInfoArray[left].chipId) || (chipId > gChipInfoArray[right].chipId))
|
||||
return index;
|
||||
|
||||
middle = (left + right) / 2;
|
||||
|
||||
while (left <= right)
|
||||
{
|
||||
if (chipId > gChipInfoArray[middle].chipId)
|
||||
{
|
||||
left = middle + 1;
|
||||
}
|
||||
else if (chipId < gChipInfoArray[middle].chipId)
|
||||
{
|
||||
right = middle - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
index = middle;
|
||||
break;
|
||||
}
|
||||
middle = (left + right) / 2;
|
||||
}
|
||||
|
||||
if (0 > index)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("no supported chipid found\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
HIF_SDIO_INFO_FUNC("index:%d, chipId:0x%x\n", index, gChipInfoArray[index].chipId);
|
||||
}
|
||||
|
||||
return index;
|
||||
}
|
||||
|
||||
INT32 hif_sdio_match_chipid_by_dev_id (const struct sdio_device_id *id)
|
||||
{
|
||||
INT32 maxIndex = sizeof (gChipInfoArray) / sizeof (gChipInfoArray[0]);
|
||||
INT32 index = 0;
|
||||
struct sdio_device_id *localId = NULL;
|
||||
INT32 chipId = -1;
|
||||
for (index = 0; index < maxIndex; index++)
|
||||
{
|
||||
localId = &(gChipInfoArray[index].deviceId);
|
||||
if ((localId->vendor == id->vendor) && (localId->device == id->device))
|
||||
{
|
||||
chipId = gChipInfoArray[index].chipId;
|
||||
HIF_SDIO_INFO_FUNC("valid chipId found, index(%d), vendor id(0x%x), device id(0x%x), chip id(0x%x)\n", index, localId->vendor, localId->device, chipId);
|
||||
gComboChipId = chipId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (0 > chipId)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("No valid chipId found, vendor id(0x%x), device id(0x%x)\n", id->vendor, id->device);
|
||||
}
|
||||
|
||||
return chipId;
|
||||
}
|
||||
|
||||
|
||||
INT32 mtk_wcn_hif_sdio_query_chipid(INT32 waitFlag)
|
||||
{
|
||||
UINT32 timeSlotMs = 200;
|
||||
UINT32 maxTimeSlot = 15;
|
||||
UINT32 counter = 0;
|
||||
//gComboChipId = 0x6628;
|
||||
if (0 == waitFlag)
|
||||
return gComboChipId;
|
||||
if (0 <= hif_sdio_is_chipid_valid(gComboChipId))
|
||||
return gComboChipId;
|
||||
wmt_plat_pwr_ctrl(FUNC_ON);
|
||||
wmt_plat_sdio_ctrl(WMT_SDIO_SLOT_SDIO1, FUNC_ON);
|
||||
while (counter < maxTimeSlot)
|
||||
{
|
||||
if (0 <= hif_sdio_is_chipid_valid(gComboChipId))
|
||||
break;
|
||||
osal_msleep(timeSlotMs);
|
||||
counter++;
|
||||
}
|
||||
|
||||
wmt_plat_sdio_ctrl(WMT_SDIO_SLOT_SDIO1, FUNC_OFF);
|
||||
wmt_plat_pwr_ctrl(FUNC_OFF);
|
||||
return gComboChipId;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_hif_sdio_query_chipid);
|
||||
|
||||
INT32 mtk_wcn_hif_sdio_tell_chipid(INT32 chipId)
|
||||
{
|
||||
|
||||
gComboChipId = chipId;
|
||||
HIF_SDIO_INFO_FUNC("set combo chip id to 0x%x\n", gComboChipId);
|
||||
|
||||
return gComboChipId;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_hif_sdio_tell_chipid);
|
||||
|
||||
INT32 hif_sdio_create_dev_node(void)
|
||||
{
|
||||
|
||||
INT32 iResult = -1;
|
||||
|
||||
HIF_SDIO_DBG_FUNC( "++");
|
||||
iResult = register_chrdev(hifSdioMajor, kObjName, &hifDevOps);
|
||||
if(0 > iResult)
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("register_chrdev failed.\n");
|
||||
iResult = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
hifSdioMajor = hifSdioMajor == 0 ? iResult : hifSdioMajor;
|
||||
HIF_SDIO_INFO_FUNC("register_chrdev succeed, mtk_jajor = %d\n", hifSdioMajor);
|
||||
pHifClass = class_create(THIS_MODULE, HifClassName);
|
||||
if(IS_ERR(pHifClass))
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("class_create error\n");
|
||||
iResult = -2;
|
||||
}
|
||||
else
|
||||
{
|
||||
pHifDev = device_create(pHifClass, NULL, MKDEV(hifSdioMajor, 0), NULL, HifClassName, "%d", 0);
|
||||
if(IS_ERR(pHifDev))
|
||||
{
|
||||
HIF_SDIO_ERR_FUNC("device_create error:%ld\n", PTR_ERR(pHifDev));
|
||||
iResult = -3;
|
||||
}
|
||||
else
|
||||
{
|
||||
HIF_SDIO_INFO_FUNC("device_create succeed\n");
|
||||
iResult = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return iResult;
|
||||
}
|
||||
|
||||
|
||||
INT32 hif_sdio_remove_dev_node(void)
|
||||
{
|
||||
if(pHifDev != NULL)
|
||||
{
|
||||
device_destroy(pHifClass, MKDEV(hifSdioMajor, 0));
|
||||
pHifDev = NULL;
|
||||
}
|
||||
if(pHifClass != NULL)
|
||||
{
|
||||
class_destroy(pHifClass);
|
||||
pHifClass = NULL;
|
||||
}
|
||||
|
||||
if(hifSdioMajor != 0)
|
||||
{
|
||||
unregister_chrdev(hifSdioMajor, kObjName);
|
||||
hifSdioMajor = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,311 +0,0 @@
|
||||
/*
|
||||
** $Id: $
|
||||
*/
|
||||
|
||||
/*! \file "hif_sdio.h"
|
||||
\brief
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
** $Log: $
|
||||
*
|
||||
* 07 25 2010 george.kuo
|
||||
*
|
||||
* Move hif_sdio driver to linux directory.
|
||||
*
|
||||
* 07 23 2010 george.kuo
|
||||
*
|
||||
* Add MT6620 driver source tree
|
||||
* , including char device driver (wmt, bt, gps), stp driver, interface driver (tty ldisc and hif_sdio), and bt hci driver.
|
||||
**
|
||||
**
|
||||
*/
|
||||
|
||||
#ifndef _HIF_SDIO_H
|
||||
#define _HIF_SDIO_H
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define HIF_SDIO_DEBUG (0) /* 0:trun off debug msg and assert, 1:trun off debug msg and assert */
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sdio_func.h>
|
||||
#include <linux/mmc/sdio_ids.h>
|
||||
|
||||
#include <linux/mm.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
|
||||
#include "osal_typedef.h"
|
||||
#include "osal.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define CFG_CLIENT_COUNT (11)
|
||||
|
||||
#define HIF_DEFAULT_BLK_SIZE (256)
|
||||
#define HIF_DEFAULT_VENDOR (0x037A)
|
||||
|
||||
#define HIF_SDIO_LOG_LOUD 4
|
||||
#define HIF_SDIO_LOG_DBG 3
|
||||
#define HIF_SDIO_LOG_INFO 2
|
||||
#define HIF_SDIO_LOG_WARN 1
|
||||
#define HIF_SDIO_LOG_ERR 0
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* Function info provided by client driver */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_FUNCINFO MTK_WCN_HIF_SDIO_FUNCINFO;
|
||||
|
||||
/* Client context provided by hif_sdio driver for the following function call */
|
||||
typedef UINT32 MTK_WCN_HIF_SDIO_CLTCTX;
|
||||
|
||||
/* Callback functions provided by client driver */
|
||||
typedef INT32 (*MTK_WCN_HIF_SDIO_PROBE)(MTK_WCN_HIF_SDIO_CLTCTX, const MTK_WCN_HIF_SDIO_FUNCINFO *);
|
||||
typedef INT32 (*MTK_WCN_HIF_SDIO_REMOVE)(MTK_WCN_HIF_SDIO_CLTCTX);
|
||||
typedef INT32 (*MTK_WCN_HIF_SDIO_IRQ)(MTK_WCN_HIF_SDIO_CLTCTX);
|
||||
|
||||
/* Function info provided by client driver */
|
||||
struct _MTK_WCN_HIF_SDIO_FUNCINFO {
|
||||
UINT16 manf_id; /* TPLMID_MANF: manufacturer ID */
|
||||
UINT16 card_id; /* TPLMID_CARD: card ID */
|
||||
UINT16 func_num; /* Function Number */
|
||||
UINT16 blk_sz; /* Function block size */
|
||||
};
|
||||
|
||||
/* Client info provided by client driver */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_CLTINFO {
|
||||
const MTK_WCN_HIF_SDIO_FUNCINFO *func_tbl; /* supported function info table */
|
||||
UINT32 func_tbl_size; /* supported function table info element number */
|
||||
MTK_WCN_HIF_SDIO_PROBE hif_clt_probe; /* callback function for probing */
|
||||
MTK_WCN_HIF_SDIO_REMOVE hif_clt_remove; /* callback function for removing */
|
||||
MTK_WCN_HIF_SDIO_IRQ hif_clt_irq; /* callback function for interrupt handling */
|
||||
} MTK_WCN_HIF_SDIO_CLTINFO;
|
||||
|
||||
/* function info provided by registed function */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_REGISTINFO {
|
||||
const MTK_WCN_HIF_SDIO_CLTINFO *sdio_cltinfo; /* client's MTK_WCN_HIF_SDIO_CLTINFO pointer */
|
||||
const MTK_WCN_HIF_SDIO_FUNCINFO *func_info; /* supported function info pointer */
|
||||
} MTK_WCN_HIF_SDIO_REGISTINFO;
|
||||
|
||||
/* Card info provided by probed function */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_PROBEINFO {
|
||||
struct sdio_func* func; /* probed sdio function pointer */
|
||||
void* private_data_p; /* clt's private data pointer */
|
||||
MTK_WCN_BOOL on_by_wmt; /* TRUE: on by wmt, FALSE: not on by wmt */
|
||||
/* added for sdio irq sync and mmc single_irq workaround */
|
||||
MTK_WCN_BOOL sdio_irq_enabled; /* TRUE: can handle sdio irq; FALSE: no sdio irq handling */
|
||||
INT8 clt_idx; /* registered function table info element number (initial value is -1) */
|
||||
} MTK_WCN_HIF_SDIO_PROBEINFO;
|
||||
|
||||
/* work queue info needed by worker */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_CLT_PROBE_WORKERINFO {
|
||||
struct work_struct probe_work; /* work queue structure */
|
||||
MTK_WCN_HIF_SDIO_REGISTINFO *registinfo_p; /* MTK_WCN_HIF_SDIO_REGISTINFO pointer of the client */
|
||||
INT8 probe_idx; /* probed function table info element number (initial value is -1) */
|
||||
} MTK_WCN_HIF_SDIO_CLT_PROBE_WORKERINFO;
|
||||
|
||||
/* global resource locks info of hif_sdio drv */
|
||||
typedef struct _MTK_WCN_HIF_SDIO_LOCKINFO {
|
||||
spinlock_t probed_list_lock; /* spin lock for probed list */
|
||||
spinlock_t clt_list_lock; /* spin lock for client registed list */
|
||||
} MTK_WCN_HIF_SDIO_LOCKINFO;
|
||||
|
||||
/* error code returned by hif_sdio driver (use NEGATIVE number) */
|
||||
typedef enum {
|
||||
HIF_SDIO_ERR_SUCCESS = 0,
|
||||
HIF_SDIO_ERR_FAIL = HIF_SDIO_ERR_SUCCESS - 1, /* generic error */
|
||||
HIF_SDIO_ERR_INVALID_PARAM = HIF_SDIO_ERR_FAIL - 1,
|
||||
HIF_SDIO_ERR_DUPLICATED = HIF_SDIO_ERR_INVALID_PARAM - 1,
|
||||
HIF_SDIO_ERR_UNSUP_MANF_ID = HIF_SDIO_ERR_DUPLICATED - 1,
|
||||
HIF_SDIO_ERR_UNSUP_CARD_ID = HIF_SDIO_ERR_UNSUP_MANF_ID - 1,
|
||||
HIF_SDIO_ERR_INVALID_FUNC_NUM = HIF_SDIO_ERR_UNSUP_CARD_ID - 1,
|
||||
HIF_SDIO_ERR_INVALID_BLK_SZ = HIF_SDIO_ERR_INVALID_FUNC_NUM - 1,
|
||||
HIF_SDIO_ERR_NOT_PROBED = HIF_SDIO_ERR_INVALID_BLK_SZ - 1,
|
||||
HIF_SDIO_ERR_ALRDY_ON = HIF_SDIO_ERR_NOT_PROBED -1,
|
||||
HIF_SDIO_ERR_ALRDY_OFF = HIF_SDIO_ERR_ALRDY_ON -1,
|
||||
HIF_SDIO_ERR_CLT_NOT_REG = HIF_SDIO_ERR_ALRDY_OFF - 1,
|
||||
} MTK_WCN_HIF_SDIO_ERR ;
|
||||
|
||||
typedef struct _MTK_WCN_HIF_SDIO_CHIP_INFO_
|
||||
{
|
||||
struct sdio_device_id deviceId;
|
||||
UINT32 chipId;
|
||||
}MTK_WCN_HIF_SDIO_CHIP_INFO, *P_MTK_WCN_HIF_SDIO_CHIP_INFO;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*!
|
||||
* \brief A macro used to describe an SDIO function
|
||||
*
|
||||
* Fill an MTK_WCN_HIF_SDIO_FUNCINFO structure with function-specific information
|
||||
*
|
||||
* \param manf the 16 bit manufacturer id
|
||||
* \param card the 16 bit card id
|
||||
* \param func the 16 bit function number
|
||||
* \param b_sz the 16 bit function block size
|
||||
*/
|
||||
#define MTK_WCN_HIF_SDIO_FUNC(manf, card, func, b_sz) \
|
||||
.manf_id = (manf), .card_id = (card), .func_num = (func), .blk_sz = (b_sz)
|
||||
|
||||
#ifndef DFT_TAG
|
||||
#define DFT_TAG "[HIF-SDIO]"
|
||||
#endif
|
||||
|
||||
extern UINT32 gHifSdioDbgLvl;
|
||||
|
||||
#define HIF_SDIO_LOUD_FUNC(fmt, arg...) if (gHifSdioDbgLvl >= HIF_SDIO_LOG_LOUD) { osal_dbg_print(DFT_TAG"[L]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define HIF_SDIO_DBG_FUNC(fmt, arg...) if (gHifSdioDbgLvl >= HIF_SDIO_LOG_DBG) { osal_dbg_print(DFT_TAG"[D]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define HIF_SDIO_INFO_FUNC(fmt, arg...) if (gHifSdioDbgLvl >= HIF_SDIO_LOG_INFO) { osal_dbg_print(DFT_TAG"[I]%s:" fmt, __FUNCTION__ ,##arg);}
|
||||
#define HIF_SDIO_WARN_FUNC(fmt, arg...) if (gHifSdioDbgLvl >= HIF_SDIO_LOG_WARN) { osal_dbg_print(DFT_TAG"[W]%s(%d):" fmt, __FUNCTION__ , __LINE__, ##arg);}
|
||||
#define HIF_SDIO_ERR_FUNC(fmt, arg...) if (gHifSdioDbgLvl >= HIF_SDIO_LOG_ERR) { osal_dbg_print(DFT_TAG"[E]%s(%d):" fmt, __FUNCTION__ , __LINE__, ##arg);}
|
||||
|
||||
/*!
|
||||
* \brief ASSERT function definition.
|
||||
*
|
||||
*/
|
||||
#if HIF_SDIO_DEBUG
|
||||
#define HIF_SDIO_ASSERT(expr) if ( !(expr) ) { \
|
||||
osal_dbg_print("assertion failed! %s[%d]: %s\n",\
|
||||
__FUNCTION__, __LINE__, #expr); \
|
||||
osal_bug_on( !(expr) );\
|
||||
}
|
||||
#else
|
||||
#define HIF_SDIO_ASSERT(expr) do {} while(0)
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief MTK hif sdio client registration function
|
||||
*
|
||||
* Client uses this function to do hif sdio registration
|
||||
*
|
||||
* \param pinfo a pointer of client's information
|
||||
*
|
||||
* \retval 0 register successfully
|
||||
* \retval < 0 error code
|
||||
*/
|
||||
extern INT32 mtk_wcn_hif_sdio_client_reg (
|
||||
const MTK_WCN_HIF_SDIO_CLTINFO *pinfo
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_client_unreg (
|
||||
const MTK_WCN_HIF_SDIO_CLTINFO *pinfo
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_readb (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
PUINT8 pvb
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_writeb (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
UINT8 vb
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_readl (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
PUINT32 pvl
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_writel (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
UINT32 vl
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_read_buf (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
PUINT32 pbuf,
|
||||
UINT32 len
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_write_buf (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 offset,
|
||||
PUINT32 pbuf,
|
||||
UINT32 len
|
||||
);
|
||||
|
||||
extern void mtk_wcn_hif_sdio_set_drvdata(
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
void* private_data_p
|
||||
);
|
||||
|
||||
extern void* mtk_wcn_hif_sdio_get_drvdata(
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_wmt_control(
|
||||
WMT_SDIO_FUNC_TYPE func_type,
|
||||
MTK_WCN_BOOL is_on
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_bus_set_power (
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
UINT32 pwrState
|
||||
);
|
||||
|
||||
extern void mtk_wcn_hif_sdio_get_dev(
|
||||
MTK_WCN_HIF_SDIO_CLTCTX ctx,
|
||||
struct device **dev
|
||||
);
|
||||
|
||||
extern INT32 mtk_wcn_hif_sdio_update_cb_reg(
|
||||
int (*ts_update)(void)
|
||||
);
|
||||
|
||||
|
||||
INT32 mtk_wcn_hif_sdio_tell_chipid(INT32 chipId);
|
||||
INT32 mtk_wcn_hif_sdio_query_chipid(INT32 waitFlag);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
#endif /* _HIF_SDIO_H */
|
||||
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
|
||||
#ifndef _HIF_SDIO_CHRDEV_H_
|
||||
|
||||
#define _HIF_SDIO_CHRDEV_H_
|
||||
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/current.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/sdio_func.h>
|
||||
#include <linux/mmc/sdio_ids.h>
|
||||
|
||||
|
||||
#include "wmt_exp.h"
|
||||
#include "wmt_plat.h"
|
||||
#ifdef CFG_WMT_PS_SUPPORT
|
||||
#undef CFG_WMT_PS_SUPPORT
|
||||
#endif
|
||||
|
||||
|
||||
extern INT32 hif_sdio_create_dev_node(void);
|
||||
extern INT32 hif_sdio_remove_dev_node(void);
|
||||
extern INT32 hifsdiod_start(void);
|
||||
extern INT32 hifsdiod_stop(void);
|
||||
INT32 hif_sdio_match_chipid_by_dev_id (const struct sdio_device_id *id);
|
||||
INT32 hif_sdio_is_chipid_valid (INT32 chipId);
|
||||
|
||||
|
||||
|
||||
#endif /*_HIF_SDIO_CHRDEV_H_*/
|
||||
@@ -1,201 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef _MTK_WCN_CMB_STUB_H_
|
||||
#define _MTK_WCN_CMB_STUB_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
typedef enum {
|
||||
COMBO_AUDIO_STATE_0 = 0, /* 0000: BT_PCM_OFF & FM analog (line in/out) */
|
||||
COMBO_AUDIO_STATE_1 = 1, /* 0001: BT_PCM_ON & FM analog (in/out) */
|
||||
COMBO_AUDIO_STATE_2 = 2, /* 0010: BT_PCM_OFF & FM digital (I2S) */
|
||||
COMBO_AUDIO_STATE_3 = 3, /* 0011: BT_PCM_ON & FM digital (I2S) (invalid in 73evb & 1.2 phone configuration) */
|
||||
COMBO_AUDIO_STATE_MAX = 4,
|
||||
} COMBO_AUDIO_STATE;
|
||||
|
||||
typedef enum {
|
||||
COMBO_FUNC_TYPE_BT = 0,
|
||||
COMBO_FUNC_TYPE_FM = 1,
|
||||
COMBO_FUNC_TYPE_GPS = 2,
|
||||
COMBO_FUNC_TYPE_WIFI = 3,
|
||||
COMBO_FUNC_TYPE_WMT = 4,
|
||||
COMBO_FUNC_TYPE_STP = 5,
|
||||
COMBO_FUNC_TYPE_NUM = 6
|
||||
} COMBO_FUNC_TYPE;
|
||||
|
||||
typedef enum {
|
||||
COMBO_IF_UART = 0,
|
||||
COMBO_IF_MSDC = 1,
|
||||
COMBO_IF_MAX,
|
||||
} COMBO_IF;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/* [GeorgeKuo] Stub functions for other kernel built-in modules to call.
|
||||
* Keep them unchanged temporarily. Move mt_combo functions to mtk_wcn_combo.
|
||||
*/
|
||||
//extern int mt_combo_audio_ctrl_ex(COMBO_AUDIO_STATE state, u32 clt_ctrl);
|
||||
static inline int mt_combo_audio_ctrl(COMBO_AUDIO_STATE state) {
|
||||
//return mt_combo_audio_ctrl_ex(state, 1);
|
||||
return 0;
|
||||
}
|
||||
//extern int mt_combo_plt_enter_deep_idle(COMBO_IF src);
|
||||
//extern int mt_combo_plt_exit_deep_idle(COMBO_IF src);
|
||||
|
||||
/* Use new mtk_wcn_stub APIs instead of old mt_combo ones for kernel to control
|
||||
* function on/off.
|
||||
*/
|
||||
//extern void mtk_wcn_cmb_stub_func_ctrl (unsigned int type, unsigned int on);
|
||||
//extern int board_sdio_ctrl (unsigned int sdio_port_num, unsigned int on);
|
||||
//#include <mach/mt_combo.h> jake
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
typedef enum {
|
||||
CMB_STUB_AIF_0 = 0, /* 0000: BT_PCM_OFF & FM analog (line in/out) */
|
||||
CMB_STUB_AIF_1 = 1, /* 0001: BT_PCM_ON & FM analog (in/out) */
|
||||
CMB_STUB_AIF_2 = 2, /* 0010: BT_PCM_OFF & FM digital (I2S) */
|
||||
CMB_STUB_AIF_3 = 3, /* 0011: BT_PCM_ON & FM digital (I2S) (invalid in 73evb & 1.2 phone configuration) */
|
||||
CMB_STUB_AIF_MAX = 4,
|
||||
} CMB_STUB_AIF_X;
|
||||
|
||||
/*COMBO_CHIP_AUDIO_PIN_CTRL*/
|
||||
typedef enum {
|
||||
CMB_STUB_AIF_CTRL_DIS = 0,
|
||||
CMB_STUB_AIF_CTRL_EN = 1,
|
||||
CMB_STUB_AIF_CTRL_MAX = 2,
|
||||
} CMB_STUB_AIF_CTRL;
|
||||
|
||||
typedef void (*wmt_bgf_eirq_cb)(void);
|
||||
typedef int (*wmt_aif_ctrl_cb)(CMB_STUB_AIF_X, CMB_STUB_AIF_CTRL);
|
||||
typedef void (*wmt_func_ctrl_cb)(unsigned int, unsigned int);
|
||||
|
||||
typedef struct _CMB_STUB_CB_ {
|
||||
unsigned int size; //structure size
|
||||
/*wmt_bgf_eirq_cb bgf_eirq_cb;*//* remove bgf_eirq_cb from stub. handle it in platform */
|
||||
wmt_aif_ctrl_cb aif_ctrl_cb;
|
||||
wmt_func_ctrl_cb func_ctrl_cb;
|
||||
} CMB_STUB_CB, *P_CMB_STUB_CB;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern int mtk_wcn_cmb_stub_reg (P_CMB_STUB_CB p_stub_cb);
|
||||
extern int mtk_wcn_cmb_stub_unreg (void);
|
||||
|
||||
extern int mtk_wcn_cmb_stub_aif_ctrl (CMB_STUB_AIF_X state, CMB_STUB_AIF_CTRL ctrl);
|
||||
|
||||
// TODO: [FixMe][GeorgeKuo]: put prototypes into mt_combo.h for board.c temporarily for non-finished porting
|
||||
// TODO: old: rfkill->board.c->mt_combo->wmt_lib_plat
|
||||
// TODO: new: rfkill->mtk_wcn_cmb_stub_alps->wmt_plat_alps
|
||||
#if 0
|
||||
extern int mtk_wcn_cmb_stub_func_ctrl(unsigned int type, unsigned int on);
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#endif /* _MTK_WCN_CMB_STUB_H_ */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,391 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#ifndef _OSAL_H_
|
||||
#define _OSAL_H_
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/poll.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/slab.h>
|
||||
#if WMT_PLAT_ALPS
|
||||
#include <linux/aee.h>
|
||||
#endif
|
||||
#include <linux/kfifo.h>
|
||||
#include <linux/wakelock.h>
|
||||
#include <linux/log2.h>
|
||||
#include <osal_typedef.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define OS_BIT_OPS_SUPPORT 1
|
||||
|
||||
#define _osal_inline_ inline
|
||||
|
||||
#define MAX_THREAD_NAME_LEN 16
|
||||
#define MAX_WAKE_LOCK_NAME_LEN 16
|
||||
#define OSAL_OP_BUF_SIZE 64
|
||||
#define OSAL_OP_DATA_SIZE 32
|
||||
#define DBG_LOG_STR_SIZE 512
|
||||
|
||||
#define osal_sizeof(x) sizeof(x)
|
||||
|
||||
#define osal_array_size(x) sizeof(x)/sizeof(x[0])
|
||||
|
||||
#ifndef NAME_MAX
|
||||
#define NAME_MAX 256
|
||||
#endif
|
||||
|
||||
|
||||
#define WMT_OP_BIT(x) (0x1UL << x)
|
||||
#define WMT_OP_HIF_BIT WMT_OP_BIT(0)
|
||||
|
||||
|
||||
#define RB_SIZE(prb) ((prb)->size)
|
||||
#define RB_MASK(prb) (RB_SIZE(prb) - 1)
|
||||
#define RB_COUNT(prb) ((prb)->write - (prb)->read)
|
||||
#define RB_FULL(prb) (RB_COUNT(prb) >= RB_SIZE(prb))
|
||||
#define RB_EMPTY(prb) ((prb)->write == (prb)->read)
|
||||
|
||||
#define RB_INIT(prb, qsize) \
|
||||
{ \
|
||||
(prb)->read = (prb)->write = 0; \
|
||||
(prb)->size = (qsize); \
|
||||
}
|
||||
|
||||
#define RB_PUT(prb, value) \
|
||||
{ \
|
||||
if (!RB_FULL( prb )) { \
|
||||
(prb)->queue[ (prb)->write & RB_MASK(prb) ] = value; \
|
||||
++((prb)->write); \
|
||||
} \
|
||||
else { \
|
||||
osal_assert(!RB_FULL(prb)); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define RB_GET(prb, value) \
|
||||
{ \
|
||||
if (!RB_EMPTY(prb)) { \
|
||||
value = (prb)->queue[ (prb)->read & RB_MASK(prb) ]; \
|
||||
++((prb)->read); \
|
||||
if (RB_EMPTY(prb)) { \
|
||||
(prb)->read = (prb)->write = 0; \
|
||||
} \
|
||||
} \
|
||||
else { \
|
||||
value = NULL; \
|
||||
osal_assert(!RB_EMPTY(prb)); \
|
||||
} \
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
typedef VOID (*P_TIMEOUT_HANDLER)(ULONG);
|
||||
typedef INT32 (*P_COND)(VOID *);
|
||||
|
||||
typedef struct _OSAL_TIMER_
|
||||
{
|
||||
struct timer_list timer;
|
||||
P_TIMEOUT_HANDLER timeoutHandler;
|
||||
ULONG timeroutHandlerData;
|
||||
}OSAL_TIMER, *P_OSAL_TIMER;
|
||||
|
||||
typedef struct _OSAL_UNSLEEPABLE_LOCK_
|
||||
{
|
||||
spinlock_t lock;
|
||||
ULONG flag;
|
||||
}OSAL_UNSLEEPABLE_LOCK, *P_OSAL_UNSLEEPABLE_LOCK;
|
||||
|
||||
typedef struct _OSAL_SLEEPABLE_LOCK_
|
||||
{
|
||||
struct mutex lock;
|
||||
}OSAL_SLEEPABLE_LOCK, *P_OSAL_SLEEPABLE_LOCK;
|
||||
|
||||
|
||||
typedef struct _OSAL_SIGNAL_
|
||||
{
|
||||
struct completion comp;
|
||||
UINT32 timeoutValue;
|
||||
}OSAL_SIGNAL, *P_OSAL_SIGNAL;
|
||||
|
||||
|
||||
typedef struct _OSAL_EVENT_
|
||||
{
|
||||
wait_queue_head_t waitQueue;
|
||||
// VOID *pWaitQueueData;
|
||||
UINT32 timeoutValue;
|
||||
INT32 waitFlag;
|
||||
|
||||
}OSAL_EVENT, *P_OSAL_EVENT;
|
||||
|
||||
typedef struct _OSAL_THREAD_
|
||||
{
|
||||
struct task_struct *pThread;
|
||||
VOID *pThreadFunc;
|
||||
VOID *pThreadData;
|
||||
char threadName[MAX_THREAD_NAME_LEN];
|
||||
}OSAL_THREAD, *P_OSAL_THREAD;
|
||||
|
||||
typedef struct _OSAL_FIFO_
|
||||
{
|
||||
/*fifo definition*/
|
||||
VOID *pFifoBody;
|
||||
spinlock_t fifoSpinlock;
|
||||
/*fifo operations*/
|
||||
INT32 (*FifoInit)(struct _OSAL_FIFO_ *pFifo, UINT8 *buf, UINT32);
|
||||
INT32 (*FifoDeInit)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoReset)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoSz)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoAvailSz)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoLen)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoIsEmpty)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoIsFull)(struct _OSAL_FIFO_ *pFifo);
|
||||
INT32 (*FifoDataIn)(struct _OSAL_FIFO_ *pFifo, const VOID *buf, UINT32 len);
|
||||
INT32 (*FifoDataOut)(struct _OSAL_FIFO_ *pFifo, void *buf, UINT32 len);
|
||||
} OSAL_FIFO, *P_OSAL_FIFO;
|
||||
|
||||
typedef struct firmware osal_firmware;
|
||||
|
||||
typedef struct _OSAL_OP_DAT {
|
||||
UINT32 opId; // Event ID
|
||||
UINT32 u4InfoBit; // Reserved
|
||||
UINT32 au4OpData[OSAL_OP_DATA_SIZE]; // OP Data
|
||||
} OSAL_OP_DAT, *P_OSAL_OP_DAT;
|
||||
|
||||
typedef struct _OSAL_LXOP_ {
|
||||
OSAL_OP_DAT op;
|
||||
OSAL_SIGNAL signal;
|
||||
INT32 result;
|
||||
} OSAL_OP, *P_OSAL_OP;
|
||||
|
||||
typedef struct _OSAL_LXOP_Q {
|
||||
OSAL_SLEEPABLE_LOCK sLock;
|
||||
UINT32 write;
|
||||
UINT32 read;
|
||||
UINT32 size;
|
||||
P_OSAL_OP queue[OSAL_OP_BUF_SIZE];
|
||||
} OSAL_OP_Q, *P_OSAL_OP_Q;
|
||||
|
||||
typedef struct _OSAL_WAKE_LOCK_
|
||||
{
|
||||
struct wake_lock wake_lock;
|
||||
UINT8 name[MAX_WAKE_LOCK_NAME_LEN];
|
||||
} OSAL_WAKE_LOCK, *P_OSAL_WAKE_LOCK;
|
||||
#if 1
|
||||
typedef struct _OSAL_BIT_OP_VAR_
|
||||
{
|
||||
ULONG data;
|
||||
OSAL_UNSLEEPABLE_LOCK opLock;
|
||||
}OSAL_BIT_OP_VAR, *P_OSAL_BIT_OP_VAR;
|
||||
#else
|
||||
#define OSAL_BIT_OP_VAR ULONG
|
||||
#define P_OSAL_BIT_OP_VAR ULONG*
|
||||
|
||||
|
||||
#endif
|
||||
typedef UINT32 (*P_OSAL_EVENT_CHECKER)(P_OSAL_THREAD pThread);
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
extern UINT32 osal_strlen(const char *str);
|
||||
extern INT32 osal_strcmp(const char *dst, const char *src);
|
||||
extern INT32 osal_strncmp(const char *dst, const char *src, UINT32 len);
|
||||
extern char * osal_strcpy(char *dst, const char *src);
|
||||
extern char * osal_strncpy(char *dst, const char *src, UINT32 len);
|
||||
extern char * osal_strcat(char *dst, const char *src);
|
||||
extern char * osal_strncat(char *dst, const char *src, UINT32 len);
|
||||
extern char * osal_strchr(const char *str, UINT8 c);
|
||||
extern char * osal_strsep(char **str, const char *c);
|
||||
extern void osal_bug_on(unsigned long val);
|
||||
|
||||
extern LONG osal_strtol(const char *str, char **c, UINT32 adecimal);
|
||||
extern INT32 osal_snprintf(char *buf, UINT32 len, const char*fmt, ...);
|
||||
|
||||
extern INT32 osal_print(const char *str, ...);
|
||||
extern INT32 osal_dbg_print(const char *str, ...);
|
||||
|
||||
|
||||
extern INT32 osal_dbg_assert(INT32 expr, const char *file, INT32 line);
|
||||
extern INT32 osal_sprintf(char *str, const char *format, ...);
|
||||
extern VOID* osal_malloc(UINT32 size);
|
||||
extern VOID osal_free(const VOID *dst);
|
||||
extern VOID* osal_memset(VOID *buf, INT32 i, UINT32 len);
|
||||
extern VOID* osal_memcpy(VOID *dst, const VOID *src, UINT32 len);
|
||||
extern INT32 osal_memcmp(const VOID *buf1, const VOID *buf2, UINT32 len);
|
||||
|
||||
extern INT32 osal_msleep(UINT32 ms);
|
||||
|
||||
extern INT32 osal_timer_create(P_OSAL_TIMER);
|
||||
extern INT32 osal_timer_start(P_OSAL_TIMER, UINT32);
|
||||
extern INT32 osal_timer_stop(P_OSAL_TIMER);
|
||||
extern INT32 osal_timer_stop_sync(P_OSAL_TIMER pTimer);
|
||||
extern INT32 osal_timer_modify(P_OSAL_TIMER, UINT32);
|
||||
extern INT32 osal_timer_delete(P_OSAL_TIMER);
|
||||
|
||||
extern INT32 osal_fifo_init(P_OSAL_FIFO pFifo, UINT8 *buffer, UINT32 size);
|
||||
extern VOID osal_fifo_deinit(P_OSAL_FIFO pFifo);
|
||||
extern INT32 osal_fifo_reset(P_OSAL_FIFO pFifo);
|
||||
extern UINT32 osal_fifo_in(P_OSAL_FIFO pFifo, PUINT8 buffer, UINT32 size);
|
||||
extern UINT32 osal_fifo_out(P_OSAL_FIFO pFifo, PUINT8 buffer, UINT32 size);
|
||||
extern UINT32 osal_fifo_len(P_OSAL_FIFO pFifo);
|
||||
extern UINT32 osal_fifo_sz(P_OSAL_FIFO pFifo);
|
||||
extern UINT32 osal_fifo_avail(P_OSAL_FIFO pFifo);
|
||||
extern UINT32 osal_fifo_is_empty(P_OSAL_FIFO pFifo);
|
||||
extern UINT32 osal_fifo_is_full(P_OSAL_FIFO pFifo);
|
||||
|
||||
extern INT32 osal_wake_lock_init(P_OSAL_WAKE_LOCK plock);
|
||||
extern INT32 osal_wake_lock(P_OSAL_WAKE_LOCK plock);
|
||||
extern INT32 osal_wake_unlock(P_OSAL_WAKE_LOCK plock);
|
||||
extern INT32 osal_wake_lock_count(P_OSAL_WAKE_LOCK plock);
|
||||
|
||||
#if defined(CONFIG_PROVE_LOCKING)
|
||||
#define osal_unsleepable_lock_init(l) { spin_lock_init(&((l)->lock));}
|
||||
#else
|
||||
extern INT32 osal_unsleepable_lock_init (P_OSAL_UNSLEEPABLE_LOCK );
|
||||
#endif
|
||||
extern INT32 osal_lock_unsleepable_lock (P_OSAL_UNSLEEPABLE_LOCK );
|
||||
extern INT32 osal_unlock_unsleepable_lock (P_OSAL_UNSLEEPABLE_LOCK );
|
||||
extern INT32 osal_unsleepable_lock_deinit (P_OSAL_UNSLEEPABLE_LOCK );
|
||||
|
||||
#if defined(CONFIG_PROVE_LOCKING)
|
||||
#define osal_sleepable_lock_init(l) { mutex_init(&((l)->lock));}
|
||||
#else
|
||||
extern INT32 osal_sleepable_lock_init (P_OSAL_SLEEPABLE_LOCK );
|
||||
#endif
|
||||
extern INT32 osal_lock_sleepable_lock (P_OSAL_SLEEPABLE_LOCK );
|
||||
extern INT32 osal_unlock_sleepable_lock (P_OSAL_SLEEPABLE_LOCK );
|
||||
extern INT32 osal_sleepable_lock_deinit (P_OSAL_SLEEPABLE_LOCK );
|
||||
|
||||
extern INT32 osal_signal_init (P_OSAL_SIGNAL);
|
||||
extern INT32 osal_wait_for_signal (P_OSAL_SIGNAL);
|
||||
extern INT32
|
||||
osal_wait_for_signal_timeout (
|
||||
P_OSAL_SIGNAL
|
||||
);
|
||||
extern INT32
|
||||
osal_raise_signal (
|
||||
P_OSAL_SIGNAL
|
||||
);
|
||||
extern INT32
|
||||
osal_signal_deinit (
|
||||
P_OSAL_SIGNAL
|
||||
);
|
||||
|
||||
extern INT32 osal_event_init(P_OSAL_EVENT);
|
||||
extern INT32 osal_wait_for_event(P_OSAL_EVENT, P_COND , void *);
|
||||
extern INT32 osal_wait_for_event_timeout(P_OSAL_EVENT , P_COND , void *);
|
||||
extern INT32 osal_trigger_event(P_OSAL_EVENT);
|
||||
|
||||
extern INT32 osal_event_deinit (P_OSAL_EVENT);
|
||||
|
||||
extern INT32 osal_thread_create(P_OSAL_THREAD);
|
||||
extern INT32 osal_thread_run(P_OSAL_THREAD);
|
||||
extern INT32 osal_thread_should_stop(P_OSAL_THREAD);
|
||||
extern INT32 osal_thread_stop(P_OSAL_THREAD);
|
||||
/*extern INT32 osal_thread_wait_for_event(P_OSAL_THREAD, P_OSAL_EVENT);*/
|
||||
extern INT32 osal_thread_wait_for_event(P_OSAL_THREAD, P_OSAL_EVENT, P_OSAL_EVENT_CHECKER);
|
||||
/*check pOsalLxOp and OSAL_THREAD_SHOULD_STOP*/
|
||||
extern INT32 osal_thread_destroy(P_OSAL_THREAD);
|
||||
|
||||
extern INT32 osal_clear_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData);
|
||||
extern INT32 osal_set_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData);
|
||||
extern INT32 osal_test_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData);
|
||||
extern INT32 osal_test_and_clear_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData);
|
||||
extern INT32 osal_test_and_set_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData);
|
||||
|
||||
extern INT32 osal_dbg_assert_aee(const char *module, const char *detail_description);
|
||||
extern INT32 osal_gettimeofday(PINT32 sec, PINT32 usec);
|
||||
extern INT32 osal_printtimeofday(const PUINT8 prefix);
|
||||
|
||||
extern VOID
|
||||
osal_buffer_dump (
|
||||
const UINT8 *buf,
|
||||
const UINT8 *title,
|
||||
UINT32 len,
|
||||
UINT32 limit
|
||||
);
|
||||
|
||||
extern UINT32 osal_op_get_id(P_OSAL_OP pOp);
|
||||
extern MTK_WCN_BOOL osal_op_is_wait_for_signal(P_OSAL_OP pOp);
|
||||
extern VOID osal_op_raise_signal(P_OSAL_OP pOp, INT32 result);
|
||||
|
||||
extern UINT16 osal_crc16(const UINT8 *buffer, const UINT32 length);
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define osal_err_print(fmt, arg...) osal_print(KERN_ERR fmt, ##arg)
|
||||
#define osal_warn_print(fmt, arg...) osal_print(KERN_ERR fmt, ##arg)
|
||||
#define osal_info_print(fmt, arg...) osal_print(KERN_ERR fmt, ##arg)
|
||||
#define osal_load_print(fmt, arg...) osal_print(KERN_DEBUG fmt, ##arg)
|
||||
#define osal_assert(condition) if (!(condition)) {osal_err_print("%s, %d, (%s)\n", __FILE__, __LINE__, #condition);}
|
||||
|
||||
#endif /* _OSAL_H_ */
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _OSAL_TYPEDEF_H_
|
||||
#define _OSAL_TYPEDEF_H_
|
||||
|
||||
typedef void VOID;
|
||||
typedef void *PVOID;
|
||||
|
||||
typedef char CHAR;
|
||||
typedef char *PCHAR;
|
||||
typedef signed char INT8;
|
||||
typedef signed char *PINT8;
|
||||
typedef unsigned char UINT8;
|
||||
typedef unsigned char *PUINT8;
|
||||
typedef unsigned char UCHAR;
|
||||
typedef unsigned char *PUCHAR;
|
||||
|
||||
typedef signed short INT16;
|
||||
typedef signed short *PINT16;
|
||||
typedef unsigned short UINT16;
|
||||
typedef unsigned short *PUINT16;
|
||||
|
||||
typedef signed long LONG;
|
||||
typedef signed long *PLONG;
|
||||
|
||||
typedef signed int INT32;
|
||||
typedef signed int *PINT32;
|
||||
typedef unsigned int UINT32;
|
||||
typedef unsigned int *PUINT32;
|
||||
|
||||
typedef unsigned long ULONG;
|
||||
typedef unsigned long *PULONG;
|
||||
|
||||
typedef int MTK_WCN_BOOL;
|
||||
#ifndef MTK_WCN_BOOL_TRUE
|
||||
#define MTK_WCN_BOOL_FALSE ((MTK_WCN_BOOL) 0)
|
||||
#define MTK_WCN_BOOL_TRUE ((MTK_WCN_BOOL) 1)
|
||||
#endif
|
||||
|
||||
#endif /*_OSAL_TYPEDEF_H_*/
|
||||
|
||||
@@ -1,229 +0,0 @@
|
||||
#ifndef _STP_DEBUG_H_
|
||||
#define _STP_DEBUG_H_
|
||||
|
||||
#include <linux/time.h>
|
||||
#include "osal.h"
|
||||
|
||||
#define CONFIG_LOG_STP_INTERNAL
|
||||
|
||||
#if 1//#ifndef CONFIG_LOG_STP_INTERNAL
|
||||
#define STP_PKT_SZ 16
|
||||
#define STP_DMP_SZ 2048
|
||||
#define STP_PKT_NO 2048
|
||||
|
||||
#define STP_DBG_LOG_ENTRY_NUM 2048
|
||||
#define STP_DBG_LOG_ENTRY_SZ 2048
|
||||
|
||||
#else
|
||||
|
||||
#define STP_PKT_SZ 16
|
||||
#define STP_DMP_SZ 16
|
||||
#define STP_PKT_NO 16
|
||||
|
||||
#define STP_DBG_LOG_ENTRY_NUM 28
|
||||
#define STP_DBG_LOG_ENTRY_SZ 64
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
typedef enum {
|
||||
STP_DBG_EN = 0,
|
||||
STP_DBG_PKT = 1,
|
||||
STP_DBG_DR = 2,
|
||||
STP_DBG_FW_ASSERT = 3,
|
||||
STP_DBG_FW_LOG = 4,
|
||||
STP_DBG_FW_DMP = 5,
|
||||
STP_DBG_MAX
|
||||
}STP_DBG_OP_T;
|
||||
|
||||
typedef enum {
|
||||
STP_DBG_PKT_FIL_ALL = 0,
|
||||
STP_DBG_PKT_FIL_BT = 1,
|
||||
STP_DBG_PKT_FIL_GPS = 2,
|
||||
STP_DBG_PKT_FIL_FM = 3,
|
||||
STP_DBG_PKT_FIL_WMT = 4,
|
||||
STP_DBG_PKT_FIL_MAX
|
||||
} STP_DBG_PKT_FIL_T;
|
||||
|
||||
static char * const gStpDbgType[]={
|
||||
"< BT>",
|
||||
"< FM>",
|
||||
"<GPS>",
|
||||
"<WiFi>",
|
||||
"<WMT>",
|
||||
"<STP>",
|
||||
"<DBG>",
|
||||
"<UNKOWN>"
|
||||
};
|
||||
|
||||
|
||||
typedef enum {
|
||||
STP_DBG_DR_MAX = 0,
|
||||
} STP_DBG_DR_FIL_T;
|
||||
|
||||
typedef enum {
|
||||
STP_DBG_FW_MAX = 0,
|
||||
} STP_DBG_FW_FIL_T;
|
||||
|
||||
typedef enum {
|
||||
PKT_DIR_RX = 0,
|
||||
PKT_DIR_TX
|
||||
} STP_DBG_PKT_DIR_T;
|
||||
|
||||
/*simple log system ++*/
|
||||
|
||||
typedef struct {
|
||||
int id; /*type: 0. pkt trace 1. fw info 2. assert info 3. trace32 dump . -1. linked to the the previous*/
|
||||
int len;
|
||||
char buffer[STP_DBG_LOG_ENTRY_SZ];
|
||||
} MTKSTP_LOG_ENTRY_T;
|
||||
|
||||
typedef struct log_sys {
|
||||
MTKSTP_LOG_ENTRY_T queue[STP_DBG_LOG_ENTRY_NUM];
|
||||
unsigned int size;
|
||||
unsigned int in;
|
||||
unsigned int out;
|
||||
spinlock_t lock;
|
||||
} MTKSTP_LOG_SYS_T;
|
||||
/*--*/
|
||||
|
||||
typedef struct stp_dbg_pkt_hdr{
|
||||
//packet information
|
||||
unsigned int sec;
|
||||
unsigned int usec;
|
||||
unsigned int dbg_type;
|
||||
unsigned int dmy;
|
||||
unsigned int no;
|
||||
unsigned int dir;
|
||||
|
||||
//packet content
|
||||
unsigned int type;
|
||||
unsigned int len;
|
||||
unsigned int ack;
|
||||
unsigned int seq;
|
||||
unsigned int chs;
|
||||
unsigned int crc;
|
||||
}STP_DBG_HDR_T;
|
||||
|
||||
typedef struct stp_dbg_pkt{
|
||||
struct stp_dbg_pkt_hdr hdr;
|
||||
unsigned char raw[STP_DMP_SZ];
|
||||
}STP_PACKET_T;
|
||||
|
||||
typedef struct mtkstp_dbg_t{
|
||||
/*log_sys*/
|
||||
int pkt_trace_no;
|
||||
void *btm;
|
||||
int is_enable;
|
||||
MTKSTP_LOG_SYS_T *logsys;
|
||||
}MTKSTP_DBG_T;
|
||||
|
||||
extern void aed_combo_exception(const int *, int, const int *, int, const char *);
|
||||
|
||||
#define STP_CORE_DUMP_TIMEOUT 5*60*1000 // default 5minutes
|
||||
#define STP_OJB_NAME_SZ 20
|
||||
#define STP_CORE_DUMP_INFO_SZ 500
|
||||
typedef enum wcn_compress_algorithm_t {
|
||||
GZIP = 0,
|
||||
BZIP2 = 1,
|
||||
RAR = 2,
|
||||
LMA = 3,
|
||||
MAX
|
||||
}WCN_COMPRESS_ALG_T;
|
||||
|
||||
typedef INT32 (*COMPRESS_HANDLER)(void *worker, UINT8 *in_buf, INT32 in_sz, UINT8 *out_buf, INT32 *out_sz, INT32 finish);
|
||||
typedef struct wcn_compressor_t {
|
||||
// current object name
|
||||
UINT8 name[STP_OJB_NAME_SZ + 1];
|
||||
|
||||
// buffer for raw data, named L1
|
||||
PUINT8 L1_buf;
|
||||
INT32 L1_buf_sz;
|
||||
INT32 L1_pos;
|
||||
|
||||
// target buffer, named L2
|
||||
PUINT8 L2_buf;
|
||||
INT32 L2_buf_sz;
|
||||
INT32 L2_pos;
|
||||
|
||||
// compress state
|
||||
UINT8 f_done;
|
||||
UINT16 reserved;
|
||||
UINT32 uncomp_size;
|
||||
UINT32 crc32;
|
||||
|
||||
// compress algorithm
|
||||
UINT8 f_compress_en;
|
||||
WCN_COMPRESS_ALG_T compress_type;
|
||||
void *worker;
|
||||
COMPRESS_HANDLER handler;
|
||||
}WCN_COMPRESSOR_T, *P_WCN_COMPRESSOR_T;
|
||||
|
||||
P_WCN_COMPRESSOR_T wcn_compressor_init(PUINT8 name, INT32 L1_buf_sz, INT32 L2_buf_sz);
|
||||
INT32 wcn_compressor_deinit(P_WCN_COMPRESSOR_T compressor);
|
||||
INT32 wcn_compressor_in(P_WCN_COMPRESSOR_T compressor, PUINT8 buf, INT32 len, INT32 finish);
|
||||
INT32 wcn_compressor_out(P_WCN_COMPRESSOR_T compressor, PUINT8 *pbuf, PINT32 len);
|
||||
INT32 wcn_compressor_reset(P_WCN_COMPRESSOR_T compressor, UINT8 enable, WCN_COMPRESS_ALG_T type);
|
||||
|
||||
typedef enum core_dump_state_t {
|
||||
CORE_DUMP_INIT = 0,
|
||||
CORE_DUMP_DOING,
|
||||
CORE_DUMP_TIMEOUT,
|
||||
CORE_DUMP_DONE,
|
||||
CORE_DUMP_MAX
|
||||
}CORE_DUMP_STA;
|
||||
|
||||
typedef struct core_dump_t {
|
||||
// compress dump data and buffered
|
||||
P_WCN_COMPRESSOR_T compressor;
|
||||
|
||||
// timer for monitor timeout
|
||||
OSAL_TIMER dmp_timer;
|
||||
UINT32 timeout;
|
||||
|
||||
OSAL_SLEEPABLE_LOCK dmp_lock;
|
||||
|
||||
// state machine for core dump flow
|
||||
CORE_DUMP_STA sm;
|
||||
|
||||
// dump info
|
||||
CHAR info[STP_CORE_DUMP_INFO_SZ + 1];
|
||||
} WCN_CORE_DUMP_T, *P_WCN_CORE_DUMP_T;
|
||||
|
||||
P_WCN_CORE_DUMP_T wcn_core_dump_init(UINT32 timeout);
|
||||
INT32 wcn_core_dump_deinit(P_WCN_CORE_DUMP_T dmp);
|
||||
INT32 wcn_core_dump_in(P_WCN_CORE_DUMP_T dmp, PUINT8 buf, INT32 len);
|
||||
INT32 wcn_core_dump_out(P_WCN_CORE_DUMP_T dmp, PUINT8 *pbuf, PINT32 len);
|
||||
INT32 wcn_core_dump_reset(P_WCN_CORE_DUMP_T dmp, UINT32 timeout);
|
||||
extern INT32 wcn_core_dump_flush(INT32 rst);
|
||||
|
||||
extern int stp_dbg_enable(MTKSTP_DBG_T *stp_dbg);
|
||||
extern int stp_dbg_disable(MTKSTP_DBG_T *stp_dbg);
|
||||
extern MTKSTP_DBG_T *stp_dbg_init(void *);
|
||||
extern int stp_dbg_deinit(MTKSTP_DBG_T *stp_dbg);
|
||||
extern int stp_dbg_dmp_out_ex (char *buf, int *len);
|
||||
extern int stp_dbg_dmp_out(MTKSTP_DBG_T *stp_dbg, char *buf, int *len);
|
||||
extern int stp_dbg_dmp_printk(MTKSTP_DBG_T *stp_dbg);
|
||||
extern char
|
||||
stp_dbg_nl_send(
|
||||
char * aucMsg,
|
||||
unsigned char cmd
|
||||
);
|
||||
|
||||
extern INT32 stp_dbg_aee_send(unsigned char *aucMsg, INT32 len, INT32 cmd);
|
||||
|
||||
extern int
|
||||
stp_dbg_log_pkt (
|
||||
MTKSTP_DBG_T *stp_dbg,
|
||||
int dbg_type,
|
||||
int type,
|
||||
int ack_no,
|
||||
int seq_no,
|
||||
int crc,
|
||||
int dir,
|
||||
int len,
|
||||
const unsigned char *body);
|
||||
extern int stp_dbg_log_ctrl (unsigned int on);
|
||||
#endif /* end of _STP_DEBUG_H_ */
|
||||
|
||||
@@ -1,252 +0,0 @@
|
||||
/*
|
||||
** $Id: $
|
||||
*/
|
||||
|
||||
/*! \file "stp_sdio.h"
|
||||
\brief
|
||||
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
** $Log: $
|
||||
*/
|
||||
|
||||
#ifndef _STP_SDIO_H
|
||||
#define _STP_SDIO_H
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#define KMALLOC_UPDATE 1
|
||||
|
||||
#if 0 // NO support for multiple STP-SDIO instances (multiple MT6620) on a single host
|
||||
#define STP_SDIO_HOST_COUNT (1)
|
||||
#define STP_SDIO_ONLY_ONE_HOST (0)
|
||||
#endif
|
||||
#define STP_SDIO_POLL_OWNBACK_INTR (1)
|
||||
|
||||
#define STP_SDIO_NEW_TXRING (0)
|
||||
/* George: Keep old (0) codes for debugging only!
|
||||
* Use new code (1) for SQC and MP!
|
||||
*/
|
||||
|
||||
#define STP_SDIO_OWN_THREAD (1)
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#include "osal.h"
|
||||
#include "hif_sdio.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
/* Common HIF register address */
|
||||
#define CCIR (0x0000)
|
||||
#define CHLPCR (0x0004)
|
||||
#define CSDIOCSR (0x0008)
|
||||
#define CHCR (0x000c)
|
||||
#define CHISR (0x0010)
|
||||
#define CHIER (0x0014)
|
||||
#define CTDR (0x0018)
|
||||
#define CRDR (0x001c)
|
||||
#define CTFSR (0x0020)
|
||||
#define CRPLR (0x0024)
|
||||
|
||||
/* Common HIF register bit field address */
|
||||
/* CHLPCR */
|
||||
#define C_FW_OWN_REQ_CLR (0x00000200)
|
||||
#define C_FW_OWN_REQ_SET (0x00000100)
|
||||
#define C_FW_INT_EN_CLR (0x00000002)
|
||||
#define C_FW_INT_EN_SET (0x00000001)
|
||||
#define C_FW_COM_DRV_OWN (0x00000100)
|
||||
|
||||
/* CHIER */
|
||||
#define CHISR_EN_15_7 (0x0000ff80)
|
||||
#define CHISR_EN_3_0 (0x0000000f)
|
||||
/* CHISR */
|
||||
#define RX_PKT_LEN (0xffff0000)
|
||||
#define FIRMWARE_INT (0x0000fe00)
|
||||
#define TX_FIFO_OVERFLOW (0x00000100)
|
||||
#define FW_INT_IND_INDICATOR (0x00000080)
|
||||
#define TX_COMPLETE_COUNT (0x00000070)
|
||||
#define TX_UNDER_THOLD (0x00000008)
|
||||
#define TX_EMPTY (0x00000004)
|
||||
#define RX_DONE (0x00000002)
|
||||
#define FW_OWN_BACK_INT (0x00000001)
|
||||
|
||||
/* hardware settings */
|
||||
#define STP_SDIO_TX_FIFO_SIZE (2080UL)
|
||||
#define STP_SDIO_RX_FIFO_SIZE (2304UL) /* 256*9 */
|
||||
#define STP_SDIO_TX_PKT_MAX_CNT (7) /* Max outstanding tx pkt count, as defined in TX_COMPLETE_COUNT */
|
||||
#define STP_SDIO_HDR_SIZE (4) /* hw,fw,sw follow the same format: 2 bytes length + 2 bytes reserved */
|
||||
|
||||
/* sdio bus settings */
|
||||
#define STP_SDIO_BLK_SIZE (512UL)
|
||||
|
||||
/* software driver settings */
|
||||
#define STP_SDIO_TX_BUF_CNT (16UL)/*(7)*/
|
||||
#define STP_SDIO_TX_BUF_CNT_MASK (STP_SDIO_TX_BUF_CNT - 1)
|
||||
#define STP_SDIO_TX_PKT_LIST_SIZE (STP_SDIO_TX_BUF_CNT) /* must be 2^x now... */
|
||||
#define STP_SDIO_TX_PKT_LIST_SIZE_MASK (STP_SDIO_TX_PKT_LIST_SIZE - 1)
|
||||
|
||||
/* tx buffer size for a single entry */
|
||||
/* George: SHALL BE a multiple of the used BLK_SIZE!! */
|
||||
#if 1
|
||||
/* round up: 512*5 = 2560 > 2080 */
|
||||
#define STP_SDIO_TX_ENTRY_SIZE ((STP_SDIO_TX_FIFO_SIZE + (STP_SDIO_BLK_SIZE - 1)) & ~(STP_SDIO_BLK_SIZE - 1))
|
||||
#else
|
||||
/* round down: 512*4 = 2048 < 2080 */
|
||||
#define STP_SDIO_TX_MAX_BLK_CNT (STP_SDIO_TX_FIFO_SIZE / STP_SDIO_BLK_SIZE)
|
||||
#define STP_SDIO_TX_ENTRY_SIZE (STP_SDIO_TX_MAX_BLK_CNT * STP_SDIO_BLK_SIZE)
|
||||
#endif
|
||||
|
||||
/*software rx buffer size */
|
||||
/*#define STP_SDIO_RX_BUF_SIZE (STP_SDIO_RX_FIFO_SIZE)*/
|
||||
/* George: SHALL BE a multiple of the used BLK_SIZE!! */
|
||||
#if 1
|
||||
/* round up: 512*5 = 2560 > 2304 */
|
||||
#define STP_SDIO_RX_BUF_SIZE ((STP_SDIO_RX_FIFO_SIZE + (STP_SDIO_BLK_SIZE - 1)) & ~(STP_SDIO_BLK_SIZE - 1))
|
||||
#else
|
||||
/* round down: 512*4 = 2048 < 2304 */
|
||||
#define STP_SDIO_RX_MAX_BLK_CNT (STP_SDIO_RX_FIFO_SIZE / STP_SDIO_BLK_SIZE)
|
||||
#define STP_SDIO_RX_BUF_SIZE (STP_SDIO_RX_MAX_BLK_CNT * STP_SDIO_BLK_SIZE)
|
||||
#endif
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
/* HIF's local packet buffer variables for Tx/Rx */
|
||||
typedef struct _MTK_WCN_STP_SDIO_PKT_BUF {
|
||||
/* Tx entry ring buffer. Entry size is aligned to SDIO block size. */
|
||||
#if KMALLOC_UPDATE
|
||||
UINT8 *tx_buf;
|
||||
#else
|
||||
UINT8 tx_buf[STP_SDIO_TX_BUF_CNT][STP_SDIO_TX_ENTRY_SIZE];
|
||||
#endif
|
||||
|
||||
/* Tx size ring buffer. Record valid data size in tx_buf. */
|
||||
UINT32 tx_buf_sz[STP_SDIO_TX_BUF_CNT];
|
||||
/* Tx debug timestamp: 1st time when the entry is filled with data */
|
||||
UINT32 tx_buf_ts[STP_SDIO_TX_BUF_CNT];
|
||||
#if KMALLOC_UPDATE
|
||||
UINT8 *rx_buf;
|
||||
#else
|
||||
UINT8 rx_buf[STP_SDIO_RX_BUF_SIZE]; /* Rx buffer (not ring) */
|
||||
#endif
|
||||
#if STP_SDIO_NEW_TXRING
|
||||
UINT32 wr_cnt; /* Tx entry ring buffer write count */
|
||||
UINT32 rd_cnt; /* Tx entry ring buffer read count */
|
||||
spinlock_t rd_cnt_lock; /* Tx entry ring buffer read count spin lock */
|
||||
#else
|
||||
UINT8 wr_idx; /* Tx ring buffer write index */ /*George: obsolete*/
|
||||
UINT8 rd_idx; /* Tx ring buffer read index *//*George: obsolete*/
|
||||
spinlock_t rd_idx_lock; /* spin lock for Tx ring buffer read index */
|
||||
#endif
|
||||
MTK_WCN_BOOL full_flag; /* Tx entry ring buffer full flag (TRUE: full, FALSE: not full) */
|
||||
/* save interrupt status flag for Tx entry ring buf spin lock */
|
||||
unsigned long rd_irq_flag;
|
||||
/* wait queue head for Tx entry ring buf full case */
|
||||
wait_queue_head_t fullwait_q;
|
||||
} MTK_WCN_STP_SDIO_PKT_BUF;
|
||||
|
||||
/* Tx packet list information */
|
||||
typedef struct _MTK_WCN_STP_SDIO_Tx_Pkt_LIST {
|
||||
UINT32 pkt_rd_cnt;
|
||||
UINT32 pkt_wr_cnt;
|
||||
UINT16 pkt_size_list[STP_SDIO_TX_PKT_LIST_SIZE]; /*max length is FIFO Size */
|
||||
UINT32 out_ts[STP_SDIO_TX_PKT_LIST_SIZE];
|
||||
UINT32 in_ts[STP_SDIO_TX_PKT_LIST_SIZE];
|
||||
} MTK_WCN_STP_SDIO_Tx_Pkt_LIST;
|
||||
|
||||
/* STP HIF firmware information */
|
||||
typedef struct _MTK_WCN_STP_SDIO_FIRMWARE_INFO {
|
||||
UINT32 tx_fifo_size; /* Current left tx FIFO size */
|
||||
UINT32 tx_packet_num; /* Current outstanding tx packet (0~7) */
|
||||
atomic_t tx_comp_num; /* Current total tx ok but fifo size not released packet count */
|
||||
} MTK_WCN_STP_SDIO_FIRMWARE_INFO;
|
||||
|
||||
/* STP SDIO private information */
|
||||
typedef struct _MTK_WCN_STP_SDIO_PRIVATE_INFO {
|
||||
UINT8 stp_sdio_host_idx;
|
||||
} MTK_WCN_STP_SDIO_PRIVATE_INFO;
|
||||
|
||||
/* STP SDIO host information */
|
||||
typedef struct _MTK_WCN_STP_SDIO_HIF_INFO {
|
||||
MTK_WCN_HIF_SDIO_CLTCTX sdio_cltctx;
|
||||
MTK_WCN_STP_SDIO_PKT_BUF pkt_buf;
|
||||
MTK_WCN_STP_SDIO_Tx_Pkt_LIST tx_pkt_list;
|
||||
UINT32 rx_pkt_len; /* George: use 32-bit for efficiency. Correct name to pkt for packet */
|
||||
MTK_WCN_STP_SDIO_FIRMWARE_INFO firmware_info;
|
||||
MTK_WCN_STP_SDIO_PRIVATE_INFO private_info;
|
||||
#if STP_SDIO_OWN_THREAD
|
||||
//struct tasklet_struct tx_rx_job;
|
||||
OSAL_THREAD tx_rx_thread;
|
||||
INT32 irq_pending;
|
||||
INT32 sleep_flag;
|
||||
INT32 wakeup_flag;
|
||||
INT32 awake_flag;
|
||||
OSAL_EVENT tx_rx_event;
|
||||
OSAL_SIGNAL isr_check_complete;
|
||||
#endif
|
||||
struct work_struct tx_work;
|
||||
struct work_struct rx_work;
|
||||
} MTK_WCN_STP_SDIO_HIF_INFO;
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
/* STP_SDIO_TX_PKT_LIST_SIZE must be 2^x */
|
||||
#define STP_SDIO_GET_PKT_AR_IDX(idx) ((idx) & STP_SDIO_TX_PKT_LIST_SIZE_MASK)
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief MTK hif sdio client registration function
|
||||
*
|
||||
* Client uses this function to do hif sdio registration
|
||||
*
|
||||
* \param pinfo a pointer of client's information
|
||||
*
|
||||
* \retval 0 register successfully
|
||||
* \retval < 0 error code
|
||||
*/
|
||||
extern INT32
|
||||
mtk_wcn_hif_sdio_client_reg (
|
||||
const MTK_WCN_HIF_SDIO_CLTINFO *pinfo
|
||||
);
|
||||
|
||||
extern INT32
|
||||
mtk_wcn_stp_sdio_do_own_clr (void);
|
||||
|
||||
//extern INT32
|
||||
//mtk_wcn_stp_sdio_do_own_set (void);
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
#endif /* _STP_SDIO_H */
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
|
||||
|
||||
#ifndef _WMT_DEV_H_
|
||||
#define _WMT_DEV_H_
|
||||
|
||||
|
||||
#include "osal.h"
|
||||
|
||||
extern VOID wmt_dev_rx_event_cb (VOID);
|
||||
extern INT32 wmt_dev_rx_timeout (P_OSAL_EVENT pEvent);
|
||||
extern INT32 wmt_dev_patch_get (UCHAR *pPatchName, osal_firmware **ppPatch,INT32 padSzBuf);
|
||||
extern INT32 wmt_dev_patch_put(osal_firmware **ppPatch);
|
||||
extern VOID wmt_dev_patch_info_free(VOID);
|
||||
|
||||
|
||||
#endif /*_WMT_DEV_H_*/
|
||||
@@ -1,20 +0,0 @@
|
||||
#ifndef _WMT_TM_H
|
||||
#define _WMT_TM_H
|
||||
#if WMT_PLAT_ALPS
|
||||
|
||||
#define CONFIG_THERMAL_OPEN
|
||||
#if defined(CONFIG_THERMAL) && defined(CONFIG_THERMAL_OPEN)
|
||||
|
||||
struct wmt_thermal_ctrl_ops {
|
||||
int (*query_temp)(void);
|
||||
int (*set_temp)(int);
|
||||
};
|
||||
|
||||
int wmt_tm_init(struct wmt_thermal_ctrl_ops *ops);
|
||||
int wmt_tm_deinit(void);
|
||||
int wmt_tm_init_rt(void);
|
||||
int wmt_tm_deinit_rt(void);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,514 +0,0 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/delay.h>
|
||||
#include "stp_exp.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
#define BT_DRIVER_NAME "mtk_stp_BT_chrdev"
|
||||
#define BT_DEV_MAJOR 192 // never used number
|
||||
|
||||
#define PFX "[MTK-BT] "
|
||||
#define BT_LOG_DBG 3
|
||||
#define BT_LOG_INFO 2
|
||||
#define BT_LOG_WARN 1
|
||||
#define BT_LOG_ERR 0
|
||||
|
||||
#define COMBO_IOC_BT_HWVER 6
|
||||
|
||||
#define COMBO_IOC_MAGIC 0xb0
|
||||
#define COMBO_IOCTL_FW_ASSERT _IOWR(COMBO_IOC_MAGIC, 0, void*)
|
||||
|
||||
unsigned int gDbgLevel = BT_LOG_INFO;
|
||||
|
||||
#define BT_DBG_FUNC(fmt, arg...) if(gDbgLevel >= BT_LOG_DBG){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define BT_INFO_FUNC(fmt, arg...) if(gDbgLevel >= BT_LOG_INFO){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define BT_WARN_FUNC(fmt, arg...) if(gDbgLevel >= BT_LOG_WARN){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define BT_ERR_FUNC(fmt, arg...) if(gDbgLevel >= BT_LOG_ERR){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define BT_TRC_FUNC(f) if(gDbgLevel >= BT_LOG_DBG){printk(PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
#define VERSION "1.0"
|
||||
#define BT_NVRAM_CUSTOM_NAME "/data/BT_Addr"
|
||||
|
||||
static int BT_devs = 1; /* device count */
|
||||
static int BT_major = BT_DEV_MAJOR; /* dynamic allocation */
|
||||
module_param(BT_major, uint, 0);
|
||||
static struct cdev BT_cdev;
|
||||
|
||||
static unsigned char i_buf[MTKSTP_BUFFER_SIZE]; // input buffer of read()
|
||||
static unsigned char o_buf[MTKSTP_BUFFER_SIZE]; // output buffer of write()
|
||||
static struct semaphore wr_mtx, rd_mtx;
|
||||
static wait_queue_head_t inq; /* read queues */
|
||||
static DECLARE_WAIT_QUEUE_HEAD(BT_wq);
|
||||
static int flag = 0;
|
||||
volatile int retflag = 0;
|
||||
|
||||
unsigned char g_bt_bd_addr[10]={0x01,0x1a,0xfc,0x06,0x00,0x55,0x66,0x77,0x88,0x00};
|
||||
unsigned char g_nvram_btdata[8];
|
||||
|
||||
static int nvram_read(char *filename, char *buf, ssize_t len, int offset)
|
||||
{
|
||||
struct file *fd;
|
||||
//ssize_t ret;
|
||||
int retLen = -1;
|
||||
|
||||
mm_segment_t old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
|
||||
fd = filp_open(filename, O_WRONLY|O_CREAT, 0644);
|
||||
|
||||
if(IS_ERR(fd)) {
|
||||
BT_ERR_FUNC("failed to open!!\n");
|
||||
return -1;
|
||||
}
|
||||
do{
|
||||
if ((fd->f_op == NULL) || (fd->f_op->read == NULL))
|
||||
{
|
||||
BT_ERR_FUNC("file can not be read!!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (fd->f_pos != offset) {
|
||||
if (fd->f_op->llseek) {
|
||||
if(fd->f_op->llseek(fd, offset, 0) != offset) {
|
||||
BT_ERR_FUNC("[nvram_read] : failed to seek!!\n");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
fd->f_pos = offset;
|
||||
}
|
||||
}
|
||||
|
||||
retLen = fd->f_op->read(fd,
|
||||
buf,
|
||||
len,
|
||||
&fd->f_pos);
|
||||
|
||||
}while(false);
|
||||
|
||||
filp_close(fd, NULL);
|
||||
|
||||
set_fs(old_fs);
|
||||
|
||||
return retLen;
|
||||
}
|
||||
|
||||
|
||||
int platform_load_nvram_data( char * filename, char * buf, int len)
|
||||
{
|
||||
//int ret;
|
||||
BT_INFO_FUNC("platform_load_nvram_data ++ BDADDR\n");
|
||||
|
||||
return nvram_read( filename, buf, len, 0);
|
||||
}
|
||||
|
||||
static void bt_cdev_rst_cb(
|
||||
ENUM_WMTDRV_TYPE_T src,
|
||||
ENUM_WMTDRV_TYPE_T dst,
|
||||
ENUM_WMTMSG_TYPE_T type,
|
||||
void *buf,
|
||||
unsigned int sz){
|
||||
|
||||
/*
|
||||
To handle reset procedure please
|
||||
*/
|
||||
ENUM_WMTRSTMSG_TYPE_T rst_msg;
|
||||
|
||||
BT_INFO_FUNC("sizeof(ENUM_WMTRSTMSG_TYPE_T) = %d\n", sizeof(ENUM_WMTRSTMSG_TYPE_T));
|
||||
if(sz <= sizeof(ENUM_WMTRSTMSG_TYPE_T)){
|
||||
memcpy((char *)&rst_msg, (char *)buf, sz);
|
||||
BT_INFO_FUNC("src = %d, dst = %d, type = %d, buf = 0x%x sz = %d, max = %d\n", src, dst, type, rst_msg, sz, WMTRSTMSG_RESET_MAX);
|
||||
if((src == WMTDRV_TYPE_WMT) &&
|
||||
(dst == WMTDRV_TYPE_BT) &&
|
||||
(type == WMTMSG_TYPE_RESET)){
|
||||
if(rst_msg == WMTRSTMSG_RESET_START){
|
||||
BT_INFO_FUNC("BT restart start!\n");
|
||||
retflag = 1;
|
||||
wake_up_interruptible(&inq);
|
||||
/*reset_start message handling*/
|
||||
|
||||
} else if(rst_msg == WMTRSTMSG_RESET_END){
|
||||
BT_INFO_FUNC("BT restart end!\n");
|
||||
retflag = 2;
|
||||
wake_up_interruptible(&inq);
|
||||
/*reset_end message handling*/
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*message format invalid*/
|
||||
BT_INFO_FUNC("message format invalid!\n");
|
||||
}
|
||||
}
|
||||
|
||||
void BT_event_cb(void)
|
||||
{
|
||||
BT_DBG_FUNC("BT_event_cb() \n");
|
||||
|
||||
flag = 1;
|
||||
wake_up(&BT_wq);
|
||||
|
||||
/* finally, awake any reader */
|
||||
wake_up_interruptible(&inq); /* blocked in read() and select() */
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
unsigned int BT_poll(struct file *filp, poll_table *wait)
|
||||
{
|
||||
unsigned int mask = 0;
|
||||
|
||||
// down(&wr_mtx);
|
||||
/*
|
||||
* The buffer is circular; it is considered full
|
||||
* if "wp" is right behind "rp". "left" is 0 if the
|
||||
* buffer is empty, and it is "1" if it is completely full.
|
||||
*/
|
||||
if (mtk_wcn_stp_is_rxqueue_empty(BT_TASK_INDX))
|
||||
{
|
||||
poll_wait(filp, &inq, wait);
|
||||
|
||||
/* empty let select sleep */
|
||||
if((!mtk_wcn_stp_is_rxqueue_empty(BT_TASK_INDX)) || retflag)
|
||||
{
|
||||
mask |= POLLIN | POLLRDNORM; /* readable */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mask |= POLLIN | POLLRDNORM; /* readable */
|
||||
}
|
||||
|
||||
/* do we need condition? */
|
||||
mask |= POLLOUT | POLLWRNORM; /* writable */
|
||||
// up(&wr_mtx);
|
||||
return mask;
|
||||
}
|
||||
|
||||
|
||||
ssize_t BT_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
int retval = 0;
|
||||
int written = 0;
|
||||
down(&wr_mtx);
|
||||
|
||||
BT_DBG_FUNC("%s: count %d pos %lld\n", __func__, count, *f_pos);
|
||||
if(retflag)
|
||||
{
|
||||
if (retflag == 1) //reset start
|
||||
{
|
||||
retval = -88;
|
||||
BT_INFO_FUNC("MT662x reset Write: start\n");
|
||||
}
|
||||
else if (retflag == 2) // reset end
|
||||
{
|
||||
retval = -99;
|
||||
BT_INFO_FUNC("MT662x reset Write: end\n");
|
||||
}
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
int copy_size = (count < MTKSTP_BUFFER_SIZE) ? count : MTKSTP_BUFFER_SIZE;
|
||||
if (copy_from_user(&o_buf[0], &buf[0], copy_size))
|
||||
{
|
||||
retval = -EFAULT;
|
||||
goto OUT;
|
||||
}
|
||||
//printk("%02x ", val);
|
||||
|
||||
written = mtk_wcn_stp_send_data(&o_buf[0], copy_size, BT_TASK_INDX);
|
||||
if(0 == written)
|
||||
{
|
||||
retval = -ENOSPC;
|
||||
/*no windowspace in STP is available, native process should not call BT_write with no delay at all*/
|
||||
BT_ERR_FUNC("target packet length:%d, write success length:%d, retval = %d.\n", count, written, retval);
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = written;
|
||||
}
|
||||
|
||||
}else
|
||||
{
|
||||
retval = -EFAULT;
|
||||
BT_ERR_FUNC("target packet length:%d is not allowed, retval = %d.\n", count, retval);
|
||||
}
|
||||
|
||||
OUT:
|
||||
up(&wr_mtx);
|
||||
return (retval);
|
||||
}
|
||||
|
||||
ssize_t BT_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
down(&rd_mtx);
|
||||
|
||||
BT_DBG_FUNC("BT_read(): count %d pos %lld\n", count, *f_pos);
|
||||
if(retflag)
|
||||
{
|
||||
if (retflag == 1) //reset start
|
||||
{
|
||||
retval = -88;
|
||||
BT_INFO_FUNC("MT662x reset Read: start\n");
|
||||
}
|
||||
else if (retflag == 2) // reset end
|
||||
{
|
||||
retval = -99;
|
||||
BT_INFO_FUNC("MT662x reset Read: end\n");
|
||||
}
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
if(count > MTKSTP_BUFFER_SIZE)
|
||||
{
|
||||
count = MTKSTP_BUFFER_SIZE;
|
||||
}
|
||||
retval = mtk_wcn_stp_receive_data(i_buf, count, BT_TASK_INDX);
|
||||
|
||||
while(retval == 0) // got nothing, wait for STP's signal
|
||||
{
|
||||
/*If nonblocking mode, return directly O_NONBLOCK is specified during open() */
|
||||
if (filp->f_flags & O_NONBLOCK){
|
||||
BT_DBG_FUNC("Non-blocking BT_read() \n");
|
||||
retval = -EAGAIN;
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
BT_DBG_FUNC("BT_read(): wait_event 1\n");
|
||||
wait_event(BT_wq, flag != 0);
|
||||
BT_DBG_FUNC("BT_read(): wait_event 2\n");
|
||||
flag = 0;
|
||||
retval = mtk_wcn_stp_receive_data(i_buf, count, BT_TASK_INDX);
|
||||
BT_DBG_FUNC("BT_read(): mtk_wcn_stp_receive_data() = %d\n", retval);
|
||||
}
|
||||
|
||||
// we got something from STP driver
|
||||
if (copy_to_user(buf, i_buf, retval))
|
||||
{
|
||||
retval = -EFAULT;
|
||||
goto OUT;
|
||||
}
|
||||
|
||||
OUT:
|
||||
up(&rd_mtx);
|
||||
BT_DBG_FUNC("BT_read(): retval = %d\n", retval);
|
||||
return (retval);
|
||||
}
|
||||
|
||||
//int BT_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
long BT_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
MTK_WCN_BOOL bRet = MTK_WCN_BOOL_TRUE;
|
||||
|
||||
ENUM_WMTHWVER_TYPE_T hw_ver_sym = WMTHWVER_INVALID;
|
||||
BT_DBG_FUNC("BT_ioctl(): cmd (%d)\n", cmd);
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
#if 0
|
||||
case 0: // enable/disable STP
|
||||
/* George: STP is controlled by WMT only */
|
||||
/* mtk_wcn_stp_enable(arg); */
|
||||
break;
|
||||
#endif
|
||||
case 1: // send raw data
|
||||
BT_DBG_FUNC("BT_ioctl(): disable raw data from BT dev \n");
|
||||
retval = -EINVAL;
|
||||
break;
|
||||
case COMBO_IOC_BT_HWVER:
|
||||
/*get combo hw version*/
|
||||
hw_ver_sym = mtk_wcn_wmt_hwver_get();
|
||||
|
||||
BT_INFO_FUNC("BT_ioctl(): get hw version = %d, sizeof(hw_ver_sym) = %d\n", hw_ver_sym, sizeof(hw_ver_sym));
|
||||
if(copy_to_user((int __user *)arg, &hw_ver_sym, sizeof(hw_ver_sym))){
|
||||
retval = -EFAULT;
|
||||
}
|
||||
break;
|
||||
|
||||
case COMBO_IOCTL_FW_ASSERT:
|
||||
/* BT trigger fw assert for debug*/
|
||||
BT_INFO_FUNC("BT Set fw assert......\n");
|
||||
bRet = mtk_wcn_wmt_assert();
|
||||
if (bRet == MTK_WCN_BOOL_TRUE) {
|
||||
BT_INFO_FUNC("BT Set fw assert OK\n");
|
||||
retval = 0;
|
||||
} else {
|
||||
BT_INFO_FUNC("BT Set fw assert Failed\n");
|
||||
retval = (-1000);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
retval = -EFAULT;
|
||||
BT_DBG_FUNC("BT_ioctl(): unknown cmd (%d)\n", cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int BT_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
BT_INFO_FUNC("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
if(current->pid ==1)
|
||||
return 0;
|
||||
#if 1 /* GeorgeKuo: turn on function before check stp ready */
|
||||
/* turn on BT */
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_BT)) {
|
||||
BT_WARN_FUNC("WMT turn on BT fail!\n");
|
||||
return -ENODEV;
|
||||
}else{
|
||||
retflag = 0;
|
||||
mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_BT, bt_cdev_rst_cb);
|
||||
BT_INFO_FUNC("WMT register BT rst cb!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mtk_wcn_stp_is_ready()) {
|
||||
#if 0 /* GeorgeKuo: turn on function before check stp ready */
|
||||
/* turn on BT */
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_BT)) {
|
||||
BT_WARN_FUNC("WMT turn on BT fail!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
mtk_wcn_stp_set_bluez(0);
|
||||
|
||||
BT_INFO_FUNC("Now it's in MTK Bluetooth Mode\n");
|
||||
BT_INFO_FUNC("WMT turn on BT OK!\n");
|
||||
BT_INFO_FUNC("STP is ready!\n");
|
||||
platform_load_nvram_data(BT_NVRAM_CUSTOM_NAME,
|
||||
(char *)&g_nvram_btdata, sizeof(g_nvram_btdata));
|
||||
|
||||
BT_INFO_FUNC("Read NVRAM : BD address %02x%02x%02x%02x%02x%02x Cap 0x%02x Codec 0x%02x\n",
|
||||
g_nvram_btdata[0], g_nvram_btdata[1], g_nvram_btdata[2],
|
||||
g_nvram_btdata[3], g_nvram_btdata[4], g_nvram_btdata[5],
|
||||
g_nvram_btdata[6], g_nvram_btdata[7]);
|
||||
|
||||
mtk_wcn_stp_register_event_cb(BT_TASK_INDX, BT_event_cb);
|
||||
BT_INFO_FUNC("mtk_wcn_stp_register_event_cb finish\n");
|
||||
}
|
||||
else {
|
||||
BT_ERR_FUNC("STP is not ready\n");
|
||||
|
||||
/*return error code*/
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
// init_MUTEX(&wr_mtx);
|
||||
sema_init(&wr_mtx, 1);
|
||||
// init_MUTEX(&rd_mtx);
|
||||
sema_init(&rd_mtx, 1);
|
||||
BT_INFO_FUNC("finish\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int BT_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
BT_INFO_FUNC("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
if(current->pid ==1)
|
||||
return 0;
|
||||
retflag = 0;
|
||||
mtk_wcn_wmt_msgcb_unreg(WMTDRV_TYPE_BT);
|
||||
mtk_wcn_stp_register_event_cb(BT_TASK_INDX, NULL);
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_BT)) {
|
||||
BT_INFO_FUNC("WMT turn off BT fail!\n");
|
||||
return -EIO; //mostly, native programmer will not check this return value.
|
||||
}
|
||||
else {
|
||||
BT_INFO_FUNC("WMT turn off BT OK!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct file_operations BT_fops = {
|
||||
.open = BT_open,
|
||||
.release = BT_close,
|
||||
.read = BT_read,
|
||||
.write = BT_write,
|
||||
// .ioctl = BT_ioctl,
|
||||
.unlocked_ioctl = BT_unlocked_ioctl,
|
||||
.poll = BT_poll
|
||||
};
|
||||
|
||||
static int BT_init(void)
|
||||
{
|
||||
dev_t dev = MKDEV(BT_major, 0);
|
||||
int alloc_ret = 0;
|
||||
int cdev_err = 0;
|
||||
|
||||
/*static allocate chrdev*/
|
||||
alloc_ret = register_chrdev_region(dev, 1, BT_DRIVER_NAME);
|
||||
if (alloc_ret) {
|
||||
BT_ERR_FUNC("fail to register chrdev\n");
|
||||
return alloc_ret;
|
||||
}
|
||||
|
||||
cdev_init(&BT_cdev, &BT_fops);
|
||||
BT_cdev.owner = THIS_MODULE;
|
||||
|
||||
cdev_err = cdev_add(&BT_cdev, dev, BT_devs);
|
||||
if (cdev_err)
|
||||
goto error;
|
||||
|
||||
BT_INFO_FUNC("%s driver(major %d) installed.\n", BT_DRIVER_NAME, BT_major);
|
||||
retflag = 0;
|
||||
mtk_wcn_stp_register_event_cb(BT_TASK_INDX, NULL);
|
||||
|
||||
/* init wait queue */
|
||||
init_waitqueue_head(&(inq));
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (cdev_err == 0)
|
||||
cdev_del(&BT_cdev);
|
||||
|
||||
if (alloc_ret == 0)
|
||||
unregister_chrdev_region(dev, BT_devs);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void BT_exit(void)
|
||||
{
|
||||
dev_t dev = MKDEV(BT_major, 0);
|
||||
retflag = 0;
|
||||
mtk_wcn_stp_register_event_cb(BT_TASK_INDX, NULL); // unregister event callback function
|
||||
|
||||
cdev_del(&BT_cdev);
|
||||
unregister_chrdev_region(dev, BT_devs);
|
||||
|
||||
BT_INFO_FUNC("%s driver removed.\n", BT_DRIVER_NAME);
|
||||
}
|
||||
|
||||
module_init(BT_init);
|
||||
module_exit(BT_exit);
|
||||
|
||||
|
||||
@@ -1,427 +0,0 @@
|
||||
/** $Log: stp_chrdev_gps.c $
|
||||
*
|
||||
* 12 13 2010 Sean.Wang
|
||||
* (1) Add GPS_DEBUG_TRACE_GPIO to disable GPIO debugging trace
|
||||
* (2) Add GPS_DEBUG_DUMP to support GPS data dump
|
||||
* (3) Add mtk_wcn_stp_is_ready() check in GPS_open()
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include "stp_exp.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#define GPS_DRIVER_NAME "mtk_stp_GPS_chrdev"
|
||||
#define GPS_DEV_MAJOR 191 // never used number
|
||||
#define GPS_DEBUG_TRACE_GPIO 0
|
||||
#define GPS_DEBUG_DUMP 0
|
||||
|
||||
#define PFX "[GPS] "
|
||||
#define GPS_LOG_DBG 3
|
||||
#define GPS_LOG_INFO 2
|
||||
#define GPS_LOG_WARN 1
|
||||
#define GPS_LOG_ERR 0
|
||||
|
||||
#define COMBO_IOC_GPS_HWVER 6
|
||||
|
||||
unsigned int gDbgLevel = GPS_LOG_DBG;
|
||||
|
||||
#define GPS_DBG_FUNC(fmt, arg...) if(gDbgLevel >= GPS_LOG_DBG){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define GPS_INFO_FUNC(fmt, arg...) if(gDbgLevel >= GPS_LOG_INFO){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define GPS_WARN_FUNC(fmt, arg...) if(gDbgLevel >= GPS_LOG_WARN){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define GPS_ERR_FUNC(fmt, arg...) if(gDbgLevel >= GPS_LOG_ERR){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define GPS_TRC_FUNC(f) if(gDbgLevel >= GPS_LOG_DBG){ printk(PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
|
||||
static int GPS_devs = 1; /* device count */
|
||||
static int GPS_major = GPS_DEV_MAJOR; /* dynamic allocation */
|
||||
module_param(GPS_major, uint, 0);
|
||||
static struct cdev GPS_cdev;
|
||||
|
||||
static unsigned char i_buf[MTKSTP_BUFFER_SIZE]; // input buffer of read()
|
||||
static unsigned char o_buf[MTKSTP_BUFFER_SIZE]; // output buffer of write()
|
||||
static struct semaphore wr_mtx, rd_mtx;
|
||||
static DECLARE_WAIT_QUEUE_HEAD(GPS_wq);
|
||||
static int flag = 0;
|
||||
|
||||
static void GPS_event_cb(void);
|
||||
|
||||
ssize_t GPS_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
int retval = 0;
|
||||
int written = 0;
|
||||
down(&wr_mtx);
|
||||
|
||||
//GPS_TRC_FUNC();
|
||||
|
||||
/*printk("%s: count %d pos %lld\n", __func__, count, *f_pos);*/
|
||||
if (count > 0)
|
||||
{
|
||||
int copy_size = (count < MTKSTP_BUFFER_SIZE) ? count : MTKSTP_BUFFER_SIZE;
|
||||
if (copy_from_user(&o_buf[0], &buf[0], copy_size))
|
||||
{
|
||||
retval = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
//printk("%02x ", val);
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_TX, DBG_TIE_LOW);
|
||||
#endif
|
||||
written = mtk_wcn_stp_send_data(&o_buf[0], copy_size, GPS_TASK_INDX);
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_TX, DBG_TIE_HIGH);
|
||||
#endif
|
||||
|
||||
#if GPS_DEBUG_DUMP
|
||||
{
|
||||
unsigned char *buf_ptr = &o_buf[0];
|
||||
int k=0;
|
||||
printk("--[GPS-WRITE]--");
|
||||
for(k=0; k < 10 ; k++){
|
||||
if(k%16 == 0) printk("\n");
|
||||
printk("0x%02x ", o_buf[k]);
|
||||
}
|
||||
printk("\n");
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
If cannot send successfully, enqueue again
|
||||
|
||||
if (written != copy_size) {
|
||||
// George: FIXME! Move GPS retry handling from app to driver
|
||||
}
|
||||
*/
|
||||
if(0 == written)
|
||||
{
|
||||
retval = -ENOSPC;
|
||||
/*no windowspace in STP is available, native process should not call GPS_write with no delay at all*/
|
||||
GPS_ERR_FUNC("target packet length:%d, write success length:%d, retval = %d.\n", count, written, retval);
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = written;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
retval = -EFAULT;
|
||||
GPS_ERR_FUNC("target packet length:%d is not allowed, retval = %d.\n", count, retval);
|
||||
}
|
||||
out:
|
||||
up(&wr_mtx);
|
||||
return (retval);
|
||||
}
|
||||
|
||||
ssize_t GPS_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
long val = 0;
|
||||
int retval;
|
||||
|
||||
down(&rd_mtx);
|
||||
|
||||
/* printk("GPS_read(): count %d pos %lld\n", count, *f_pos);*/
|
||||
|
||||
if(count > MTKSTP_BUFFER_SIZE)
|
||||
{
|
||||
count = MTKSTP_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_LOW);
|
||||
#endif
|
||||
retval = mtk_wcn_stp_receive_data(i_buf, count, GPS_TASK_INDX);
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_HIGH);
|
||||
#endif
|
||||
|
||||
while(retval == 0) // got nothing, wait for STP's signal
|
||||
{
|
||||
/*wait_event(GPS_wq, flag != 0);*/ /* George: let signal wake up */
|
||||
val = wait_event_interruptible(GPS_wq, flag != 0);
|
||||
flag = 0;
|
||||
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_LOW);
|
||||
#endif
|
||||
|
||||
retval = mtk_wcn_stp_receive_data(i_buf, count, GPS_TASK_INDX);
|
||||
|
||||
#if GPS_DEBUG_TRACE_GPIO
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_GPS_RX, DBG_TIE_HIGH);
|
||||
#endif
|
||||
/* if we are signaled */
|
||||
if (val) {
|
||||
if (-ERESTARTSYS == val) {
|
||||
GPS_INFO_FUNC("signaled by -ERESTARTSYS(%ld) \n ", val);
|
||||
}
|
||||
else {
|
||||
GPS_INFO_FUNC("signaled by %ld \n ", val);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if GPS_DEBUG_DUMP
|
||||
{
|
||||
unsigned char *buf_ptr = &i_buf[0];
|
||||
int k=0;
|
||||
printk("--[GPS-READ]--");
|
||||
for(k=0; k < 10 ; k++){
|
||||
if(k%16 == 0) printk("\n");
|
||||
printk("0x%02x ", i_buf[k]);
|
||||
}
|
||||
printk("--\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (retval) {
|
||||
// we got something from STP driver
|
||||
if (copy_to_user(buf, i_buf, retval)) {
|
||||
retval = -EFAULT;
|
||||
goto OUT;
|
||||
}
|
||||
else {
|
||||
/* success */
|
||||
}
|
||||
}
|
||||
else {
|
||||
// we got nothing from STP driver, being signaled
|
||||
retval = val;
|
||||
}
|
||||
|
||||
OUT:
|
||||
up(&rd_mtx);
|
||||
/* printk("GPS_read(): retval = %d\n", retval);*/
|
||||
return (retval);
|
||||
}
|
||||
|
||||
//int GPS_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
long GPS_unlocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
ENUM_WMTHWVER_TYPE_T hw_ver_sym = WMTHWVER_INVALID;
|
||||
|
||||
printk("GPS_ioctl(): cmd (%d)\n", cmd);
|
||||
|
||||
switch(cmd)
|
||||
{
|
||||
case 0: // enable/disable STP
|
||||
GPS_INFO_FUNC(KERN_INFO "GPS_ioctl(): disable STP control from GPS dev\n");
|
||||
retval = -EINVAL;
|
||||
#if 1
|
||||
#else
|
||||
/* George: STP is controlled by WMT only */
|
||||
mtk_wcn_stp_enable(arg);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 1: // send raw data
|
||||
GPS_INFO_FUNC(KERN_INFO "GPS_ioctl(): disable raw data from GPS dev \n");
|
||||
retval = -EINVAL;
|
||||
break;
|
||||
|
||||
case COMBO_IOC_GPS_HWVER:
|
||||
/*get combo hw version*/
|
||||
hw_ver_sym = mtk_wcn_wmt_hwver_get();
|
||||
|
||||
GPS_INFO_FUNC(KERN_INFO "GPS_ioctl(): get hw version = %d, sizeof(hw_ver_sym) = %d\n", hw_ver_sym, sizeof(hw_ver_sym));
|
||||
if(copy_to_user((int __user *)arg, &hw_ver_sym, sizeof(hw_ver_sym))){
|
||||
retval = -EFAULT;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
retval = -EFAULT;
|
||||
GPS_INFO_FUNC(KERN_INFO "GPS_ioctl(): unknown cmd (%d)\n", cmd);
|
||||
break;
|
||||
}
|
||||
|
||||
/*OUT:*/
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void gps_cdev_rst_cb(
|
||||
ENUM_WMTDRV_TYPE_T src,
|
||||
ENUM_WMTDRV_TYPE_T dst,
|
||||
ENUM_WMTMSG_TYPE_T type,
|
||||
void *buf,
|
||||
unsigned int sz){
|
||||
|
||||
/*
|
||||
To handle reset procedure please
|
||||
*/
|
||||
ENUM_WMTRSTMSG_TYPE_T rst_msg;
|
||||
|
||||
GPS_INFO_FUNC("sizeof(ENUM_WMTRSTMSG_TYPE_T) = %d\n", sizeof(ENUM_WMTRSTMSG_TYPE_T));
|
||||
if(sz <= sizeof(ENUM_WMTRSTMSG_TYPE_T)){
|
||||
memcpy((char *)&rst_msg, (char *)buf, sz);
|
||||
GPS_INFO_FUNC("src = %d, dst = %d, type = %d, buf = 0x%x sz = %d, max = %d\n", src, dst, type, rst_msg, sz, WMTRSTMSG_RESET_MAX);
|
||||
if((src==WMTDRV_TYPE_WMT) &&
|
||||
(dst == WMTDRV_TYPE_GPS) &&
|
||||
(type == WMTMSG_TYPE_RESET)){
|
||||
if(rst_msg == WMTRSTMSG_RESET_START){
|
||||
GPS_INFO_FUNC("gps restart start!\n");
|
||||
|
||||
/*reset_start message handling*/
|
||||
|
||||
} else if(rst_msg == WMTRSTMSG_RESET_END){
|
||||
GPS_INFO_FUNC("gps restart end!\n");
|
||||
|
||||
/*reset_end message handling*/
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*message format invalid*/
|
||||
}
|
||||
}
|
||||
|
||||
static int GPS_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
printk("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
if(current->pid ==1)
|
||||
return 0;
|
||||
|
||||
#if 1 /* GeorgeKuo: turn on function before check stp ready */
|
||||
/* turn on BT */
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_GPS)) {
|
||||
GPS_WARN_FUNC("WMT turn on GPS fail!\n");
|
||||
return -ENODEV;
|
||||
} else {
|
||||
mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_GPS, gps_cdev_rst_cb);
|
||||
GPS_INFO_FUNC("WMT turn on GPS OK!\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mtk_wcn_stp_is_ready()) {
|
||||
#if 0
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_GPS)) {
|
||||
GPS_WARN_FUNC("WMT turn on GPS fail!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
GPS_INFO_FUNC("WMT turn on GPS OK!\n");
|
||||
#endif
|
||||
mtk_wcn_stp_register_event_cb(GPS_TASK_INDX, GPS_event_cb);
|
||||
} else {
|
||||
GPS_ERR_FUNC("STP is not ready, Cannot open GPS Devices\n\r");
|
||||
|
||||
/*return error code*/
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
//init_MUTEX(&wr_mtx);
|
||||
sema_init(&wr_mtx, 1);
|
||||
//init_MUTEX(&rd_mtx);
|
||||
sema_init(&rd_mtx, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int GPS_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
printk("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
if(current->pid ==1)
|
||||
return 0;
|
||||
|
||||
/*Flush Rx Queue*/
|
||||
mtk_wcn_stp_register_event_cb(GPS_TASK_INDX, 0x0); // unregister event callback function
|
||||
mtk_wcn_wmt_msgcb_unreg(WMTDRV_TYPE_GPS);
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_GPS)) {
|
||||
GPS_WARN_FUNC("WMT turn off GPS fail!\n");
|
||||
return -EIO; //mostly, native programer does not care this return vlaue, but we still return error code.
|
||||
}
|
||||
else {
|
||||
GPS_INFO_FUNC("WMT turn off GPS OK!\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct file_operations GPS_fops = {
|
||||
.open = GPS_open,
|
||||
.release = GPS_close,
|
||||
.read = GPS_read,
|
||||
.write = GPS_write,
|
||||
// .ioctl = GPS_ioctl
|
||||
.unlocked_ioctl = GPS_unlocked_ioctl,
|
||||
};
|
||||
|
||||
void GPS_event_cb(void)
|
||||
{
|
||||
/* printk("GPS_event_cb() \n");*/
|
||||
|
||||
flag = 1;
|
||||
wake_up(&GPS_wq);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int GPS_init(void)
|
||||
{
|
||||
dev_t dev = MKDEV(GPS_major, 0);
|
||||
int alloc_ret = 0;
|
||||
int cdev_err = 0;
|
||||
|
||||
/*static allocate chrdev*/
|
||||
alloc_ret = register_chrdev_region(dev, 1, GPS_DRIVER_NAME);
|
||||
if (alloc_ret) {
|
||||
printk("fail to register chrdev\n");
|
||||
return alloc_ret;
|
||||
}
|
||||
|
||||
cdev_init(&GPS_cdev, &GPS_fops);
|
||||
GPS_cdev.owner = THIS_MODULE;
|
||||
|
||||
cdev_err = cdev_add(&GPS_cdev, dev, GPS_devs);
|
||||
if (cdev_err)
|
||||
goto error;
|
||||
|
||||
printk(KERN_ALERT "%s driver(major %d) installed.\n", GPS_DRIVER_NAME, GPS_major);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (cdev_err == 0)
|
||||
cdev_del(&GPS_cdev);
|
||||
|
||||
if (alloc_ret == 0)
|
||||
unregister_chrdev_region(dev, GPS_devs);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void GPS_exit(void)
|
||||
{
|
||||
dev_t dev = MKDEV(GPS_major, 0);
|
||||
|
||||
cdev_del(&GPS_cdev);
|
||||
unregister_chrdev_region(dev, GPS_devs);
|
||||
|
||||
printk(KERN_ALERT "%s driver removed.\n", GPS_DRIVER_NAME);
|
||||
}
|
||||
|
||||
module_init(GPS_init);
|
||||
module_exit(GPS_exit);
|
||||
|
||||
EXPORT_SYMBOL(GPS_event_cb);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,938 +0,0 @@
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/poll.h>
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/skbuff.h>
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <linux/time.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kfifo.h>
|
||||
|
||||
|
||||
#include "stp_exp.h"
|
||||
|
||||
#define N_MTKSTP (15 + 1) /* refer to linux tty.h use N_HCI. */
|
||||
|
||||
#define HCIUARTSETPROTO _IOW('U', 200, int)
|
||||
|
||||
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#define PFX "[UART] "
|
||||
#define UART_LOG_LOUD 4
|
||||
#define UART_LOG_DBG 3
|
||||
#define UART_LOG_INFO 2
|
||||
#define UART_LOG_WARN 1
|
||||
#define UART_LOG_ERR 0
|
||||
|
||||
#define MAX_PACKET_ALLOWED 2000
|
||||
|
||||
|
||||
unsigned int gDbgLevel = UART_LOG_INFO;
|
||||
|
||||
#define UART_DBG_FUNC(fmt, arg...) if(gDbgLevel >= UART_LOG_DBG){ printk(KERN_DEBUG PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define UART_INFO_FUNC(fmt, arg...) if(gDbgLevel >= UART_LOG_INFO){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define UART_WARN_FUNC(fmt, arg...) if(gDbgLevel >= UART_LOG_WARN){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define UART_ERR_FUNC(fmt, arg...) if(gDbgLevel >= UART_LOG_ERR){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define UART_TRC_FUNC(f) if(gDbgLevel >= UART_LOG_DBG){ printk(KERN_DEBUG PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
|
||||
#include <linux/kfifo.h>
|
||||
#define LDISC_RX_TASKLET 0
|
||||
#define LDISC_RX_WORK 1
|
||||
|
||||
#if WMT_UART_RX_MODE_WORK
|
||||
#define LDISC_RX LDISC_RX_WORK
|
||||
#else
|
||||
#define LDISC_RX LDISC_RX_TASKLET
|
||||
#endif
|
||||
|
||||
#if (LDISC_RX == LDISC_RX_TASKLET)
|
||||
#define LDISC_RX_FIFO_SIZE (0x20000) /*8192 bytes*/
|
||||
struct kfifo *g_stp_uart_rx_fifo = NULL;
|
||||
spinlock_t g_stp_uart_rx_fifo_spinlock;
|
||||
struct tasklet_struct g_stp_uart_rx_fifo_tasklet;
|
||||
#define RX_BUFFER_LEN 1024
|
||||
unsigned char g_rx_data[RX_BUFFER_LEN];
|
||||
|
||||
//static DEFINE_RWLOCK(g_stp_uart_rx_handling_lock);
|
||||
#elif (LDISC_RX == LDISC_RX_WORK)
|
||||
|
||||
#define LDISC_RX_FIFO_SIZE (0x4000) /* 16K bytes shall be enough...... */
|
||||
#define LDISC_RX_BUF_SIZE (2048) /* 2K bytes in one shot is enough */
|
||||
|
||||
UINT8 *g_stp_uart_rx_buf; /* for stp rx data parsing */
|
||||
struct kfifo *g_stp_uart_rx_fifo = NULL; /* for uart tty data receiving */
|
||||
spinlock_t g_stp_uart_rx_fifo_spinlock; /* fifo spinlock */
|
||||
struct workqueue_struct *g_stp_uart_rx_wq; /* rx work queue (do not use system_wq) */
|
||||
struct work_struct *g_stp_uart_rx_work; /* rx work */
|
||||
|
||||
#endif
|
||||
|
||||
struct tty_struct *stp_tty = 0x0;
|
||||
|
||||
unsigned char tx_buf[MTKSTP_BUFFER_SIZE] = {0x0};
|
||||
int rd_idx = 0;
|
||||
int wr_idx = 0;
|
||||
//struct semaphore buf_mtx;
|
||||
spinlock_t buf_lock;
|
||||
static INT32 mtk_wcn_uart_tx(const UINT8 *data, const UINT32 size, UINT32 *written_size);
|
||||
|
||||
|
||||
static inline int stp_uart_tx_wakeup(struct tty_struct *tty)
|
||||
{
|
||||
int len = 0;
|
||||
int written = 0;
|
||||
int written_count = 0;
|
||||
static int i = 0;
|
||||
//unsigned long flags;
|
||||
// get data from ring buffer
|
||||
// down(&buf_mtx);
|
||||
UART_DBG_FUNC("++\n");
|
||||
//// spin_lock_irqsave(&buf_lock, flags);
|
||||
|
||||
#if 0
|
||||
if((i > 1000) && (i % 5)== 0)
|
||||
{
|
||||
UART_INFO_FUNC("i=(%d), ****** drop data from uart******\n", i);
|
||||
i++;
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
UART_INFO_FUNC("i=(%d)at stp uart **\n", i);
|
||||
}
|
||||
#endif
|
||||
|
||||
len = (wr_idx >= rd_idx) ? (wr_idx - rd_idx) : (MTKSTP_BUFFER_SIZE - rd_idx);
|
||||
if(len > 0 && len < MAX_PACKET_ALLOWED)
|
||||
{
|
||||
i++;
|
||||
/*
|
||||
* ops->write is called by the kernel to write a series of
|
||||
* characters to the tty device. The characters may come from
|
||||
* user space or kernel space. This routine will return the
|
||||
* number of characters actually accepted for writing.
|
||||
*/
|
||||
set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
|
||||
written = tty->ops->write(tty, &tx_buf[rd_idx], len);
|
||||
if(written != len) {
|
||||
UART_ERR_FUNC("Error(i-%d):[pid(%d)(%s)]tty-ops->write FAIL!len(%d)wr(%d)wr_i(%d)rd_i(%d)\n\r", i, current->pid, current->comm, len, written, wr_idx, rd_idx);
|
||||
return -1;
|
||||
}
|
||||
written_count = written;
|
||||
//printk("len = %d, written = %d\n", len, written);
|
||||
rd_idx = ((rd_idx + written) % MTKSTP_BUFFER_SIZE);
|
||||
// all data is accepted by UART driver, check again in case roll over
|
||||
len = (wr_idx >= rd_idx) ? (wr_idx - rd_idx) : (MTKSTP_BUFFER_SIZE - rd_idx);
|
||||
if(len > 0 && len < MAX_PACKET_ALLOWED)
|
||||
{
|
||||
set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
|
||||
written = tty->ops->write(tty, &tx_buf[rd_idx], len);
|
||||
if (written != len)
|
||||
{
|
||||
UART_ERR_FUNC("Error(i-%d):[pid(%d)(%s)]len(%d)wr(%d)wr_i(%d)rd_i(%d)\n\r", i, current->pid, current->comm, len, written, wr_idx, rd_idx);
|
||||
return -1;
|
||||
}
|
||||
rd_idx = ((rd_idx + written) % MTKSTP_BUFFER_SIZE);
|
||||
written_count += written;
|
||||
}
|
||||
else if(len < 0 || len >= MAX_PACKET_ALLOWED)
|
||||
{
|
||||
UART_ERR_FUNC("Warnning(i-%d):[pid(%d)(%s)]length verfication(external) warnning,len(%d), wr_idx(%d), rd_idx(%d)!\n\r", i, current->pid, current->comm, len, wr_idx, rd_idx);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UART_ERR_FUNC("Warnning(i-%d):[pid(%d)(%s)]length verfication(external) warnning,len(%d), wr_idx(%d), rd_idx(%d)!\n\r", i, current->pid, current->comm, len, wr_idx, rd_idx);
|
||||
return -1;
|
||||
}
|
||||
//up(&buf_mtx);
|
||||
//// spin_unlock_irqrestore(&buf_lock, flags);
|
||||
UART_DBG_FUNC("--\n");
|
||||
return written_count;
|
||||
}
|
||||
|
||||
/* ------ LDISC part ------ */
|
||||
/* stp_uart_tty_open
|
||||
*
|
||||
* Called when line discipline changed to HCI_UART.
|
||||
*
|
||||
* Arguments:
|
||||
* tty pointer to tty info structure
|
||||
* Return Value:
|
||||
* 0 if success, otherwise error code
|
||||
*/
|
||||
static int stp_uart_tty_open(struct tty_struct *tty)
|
||||
{
|
||||
UART_DBG_FUNC("stp_uart_tty_opentty: %p\n", tty);
|
||||
|
||||
tty->receive_room = 65536;
|
||||
tty->low_latency = 1;
|
||||
|
||||
/* Flush any pending characters in the driver and line discipline. */
|
||||
|
||||
/* FIXME: why is this needed. Note don't use ldisc_ref here as the
|
||||
open path is before the ldisc is referencable */
|
||||
|
||||
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,29)
|
||||
/* definition changed!! */
|
||||
if (tty->ldisc->ops->flush_buffer) {
|
||||
tty->ldisc->ops->flush_buffer(tty);
|
||||
}
|
||||
#else
|
||||
if (tty->ldisc.ops->flush_buffer) {
|
||||
tty->ldisc.ops->flush_buffer(tty);
|
||||
}
|
||||
#endif
|
||||
|
||||
tty_driver_flush_buffer(tty);
|
||||
|
||||
// init_MUTEX(&buf_mtx);
|
||||
//// spin_lock_init(&buf_lock);
|
||||
|
||||
rd_idx = wr_idx = 0;
|
||||
stp_tty = tty;
|
||||
mtk_wcn_stp_register_if_tx(STP_UART_IF_TX, mtk_wcn_uart_tx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* stp_uart_tty_close()
|
||||
*
|
||||
* Called when the line discipline is changed to something
|
||||
* else, the tty is closed, or the tty detects a hangup.
|
||||
*/
|
||||
static void stp_uart_tty_close(struct tty_struct *tty)
|
||||
{
|
||||
UART_DBG_FUNC("stp_uart_tty_close(): tty %p\n", tty);
|
||||
mtk_wcn_stp_register_if_tx(STP_UART_IF_TX, NULL);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* stp_uart_tty_wakeup()
|
||||
*
|
||||
* Callback for transmit wakeup. Called when low level
|
||||
* device driver can accept more send data.
|
||||
*
|
||||
* Arguments: tty pointer to associated tty instance data
|
||||
* Return Value: None
|
||||
*/
|
||||
static void stp_uart_tty_wakeup(struct tty_struct *tty)
|
||||
{
|
||||
//printk("%s: start !!\n", __FUNCTION__);
|
||||
|
||||
//clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
|
||||
|
||||
//stp_uart_tx_wakeup(tty);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* stp_uart_tty_receive()
|
||||
*
|
||||
* Called by tty low level driver when receive data is
|
||||
* available.
|
||||
*
|
||||
* Arguments: tty pointer to tty isntance data
|
||||
* data pointer to received data
|
||||
* flags pointer to flags for data
|
||||
* count count of received data in bytes
|
||||
*
|
||||
* Return Value: None
|
||||
*/
|
||||
#if (LDISC_RX == LDISC_RX_TASKLET)
|
||||
|
||||
static int stp_uart_fifo_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
/*add rx fifo*/
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
||||
{
|
||||
spin_lock_init(&g_stp_uart_rx_fifo_spinlock);
|
||||
g_stp_uart_rx_fifo = kfifo_alloc(LDISC_RX_FIFO_SIZE, GFP_ATOMIC, &g_stp_uart_rx_fifo_spinlock);
|
||||
if (NULL == g_stp_uart_rx_fifo)
|
||||
{
|
||||
UART_ERR_FUNC("kfifo_alloc failed (kernel version < 2.6.35)\n");
|
||||
err = -1;
|
||||
}
|
||||
}
|
||||
#else
|
||||
{
|
||||
g_stp_uart_rx_fifo = kzalloc(sizeof(struct kfifo), GFP_ATOMIC);
|
||||
if (NULL == g_stp_uart_rx_fifo)
|
||||
{
|
||||
err = -2;
|
||||
UART_ERR_FUNC("kzalloc for g_stp_uart_rx_fifo failed (kernel version > 2.6.35)\n");
|
||||
}
|
||||
err = kfifo_alloc(g_stp_uart_rx_fifo, LDISC_RX_FIFO_SIZE, GFP_ATOMIC);
|
||||
if (0 != err)
|
||||
{
|
||||
UART_ERR_FUNC("kfifo_alloc failed, errno(%d)(kernel version > 2.6.35)\n", err);
|
||||
kfree(g_stp_uart_rx_fifo);
|
||||
g_stp_uart_rx_fifo = NULL;
|
||||
err = -3;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (0 == err)
|
||||
{
|
||||
if (NULL != g_stp_uart_rx_fifo)
|
||||
{
|
||||
kfifo_reset(g_stp_uart_rx_fifo);
|
||||
UART_ERR_FUNC("stp_uart_fifo_init() success.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -4;
|
||||
UART_ERR_FUNC("abnormal case, err = 0 but g_stp_uart_rx_fifo = NULL, set err to %d\n", err);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
UART_ERR_FUNC("stp_uart_fifo_init() failed.\n");
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int stp_uart_fifo_deinit(void)
|
||||
{
|
||||
if (NULL != g_stp_uart_rx_fifo)
|
||||
{
|
||||
kfifo_free(g_stp_uart_rx_fifo);
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
||||
//do nothing
|
||||
#else
|
||||
kfree(g_stp_uart_rx_fifo);
|
||||
#endif
|
||||
g_stp_uart_rx_fifo = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stp_uart_rx_handling(unsigned long func_data){
|
||||
unsigned int how_much_get = 0;
|
||||
unsigned int how_much_to_get = 0;
|
||||
unsigned int flag = 0;
|
||||
|
||||
// read_lock(&g_stp_uart_rx_handling_lock);
|
||||
how_much_to_get = kfifo_len(g_stp_uart_rx_fifo);
|
||||
|
||||
if (how_much_to_get >= RX_BUFFER_LEN)
|
||||
{
|
||||
flag = 1;
|
||||
UART_INFO_FUNC ("fifolen(%d)\n", how_much_to_get);
|
||||
}
|
||||
|
||||
do{
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
||||
how_much_get= kfifo_get(g_stp_uart_rx_fifo, g_rx_data, RX_BUFFER_LEN);
|
||||
#else
|
||||
how_much_get= kfifo_out(g_stp_uart_rx_fifo, g_rx_data, RX_BUFFER_LEN);
|
||||
#endif
|
||||
//UART_INFO_FUNC ("fifoget(%d)\n", how_much_get);
|
||||
mtk_wcn_stp_parser_data((UINT8 *)g_rx_data, how_much_get);
|
||||
how_much_to_get = kfifo_len(g_stp_uart_rx_fifo);
|
||||
}while(how_much_to_get > 0);
|
||||
|
||||
// read_unlock(&g_stp_uart_rx_handling_lock);
|
||||
if (1 == flag)
|
||||
{
|
||||
UART_INFO_FUNC ("finish, fifolen(%d)\n", kfifo_len(g_stp_uart_rx_fifo));
|
||||
}
|
||||
}
|
||||
|
||||
static void stp_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
|
||||
{
|
||||
unsigned int fifo_avail_len = LDISC_RX_FIFO_SIZE - kfifo_len(g_stp_uart_rx_fifo);
|
||||
unsigned int how_much_put = 0;
|
||||
#if 0
|
||||
{
|
||||
struct timeval now;
|
||||
do_gettimeofday(&now);
|
||||
printk("[+STP][ ][R] %4d --> sec = %lu, --> usec --> %lu\n",
|
||||
count, now.tv_sec, now.tv_usec);
|
||||
}
|
||||
#endif
|
||||
// write_lock(&g_stp_uart_rx_handling_lock);
|
||||
if(count > 2000){
|
||||
/*this is abnormal*/
|
||||
UART_ERR_FUNC("abnormal: buffer count = %d\n", count);
|
||||
}
|
||||
/*How much empty seat?*/
|
||||
if(fifo_avail_len > 0){
|
||||
//UART_INFO_FUNC ("fifo left(%d), count(%d)\n", fifo_avail_len, count);
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35))
|
||||
how_much_put = kfifo_put(g_stp_uart_rx_fifo,(unsigned char *) data, count);
|
||||
#else
|
||||
how_much_put = kfifo_in(g_stp_uart_rx_fifo,(unsigned char *) data, count);
|
||||
#endif
|
||||
|
||||
/*schedule it!*/
|
||||
tasklet_schedule(&g_stp_uart_rx_fifo_tasklet);
|
||||
}else{
|
||||
UART_ERR_FUNC("stp_uart_tty_receive rxfifo is full!!\n");
|
||||
}
|
||||
|
||||
#if 0
|
||||
{
|
||||
struct timeval now;
|
||||
do_gettimeofday(&now);
|
||||
printk("[-STP][ ][R] %4d --> sec = %lu, --> usec --> %lu\n",
|
||||
count, now.tv_sec, now.tv_usec);
|
||||
}
|
||||
#endif
|
||||
|
||||
// write_unlock(&g_stp_uart_rx_handling_lock);
|
||||
|
||||
}
|
||||
#elif (LDISC_RX ==LDISC_RX_WORK)
|
||||
static int stp_uart_fifo_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37))
|
||||
g_stp_uart_rx_buf = vzalloc(LDISC_RX_BUF_SIZE);
|
||||
if (!g_stp_uart_rx_buf) {
|
||||
UART_ERR_FUNC("kfifo_alloc failed (kernel version >= 2.6.37)\n");
|
||||
err = -4;
|
||||
goto fifo_init_end;
|
||||
}
|
||||
#else
|
||||
g_stp_uart_rx_buf = vmalloc(LDISC_RX_BUF_SIZE);
|
||||
if (!g_stp_uart_rx_buf) {
|
||||
UART_ERR_FUNC("kfifo_alloc failed (kernel version < 2.6.37)\n");
|
||||
err = -4;
|
||||
goto fifo_init_end;
|
||||
}
|
||||
memset(g_stp_uart_rx_buf, 0, LDISC_RX_BUF_SIZE);
|
||||
#endif
|
||||
|
||||
UART_INFO_FUNC("g_stp_uart_rx_buf alloc ok(0x%p, %d)\n",
|
||||
g_stp_uart_rx_buf, LDISC_RX_BUF_SIZE);
|
||||
|
||||
/*add rx fifo*/
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
|
||||
spin_lock_init(&g_stp_uart_rx_fifo_spinlock);
|
||||
g_stp_uart_rx_fifo = kfifo_alloc(LDISC_RX_FIFO_SIZE, GFP_KERNEL, &g_stp_uart_rx_fifo_spinlock);
|
||||
if (NULL == g_stp_uart_rx_fifo) {
|
||||
UART_ERR_FUNC("kfifo_alloc failed (kernel version < 2.6.33)\n");
|
||||
err = -1;
|
||||
goto fifo_init_end;
|
||||
}
|
||||
#else
|
||||
/* allocate struct kfifo first */
|
||||
g_stp_uart_rx_fifo = kzalloc(sizeof(struct kfifo), GFP_KERNEL);
|
||||
if (NULL == g_stp_uart_rx_fifo) {
|
||||
err = -2;
|
||||
UART_ERR_FUNC("kzalloc struct kfifo failed (kernel version > 2.6.33)\n");
|
||||
goto fifo_init_end;
|
||||
}
|
||||
|
||||
/* allocate kfifo data buffer then */
|
||||
err = kfifo_alloc(g_stp_uart_rx_fifo, LDISC_RX_FIFO_SIZE, GFP_KERNEL);
|
||||
if (0 != err) {
|
||||
UART_ERR_FUNC("kfifo_alloc failed, err(%d)(kernel version > 2.6.33)\n", err);
|
||||
kfree(g_stp_uart_rx_fifo);
|
||||
g_stp_uart_rx_fifo = NULL;
|
||||
err = -3;
|
||||
goto fifo_init_end;
|
||||
}
|
||||
#endif
|
||||
UART_INFO_FUNC("g_stp_uart_rx_fifo alloc ok\n");
|
||||
|
||||
fifo_init_end:
|
||||
|
||||
if (0 == err) {
|
||||
/* kfifo init ok */
|
||||
kfifo_reset(g_stp_uart_rx_fifo);
|
||||
UART_DBG_FUNC("g_stp_uart_rx_fifo init success\n");
|
||||
}
|
||||
else {
|
||||
UART_ERR_FUNC("stp_uart_fifo_init() fail(%d)\n", err);
|
||||
if (g_stp_uart_rx_buf) {
|
||||
UART_ERR_FUNC("free g_stp_uart_rx_buf\n");
|
||||
vfree(g_stp_uart_rx_buf);
|
||||
g_stp_uart_rx_buf = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int stp_uart_fifo_deinit(void)
|
||||
{
|
||||
if (g_stp_uart_rx_buf) {
|
||||
vfree(g_stp_uart_rx_buf);
|
||||
g_stp_uart_rx_buf = NULL;
|
||||
}
|
||||
|
||||
if (NULL != g_stp_uart_rx_fifo) {
|
||||
kfifo_free(g_stp_uart_rx_fifo);
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
|
||||
//do nothing
|
||||
#else
|
||||
kfree(g_stp_uart_rx_fifo);
|
||||
#endif
|
||||
g_stp_uart_rx_fifo = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stp_uart_fifo_reset (void) {
|
||||
if (NULL != g_stp_uart_rx_fifo) {
|
||||
kfifo_reset(g_stp_uart_rx_fifo);
|
||||
}
|
||||
}
|
||||
|
||||
static void stp_uart_rx_worker (struct work_struct *work)
|
||||
{
|
||||
unsigned int read;
|
||||
|
||||
if (unlikely(!g_stp_uart_rx_fifo)) {
|
||||
UART_ERR_FUNC("NULL rx fifo!\n");
|
||||
return;
|
||||
}
|
||||
if (unlikely(!g_stp_uart_rx_buf)) {
|
||||
UART_ERR_FUNC("NULL rx buf!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* run until fifo becomes empty */
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
|
||||
while (kfifo_len(g_stp_uart_rx_fifo)) {
|
||||
read = kfifo_get(g_stp_uart_rx_fifo, g_stp_uart_rx_buf, LDISC_RX_BUF_SIZE);
|
||||
//UART_LOUD_FUNC("kfifo_get(%d)\n", read);
|
||||
if (likely(read)) {
|
||||
mtk_wcn_stp_parser_data((UINT8 *)g_stp_uart_rx_buf, read);
|
||||
}
|
||||
}
|
||||
#else
|
||||
while (!kfifo_is_empty(g_stp_uart_rx_fifo)) {
|
||||
read = kfifo_out(g_stp_uart_rx_fifo, g_stp_uart_rx_buf, LDISC_RX_BUF_SIZE);
|
||||
UART_DBG_FUNC("kfifo_out(%d)\n", read);
|
||||
//printk("rx_work:%d\n\r",read);
|
||||
if (likely(read)) {
|
||||
//UART_LOUD_FUNC("->%d\n", read);
|
||||
mtk_wcn_stp_parser_data((UINT8 *)g_stp_uart_rx_buf, read);
|
||||
//UART_LOUD_FUNC("<-\n", read);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* stp_uart_tty_receive()
|
||||
*
|
||||
* Called by tty low level driver when receive data is
|
||||
* available.
|
||||
*
|
||||
* Arguments: tty pointer to tty isntance data
|
||||
* data pointer to received data
|
||||
* flags pointer to flags for data
|
||||
* count count of received data in bytes
|
||||
*
|
||||
* Return Value: None
|
||||
*/
|
||||
static void stp_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
|
||||
{
|
||||
unsigned int written;
|
||||
|
||||
//UART_LOUD_FUNC("URX:%d\n", count);
|
||||
if (unlikely(count > 2000)) {
|
||||
UART_WARN_FUNC("abnormal: buffer count = %d\n", count);
|
||||
}
|
||||
|
||||
if (unlikely(!g_stp_uart_rx_fifo || !g_stp_uart_rx_work || !g_stp_uart_rx_wq)) {
|
||||
UART_ERR_FUNC("abnormal g_stp_uart_rx_fifo(0x%p),g_stp_uart_rx_work(0x%p),g_stp_uart_rx_wq(0x%p)\n",
|
||||
g_stp_uart_rx_fifo, g_stp_uart_rx_work, g_stp_uart_rx_wq);
|
||||
return;
|
||||
}
|
||||
|
||||
/* need to check available buffer size? skip! */
|
||||
|
||||
/* need to lock fifo? skip for single writer single reader! */
|
||||
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33))
|
||||
written = kfifo_put(g_stp_uart_rx_fifo, (unsigned char *) data, count);
|
||||
#else
|
||||
written = kfifo_in(g_stp_uart_rx_fifo, (unsigned char *) data, count);
|
||||
#endif
|
||||
//printk("uart_rx:%d,wr:%d\n\r",count,written);
|
||||
|
||||
queue_work(g_stp_uart_rx_wq, g_stp_uart_rx_work);
|
||||
|
||||
if (unlikely(written != count)) {
|
||||
UART_ERR_FUNC("c(%d),w(%d) bytes dropped\n", count, written);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static void stp_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
|
||||
{
|
||||
|
||||
#if 0
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_STP_RX_PROC, DBG_TIE_LOW);
|
||||
#endif
|
||||
|
||||
if(count > 2000){
|
||||
/*this is abnormal*/
|
||||
UART_ERR_FUNC("stp_uart_tty_receive buffer count = %d\n", count);
|
||||
}
|
||||
|
||||
#if 0
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
do_gettimeofday(&now);
|
||||
|
||||
printk("[+STP][ ][R] %4d --> sec = %d, --> usec --> %d\n",
|
||||
count, now.tv_sec, now.tv_usec);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*There are multi-context to access here? Need to spinlock?*/
|
||||
/*Only one context: flush_to_ldisc in tty_buffer.c*/
|
||||
mtk_wcn_stp_parser_data((UINT8 *)data, (UINT32)count);
|
||||
|
||||
#if 0
|
||||
mtk_wcn_stp_debug_gpio_assert(IDX_STP_RX_PROC, DBG_TIE_HIGH);
|
||||
#endif
|
||||
|
||||
tty_unthrottle(tty);
|
||||
|
||||
#if 0
|
||||
{
|
||||
struct timeval now;
|
||||
|
||||
do_gettimeofday(&now);
|
||||
|
||||
printk("[-STP][ ][R] %4d --> sec = %d, --> usec --> %d\n",
|
||||
count, now.tv_sec, now.tv_usec);
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* stp_uart_tty_ioctl()
|
||||
*
|
||||
* Process IOCTL system call for the tty device.
|
||||
*
|
||||
* Arguments:
|
||||
*
|
||||
* tty pointer to tty instance data
|
||||
* file pointer to open file object for device
|
||||
* cmd IOCTL command code
|
||||
* arg argument for IOCTL call (cmd dependent)
|
||||
*
|
||||
* Return Value: Command dependent
|
||||
*/
|
||||
static int stp_uart_tty_ioctl(struct tty_struct *tty, struct file * file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
UART_DBG_FUNC("%s =>\n", __FUNCTION__);
|
||||
|
||||
switch (cmd) {
|
||||
case HCIUARTSETPROTO:
|
||||
UART_DBG_FUNC("<!!> Set low_latency to TRUE <!!>\n");
|
||||
tty->low_latency = 1;
|
||||
break;
|
||||
default:
|
||||
UART_DBG_FUNC("<!!> n_tty_ioctl_helper <!!>\n");
|
||||
err = n_tty_ioctl_helper(tty, file, cmd, arg);
|
||||
break;
|
||||
};
|
||||
UART_DBG_FUNC("%s <=\n", __FUNCTION__);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't provide read/write/poll interface for user space.
|
||||
*/
|
||||
static ssize_t stp_uart_tty_read(struct tty_struct *tty, struct file *file,
|
||||
unsigned char __user *buf, size_t nr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t stp_uart_tty_write(struct tty_struct *tty, struct file *file,
|
||||
const unsigned char *data, size_t count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int stp_uart_tty_poll(struct tty_struct *tty,
|
||||
struct file *filp, poll_table *wait)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32 mtk_wcn_uart_tx(const UINT8 *data, const UINT32 size, UINT32 *written_size)
|
||||
{
|
||||
int room;
|
||||
//int idx = 0;
|
||||
//unsigned long flags;
|
||||
unsigned int len;
|
||||
//static int tmp=0;
|
||||
static int i = 0;
|
||||
if(stp_tty == NULL) return -1;
|
||||
UART_DBG_FUNC("++\n");
|
||||
(*written_size) = 0;
|
||||
|
||||
// put data into ring buffer
|
||||
//down(&buf_mtx);
|
||||
|
||||
|
||||
/*
|
||||
[PatchNeed]
|
||||
spin_lock_irqsave is redundant
|
||||
*/
|
||||
//spin_lock_irqsave(&buf_lock, flags);
|
||||
|
||||
room = (wr_idx >= rd_idx) ? (MTKSTP_BUFFER_SIZE - (wr_idx - rd_idx) - 1) : (rd_idx - wr_idx - 1);
|
||||
UART_DBG_FUNC("r(%d)s(%d)wr_i(%d)rd_i(%d)\n\r", room, size, wr_idx, rd_idx);
|
||||
/*
|
||||
[PatchNeed]
|
||||
Block copy instead of byte copying
|
||||
*/
|
||||
if(data == NULL){
|
||||
UART_ERR_FUNC("pid(%d)(%s): data is NULL\n", current->pid, current->comm);
|
||||
(*written_size) = 0;
|
||||
UART_DBG_FUNC("--\n");
|
||||
return -2;
|
||||
}
|
||||
|
||||
#if 1
|
||||
if(unlikely(size > room)){
|
||||
UART_ERR_FUNC("pid(%d)(%s)room is not available, size needed(%d), wr_idx(%d), rd_idx(%d), room left(%d)\n", current->pid, current->comm, size, wr_idx, rd_idx, room);
|
||||
UART_DBG_FUNC("--\n");
|
||||
(*written_size) = 0;
|
||||
return -3;
|
||||
}
|
||||
else {
|
||||
/*
|
||||
wr_idx : the position next to write
|
||||
rd_idx : the position next to read
|
||||
*/
|
||||
len = min(size, MTKSTP_BUFFER_SIZE - (unsigned int)wr_idx);
|
||||
memcpy(&tx_buf[wr_idx], &data[0], len);
|
||||
memcpy(&tx_buf[0], &data[len], size - len);
|
||||
wr_idx = (wr_idx + size) % MTKSTP_BUFFER_SIZE;
|
||||
UART_DBG_FUNC("r(%d)s(%d)wr_i(%d)rd_i(%d)\n\r", room, size, wr_idx, rd_idx);
|
||||
i++;
|
||||
if (size < 0)
|
||||
{
|
||||
UART_ERR_FUNC("Error(i-%d):[pid(%d)(%s)]len(%d)size(%d)wr_i(%d)rd_i(%d)\n\r", i, current->pid, current->comm, len, size, wr_idx, rd_idx);
|
||||
(*written_size) = 0;
|
||||
}
|
||||
else if (size == 0)
|
||||
{
|
||||
(*written_size) = 0;
|
||||
}
|
||||
else if (size < MAX_PACKET_ALLOWED)
|
||||
{
|
||||
//only size ~(0, 2000) is allowed
|
||||
(*written_size) = stp_uart_tx_wakeup(stp_tty);
|
||||
if(*written_size < 0)
|
||||
{
|
||||
//reset read and write index of tx_buffer, is there any risk?
|
||||
wr_idx = rd_idx = 0;
|
||||
*written_size = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//we filter all packet with size > 2000
|
||||
UART_ERR_FUNC("Warnning(i-%d):[pid(%d)(%s)]len(%d)size(%d)wr_i(%d)rd_i(%d)\n\r", i, current->pid, current->comm, len, size, wr_idx, rd_idx);
|
||||
(*written_size)= 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if 0
|
||||
while((room > 0) && (size > 0))
|
||||
{
|
||||
tx_buf[wr_idx] = data[idx];
|
||||
wr_idx = ((wr_idx + 1) % MTKSTP_BUFFER_SIZE);
|
||||
idx++;
|
||||
room--;
|
||||
size--;
|
||||
(*written_size)++;
|
||||
}
|
||||
#endif
|
||||
//up(&buf_mtx);
|
||||
/*
|
||||
[PatchNeed]
|
||||
spin_lock_irqsave is redundant
|
||||
*/
|
||||
//// spin_lock_irqsave(&buf_lock, flags);
|
||||
|
||||
/*[PatchNeed]To add a tasklet to shedule Uart Tx*/
|
||||
UART_DBG_FUNC("--\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init mtk_wcn_stp_uart_init(void)
|
||||
{
|
||||
static struct tty_ldisc_ops stp_uart_ldisc;
|
||||
int err;
|
||||
int fifo_init_done =0;
|
||||
|
||||
UART_INFO_FUNC("mtk_wcn_stp_uart_init(): MTK STP UART driver\n");
|
||||
|
||||
#if (LDISC_RX == LDISC_RX_TASKLET)
|
||||
err = stp_uart_fifo_init();
|
||||
if (err != 0)
|
||||
{
|
||||
goto init_err;
|
||||
}
|
||||
fifo_init_done = 1;
|
||||
/*init rx tasklet*/
|
||||
tasklet_init(&g_stp_uart_rx_fifo_tasklet, stp_uart_rx_handling, (unsigned long) 0);
|
||||
|
||||
#elif (LDISC_RX == LDISC_RX_WORK)
|
||||
err = stp_uart_fifo_init();
|
||||
if (err != 0) {
|
||||
UART_ERR_FUNC("stp_uart_fifo_init(WORK) error(%d)\n", err);
|
||||
err = -EFAULT;
|
||||
goto init_err;
|
||||
}
|
||||
fifo_init_done = 1;
|
||||
|
||||
g_stp_uart_rx_work = vmalloc(sizeof(struct work_struct));
|
||||
if (!g_stp_uart_rx_work) {
|
||||
UART_ERR_FUNC("vmalloc work_struct(%d) fail\n", sizeof(struct work_struct));
|
||||
err = -ENOMEM;
|
||||
goto init_err;
|
||||
}
|
||||
|
||||
g_stp_uart_rx_wq = create_singlethread_workqueue("mtk_urxd");
|
||||
if (!g_stp_uart_rx_wq) {
|
||||
UART_ERR_FUNC("create_singlethread_workqueue fail\n");
|
||||
err = -ENOMEM;
|
||||
goto init_err;
|
||||
}
|
||||
|
||||
/* init rx work */
|
||||
INIT_WORK(g_stp_uart_rx_work, stp_uart_rx_worker);
|
||||
|
||||
#endif
|
||||
|
||||
/* Register the tty discipline */
|
||||
memset(&stp_uart_ldisc, 0, sizeof (stp_uart_ldisc));
|
||||
stp_uart_ldisc.magic = TTY_LDISC_MAGIC;
|
||||
stp_uart_ldisc.name = "n_mtkstp";
|
||||
stp_uart_ldisc.open = stp_uart_tty_open;
|
||||
stp_uart_ldisc.close = stp_uart_tty_close;
|
||||
stp_uart_ldisc.read = stp_uart_tty_read;
|
||||
stp_uart_ldisc.write = stp_uart_tty_write;
|
||||
stp_uart_ldisc.ioctl = stp_uart_tty_ioctl;
|
||||
stp_uart_ldisc.poll = stp_uart_tty_poll;
|
||||
stp_uart_ldisc.receive_buf = stp_uart_tty_receive;
|
||||
stp_uart_ldisc.write_wakeup = stp_uart_tty_wakeup;
|
||||
stp_uart_ldisc.owner = THIS_MODULE;
|
||||
|
||||
if ((err = tty_register_ldisc(N_MTKSTP, &stp_uart_ldisc)))
|
||||
{
|
||||
UART_ERR_FUNC("MTK STP line discipline registration failed. (%d)\n", err);
|
||||
goto init_err;
|
||||
}
|
||||
|
||||
/*
|
||||
mtk_wcn_stp_register_if_tx( mtk_wcn_uart_tx);
|
||||
*/
|
||||
|
||||
return 0;
|
||||
|
||||
init_err:
|
||||
|
||||
#if (LDISC_RX == LDISC_RX_TASKLET)
|
||||
/* nothing */
|
||||
if (fifo_init_done) {
|
||||
stp_uart_fifo_deinit();
|
||||
}
|
||||
#elif (LDISC_RX == LDISC_RX_WORK)
|
||||
if (g_stp_uart_rx_wq) {
|
||||
destroy_workqueue(g_stp_uart_rx_wq);
|
||||
g_stp_uart_rx_wq = NULL;
|
||||
}
|
||||
if (g_stp_uart_rx_work) {
|
||||
vfree(g_stp_uart_rx_work);
|
||||
}
|
||||
if (fifo_init_done) {
|
||||
stp_uart_fifo_deinit();
|
||||
}
|
||||
#endif
|
||||
UART_ERR_FUNC("init fail, return(%d)\n", err);
|
||||
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
static void __exit mtk_wcn_stp_uart_exit(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
mtk_wcn_stp_register_if_tx(STP_UART_IF_TX, NULL); // unregister if_tx function
|
||||
|
||||
/* Release tty registration of line discipline */
|
||||
if ((err = tty_unregister_ldisc(N_MTKSTP)))
|
||||
{
|
||||
UART_ERR_FUNC("Can't unregister MTK STP line discipline (%d)\n", err);
|
||||
}
|
||||
|
||||
#if (LDISC_RX == LDISC_RX_TASKLET)
|
||||
tasklet_kill(&g_stp_uart_rx_fifo_tasklet);
|
||||
stp_uart_fifo_deinit();
|
||||
#elif (LDISC_RX == LDISC_RX_WORK)
|
||||
if (g_stp_uart_rx_work) {
|
||||
cancel_work_sync(g_stp_uart_rx_work);
|
||||
}
|
||||
if (g_stp_uart_rx_wq) {
|
||||
destroy_workqueue(g_stp_uart_rx_wq);
|
||||
g_stp_uart_rx_wq = NULL;
|
||||
}
|
||||
if (g_stp_uart_rx_work) {
|
||||
vfree(g_stp_uart_rx_work);
|
||||
g_stp_uart_rx_work = NULL;
|
||||
}
|
||||
stp_uart_fifo_deinit();
|
||||
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
module_init(mtk_wcn_stp_uart_init);
|
||||
module_exit(mtk_wcn_stp_uart_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("MediaTek Inc WCN_SE_CS3");
|
||||
MODULE_DESCRIPTION("STP-HIF UART Interface");
|
||||
@@ -1,179 +0,0 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/sched.h>
|
||||
#include <asm/current.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/delay.h>
|
||||
#include "wmt_exp.h"
|
||||
#include "stp_exp.h"
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
#define WIFI_DRIVER_NAME "mtk_wmt_WIFI_chrdev"
|
||||
#if WMT_PLAT_APEX
|
||||
#define WIFI_DEV_MAJOR 194 // never used number
|
||||
#else
|
||||
#define WIFI_DEV_MAJOR 153 // never used number
|
||||
#endif
|
||||
|
||||
#define PFX "[MTK-WIFI] "
|
||||
#define WIFI_LOG_DBG 3
|
||||
#define WIFI_LOG_INFO 2
|
||||
#define WIFI_LOG_WARN 1
|
||||
#define WIFI_LOG_ERR 0
|
||||
|
||||
|
||||
unsigned int gDbgLevel = WIFI_LOG_INFO;
|
||||
|
||||
#define WIFI_DBG_FUNC(fmt, arg...) if(gDbgLevel >= WIFI_LOG_DBG){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define WIFI_INFO_FUNC(fmt, arg...) if(gDbgLevel >= WIFI_LOG_INFO){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define WIFI_WARN_FUNC(fmt, arg...) if(gDbgLevel >= WIFI_LOG_WARN){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define WIFI_ERR_FUNC(fmt, arg...) if(gDbgLevel >= WIFI_LOG_ERR){ printk(PFX "%s: " fmt, __FUNCTION__ ,##arg);}
|
||||
#define WIFI_TRC_FUNC(f) if(gDbgLevel >= WIFI_LOG_DBG){printk(PFX "<%s> <%d>\n", __FUNCTION__, __LINE__);}
|
||||
|
||||
#define VERSION "1.0"
|
||||
|
||||
static int WIFI_devs = 1; /* device count */
|
||||
static int WIFI_major = WIFI_DEV_MAJOR; /* dynamic allocation */
|
||||
module_param(WIFI_major, uint, 0);
|
||||
static struct cdev WIFI_cdev;
|
||||
volatile int retflag = 0;
|
||||
static struct semaphore wr_mtx;
|
||||
|
||||
static int WIFI_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
WIFI_INFO_FUNC("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int WIFI_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
WIFI_INFO_FUNC("%s: major %d minor %d (pid %d)\n", __func__,
|
||||
imajor(inode),
|
||||
iminor(inode),
|
||||
current->pid
|
||||
);
|
||||
retflag = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t WIFI_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
|
||||
{
|
||||
int retval = -EIO;
|
||||
char local[4] = {0};
|
||||
static int opened = 0;
|
||||
|
||||
down(&wr_mtx);
|
||||
|
||||
if (count > 0) {
|
||||
|
||||
if (0 == copy_from_user(local, buf, (count > 4) ? 4 : count)) {
|
||||
WIFI_INFO_FUNC("WIFI_write %c\n", local[0]);
|
||||
if (local[0] == '0' && opened == 1) {
|
||||
//TODO
|
||||
//Configure the EINT pin to GPIO mode.
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_off(WMTDRV_TYPE_WIFI)) {
|
||||
WIFI_INFO_FUNC("WMT turn off WIFI fail!\n");
|
||||
}
|
||||
else {
|
||||
WIFI_INFO_FUNC("WMT turn off WIFI OK!\n");
|
||||
opened = 0;
|
||||
retval = count;
|
||||
}
|
||||
}
|
||||
else if (local[0] == '1') {
|
||||
//TODO
|
||||
//Disable EINT(external interrupt), and set the GPIO to EINT mode.
|
||||
|
||||
if (MTK_WCN_BOOL_FALSE == mtk_wcn_wmt_func_on(WMTDRV_TYPE_WIFI)) {
|
||||
WIFI_WARN_FUNC("WMT turn on WIFI fail!\n");
|
||||
}
|
||||
else {
|
||||
opened = 1;
|
||||
retval = count;
|
||||
WIFI_INFO_FUNC("WMT turn on WIFI success!\n");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
up(&wr_mtx);
|
||||
return (retval);
|
||||
}
|
||||
|
||||
|
||||
struct file_operations WIFI_fops = {
|
||||
.open = WIFI_open,
|
||||
.release = WIFI_close,
|
||||
.write = WIFI_write,
|
||||
};
|
||||
|
||||
static int WIFI_init(void)
|
||||
{
|
||||
dev_t dev = MKDEV(WIFI_major, 0);
|
||||
int alloc_ret = 0;
|
||||
int cdev_err = 0;
|
||||
|
||||
/*static allocate chrdev*/
|
||||
alloc_ret = register_chrdev_region(dev, 1, WIFI_DRIVER_NAME);
|
||||
if (alloc_ret) {
|
||||
WIFI_ERR_FUNC("fail to register chrdev\n");
|
||||
return alloc_ret;
|
||||
}
|
||||
|
||||
cdev_init(&WIFI_cdev, &WIFI_fops);
|
||||
WIFI_cdev.owner = THIS_MODULE;
|
||||
|
||||
cdev_err = cdev_add(&WIFI_cdev, dev, WIFI_devs);
|
||||
if (cdev_err) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
sema_init(&wr_mtx, 1);
|
||||
|
||||
WIFI_INFO_FUNC("%s driver(major %d) installed.\n", WIFI_DRIVER_NAME, WIFI_major);
|
||||
retflag = 0;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (cdev_err == 0) {
|
||||
cdev_del(&WIFI_cdev);
|
||||
}
|
||||
|
||||
if (alloc_ret == 0) {
|
||||
unregister_chrdev_region(dev, WIFI_devs);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void WIFI_exit(void)
|
||||
{
|
||||
dev_t dev = MKDEV(WIFI_major, 0);
|
||||
retflag = 0;
|
||||
|
||||
cdev_del(&WIFI_cdev);
|
||||
unregister_chrdev_region(dev, WIFI_devs);
|
||||
|
||||
WIFI_INFO_FUNC("%s driver removed.\n", WIFI_DRIVER_NAME);
|
||||
}
|
||||
|
||||
module_init(WIFI_init);
|
||||
module_exit(WIFI_exit);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,346 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-CMB-HW]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "osal.h"
|
||||
#include "mtk_wcn_cmb_hw.h"
|
||||
#include "wmt_plat.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define DFT_RTC_STABLE_TIME 100
|
||||
#define DFT_LDO_STABLE_TIME 100
|
||||
#define DFT_RST_STABLE_TIME 30
|
||||
#define DFT_OFF_STABLE_TIME 10
|
||||
#define DFT_ON_STABLE_TIME 30
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
PWR_SEQ_TIME gPwrSeqTime;
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_pwr_off (VOID)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_off start\n");
|
||||
|
||||
/*1. disable irq --> should be done when do wmt-ic swDeinit period*/
|
||||
// TODO:[FixMe][GeorgeKuo] clarify this
|
||||
|
||||
/*2. set bgf eint/all eint to deinit state, namely input low state*/
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_DEINIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_DEINIT);
|
||||
WMT_INFO_FUNC("CMB-HW, BGF_EINT IRQ unregistered and set BGF_EINT GPIO to correct state!\n");
|
||||
/* 2.1 set ALL_EINT pin to correct state even it is not used currently */
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, ALL_EINT IRQ unregistered and disabled\n");
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_DEINIT);
|
||||
/* 2.2 deinit gps sync */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_SYNC, PIN_STA_DEINIT);
|
||||
|
||||
/*3. set audio interface to CMB_STUB_AIF_0, BT PCM OFF, I2S OFF*/
|
||||
iRet += wmt_plat_audio_ctrl(CMB_STUB_AIF_0, CMB_STUB_AIF_CTRL_DIS);
|
||||
|
||||
/*4. set control gpio into deinit state, namely input low state*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_SDIO_GRP, PIN_STA_DEINIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
|
||||
/*5. set uart tx/rx into deinit state, namely input low state*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_UART_GRP, PIN_STA_DEINIT);
|
||||
|
||||
/* 6. Last, LDO output low */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_OUT_L);
|
||||
|
||||
/*7. deinit gps_lna*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_LNA, PIN_STA_DEINIT);
|
||||
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_off finish\n");
|
||||
return iRet;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_pwr_on (VOID)
|
||||
{
|
||||
static UINT32 _pwr_first_time = 1;
|
||||
INT32 iRet = 0;
|
||||
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_on start\n");
|
||||
#if 0 //IRQ should in inact state before power on, so this step is not needed
|
||||
/* disable interrupt firstly */
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_EINT_DIS);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
#endif
|
||||
/*set all control and eint gpio to init state, namely input low mode*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_SDIO_GRP, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_SYNC, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_LNA, PIN_STA_INIT);
|
||||
// wmt_plat_gpio_ctrl(PIN_WIFI_EINT, PIN_STA_INIT); /* WIFI_EINT is controlled by SDIO host driver */
|
||||
// TODO: [FixMe][George]:WIFI_EINT is used in common SDIO
|
||||
|
||||
/*1. pull high LDO to supply power to chip*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.ldoStableTime);
|
||||
|
||||
/* 2. export RTC clock to chip*/
|
||||
if (_pwr_first_time) {
|
||||
/* rtc clock should be output all the time, so no need to enable output again*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RTC, PIN_STA_INIT);
|
||||
osal_msleep(gPwrSeqTime.rtcStableTime);
|
||||
WMT_INFO_FUNC("CMB-HW, rtc clock exported\n");
|
||||
}
|
||||
|
||||
/*3. set UART Tx/Rx to UART mode*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_UART_GRP, PIN_STA_INIT);
|
||||
|
||||
/*4. PMU->output low, RST->output low, sleep off stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
osal_msleep(gPwrSeqTime.offStableTime);
|
||||
|
||||
/*5. PMU->output high, sleep rst stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.rstStableTime);
|
||||
|
||||
/*6. RST->output high, sleep on stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.onStableTime);
|
||||
|
||||
/*7. set audio interface to CMB_STUB_AIF_1, BT PCM ON, I2S OFF*/
|
||||
/* BT PCM bus default mode. Real control is done by audio */
|
||||
iRet += wmt_plat_audio_ctrl(CMB_STUB_AIF_1, CMB_STUB_AIF_CTRL_DIS);
|
||||
|
||||
/*8. set EINT< -ommited-> move this to WMT-IC module, where common sdio interface will be identified and do proper operation*/
|
||||
// TODO: [FixMe][GeorgeKuo] double check if BGF_INT is implemented ok
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_MUX);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, BGF_EINT IRQ registered and disabled \n");
|
||||
|
||||
/* 8.1 set ALL_EINT pin to correct state even it is not used currently */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_MUX);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_on finish (%d)\n", iRet);
|
||||
|
||||
_pwr_first_time = 0;
|
||||
return iRet;
|
||||
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_rst (VOID)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
WMT_INFO_FUNC("CMB-HW, hw_rst start, eirq should be disabled before this step\n");
|
||||
|
||||
/*1. PMU->output low, RST->output low, sleep off stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
osal_msleep(gPwrSeqTime.offStableTime);
|
||||
|
||||
/*2. PMU->output high, sleep rst stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.rstStableTime);
|
||||
|
||||
/*3. RST->output high, sleep on stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.onStableTime);
|
||||
WMT_INFO_FUNC("CMB-HW, hw_rst finish, eirq should be enabled after this step\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static VOID
|
||||
mtk_wcn_cmb_hw_dmp_seq (VOID)
|
||||
{
|
||||
PUINT32 pTimeSlot = (PUINT32)&gPwrSeqTime;
|
||||
WMT_INFO_FUNC("combo chip power on sequence time, RTC (%d), LDO (%d), RST(%d), OFF(%d), ON(%d)\n",
|
||||
pTimeSlot[0], /**pTimeSlot++,*/
|
||||
pTimeSlot[1],
|
||||
pTimeSlot[2],
|
||||
pTimeSlot[3],
|
||||
pTimeSlot[4]
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_init (
|
||||
P_PWR_SEQ_TIME pPwrSeqTime
|
||||
)
|
||||
{
|
||||
if (NULL != pPwrSeqTime &&
|
||||
pPwrSeqTime->ldoStableTime > 0 &&
|
||||
pPwrSeqTime->rtcStableTime > 0 &&
|
||||
pPwrSeqTime->offStableTime > DFT_OFF_STABLE_TIME &&
|
||||
pPwrSeqTime->onStableTime > DFT_ON_STABLE_TIME &&
|
||||
pPwrSeqTime->rstStableTime > DFT_RST_STABLE_TIME
|
||||
) {
|
||||
/*memcpy may be more performance*/
|
||||
WMT_DBG_FUNC("setting hw init sequence parameters\n");
|
||||
osal_memcpy(&gPwrSeqTime, pPwrSeqTime, osal_sizeof(gPwrSeqTime));
|
||||
}
|
||||
else {
|
||||
WMT_WARN_FUNC("invalid pPwrSeqTime parameter, use default hw init sequence parameters\n");
|
||||
gPwrSeqTime.ldoStableTime = DFT_LDO_STABLE_TIME;
|
||||
gPwrSeqTime.offStableTime = DFT_OFF_STABLE_TIME;
|
||||
gPwrSeqTime.onStableTime = DFT_ON_STABLE_TIME;
|
||||
gPwrSeqTime.rstStableTime = DFT_RST_STABLE_TIME;
|
||||
gPwrSeqTime.rtcStableTime = DFT_RTC_STABLE_TIME;
|
||||
}
|
||||
mtk_wcn_cmb_hw_dmp_seq();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_deinit (VOID)
|
||||
{
|
||||
|
||||
WMT_WARN_FUNC("mtk_wcn_cmb_hw_deinit start, set to default hw init sequence parameters\n");
|
||||
gPwrSeqTime.ldoStableTime = DFT_LDO_STABLE_TIME;
|
||||
gPwrSeqTime.offStableTime = DFT_OFF_STABLE_TIME;
|
||||
gPwrSeqTime.onStableTime = DFT_ON_STABLE_TIME;
|
||||
gPwrSeqTime.rstStableTime = DFT_RST_STABLE_TIME;
|
||||
gPwrSeqTime.rtcStableTime = DFT_RTC_STABLE_TIME;
|
||||
WMT_WARN_FUNC("mtk_wcn_cmb_hw_deinit finish\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,348 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define CMB_STUB_LOG_INFO(fmt, arg...) printk(KERN_INFO fmt, ##arg)
|
||||
#define CMB_STUB_LOG_WARN(fmt, arg...) printk(KERN_WARNING fmt, ##arg)
|
||||
#define CMB_STUB_LOG_DBG(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
//#include <cust_gpio_usage.h>
|
||||
//#include <mach/mt6573_pll.h> /* clr_device_working_ability, MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE, MT65XX_PDN_PERI_MSDC2 */
|
||||
//#include <mach/mt6575_dcm.h>
|
||||
// TODO: [FixMe][GeorgeKuo] keep prototype unchanged temporarily. Replace it
|
||||
// when integrate MT6628 & ALPS & other built-in modules, such as AUDIO.
|
||||
//#include <mach/mt_combo.h>
|
||||
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static wmt_aif_ctrl_cb cmb_stub_aif_ctrl_cb = NULL;
|
||||
static wmt_func_ctrl_cb cmb_stub_func_ctrl_cb = NULL;
|
||||
static CMB_STUB_AIF_X cmb_stub_aif_stat = CMB_STUB_AIF_0;
|
||||
|
||||
/* A temp translation table between COMBO_AUDIO_STATE_X and CMB_STUB_AIF_X.
|
||||
* This is used for ALPS backward compatible ONLY!!! Remove this table, related
|
||||
* functions, and type definition after modifying other kernel built-in modules,
|
||||
* such as AUDIO. [FixMe][GeorgeKuo]
|
||||
*/
|
||||
static CMB_STUB_AIF_X audio2aif[] = {
|
||||
[COMBO_AUDIO_STATE_0] = CMB_STUB_AIF_0,
|
||||
[COMBO_AUDIO_STATE_1] = CMB_STUB_AIF_1,
|
||||
[COMBO_AUDIO_STATE_2] = CMB_STUB_AIF_2,
|
||||
[COMBO_AUDIO_STATE_3] = CMB_STUB_AIF_3,
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief A registration function for WMT-PLAT to register itself to CMB-STUB.
|
||||
*
|
||||
* An MTK-WCN-CMB-STUB registration function provided to WMT-PLAT to register
|
||||
* itself and related callback functions when driver being loaded into kernel.
|
||||
*
|
||||
* \param p_stub_cb a pointer carrying CMB_STUB_CB information
|
||||
*
|
||||
* \retval 0 operation success
|
||||
* \retval -1 invalid parameters
|
||||
*/
|
||||
int
|
||||
mtk_wcn_cmb_stub_reg (P_CMB_STUB_CB p_stub_cb)
|
||||
{
|
||||
if ( (!p_stub_cb )
|
||||
|| (p_stub_cb->size != sizeof(CMB_STUB_CB)) ) {
|
||||
CMB_STUB_LOG_WARN( "[cmb_stub] invalid p_stub_cb:0x%p size(%d)\n",
|
||||
p_stub_cb, (p_stub_cb) ? p_stub_cb->size: 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
CMB_STUB_LOG_DBG( "[cmb_stub] registered, p_stub_cb:0x%p size(%d)\n",
|
||||
p_stub_cb, p_stub_cb->size);
|
||||
|
||||
cmb_stub_aif_ctrl_cb = p_stub_cb->aif_ctrl_cb;
|
||||
cmb_stub_func_ctrl_cb = p_stub_cb->func_ctrl_cb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_reg);
|
||||
|
||||
/*!
|
||||
* \brief A unregistration function for WMT-PLAT to unregister from CMB-STUB.
|
||||
*
|
||||
* An MTK-WCN-CMB-STUB unregistration function provided to WMT-PLAT to
|
||||
* unregister itself and clear callback function references.
|
||||
*
|
||||
* \retval 0 operation success
|
||||
*/
|
||||
int
|
||||
mtk_wcn_cmb_stub_unreg (void)
|
||||
{
|
||||
cmb_stub_aif_ctrl_cb = NULL;
|
||||
cmb_stub_func_ctrl_cb = NULL;
|
||||
|
||||
CMB_STUB_LOG_INFO("[cmb_stub] unregistered \n"); /* KERN_DEBUG */
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_unreg);
|
||||
|
||||
/* stub functions for kernel to control audio path pin mux */
|
||||
int mtk_wcn_cmb_stub_aif_ctrl (CMB_STUB_AIF_X state, CMB_STUB_AIF_CTRL ctrl)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if ( (CMB_STUB_AIF_MAX <= state)
|
||||
|| (CMB_STUB_AIF_CTRL_MAX <= ctrl) ) {
|
||||
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] aif_ctrl invalid (%d, %d)\n", state, ctrl);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* avoid the early interrupt before we register the eirq_handler */
|
||||
if (cmb_stub_aif_ctrl_cb){
|
||||
ret = (*cmb_stub_aif_ctrl_cb)(state, ctrl);
|
||||
CMB_STUB_LOG_INFO( "[cmb_stub] aif_ctrl_cb state(%d->%d) ctrl(%d) ret(%d)\n",
|
||||
cmb_stub_aif_stat , state, ctrl, ret); /* KERN_DEBUG */
|
||||
|
||||
cmb_stub_aif_stat = state;
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] aif_ctrl_cb null \n");
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_aif_ctrl);
|
||||
|
||||
/* Use a temp translation table between COMBO_AUDIO_STATE_X and CMB_STUB_AIF_X
|
||||
* for ALPS backward compatible ONLY!!! Remove this table, related functions,
|
||||
* and type definition after modifying other kernel built-in modules, such as
|
||||
* AUDIO. [FixMe][GeorgeKuo]
|
||||
*/
|
||||
int
|
||||
mt_combo_audio_ctrl_ex (COMBO_AUDIO_STATE state, u32 clt_ctrl)
|
||||
{
|
||||
/* input sanity check */
|
||||
if (COMBO_AUDIO_STATE_MAX < state) {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] invalid COMBO_AUDIO_STATE(%d)\n", state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mtk_wcn_cmb_stub_aif_ctrl(audio2aif[state],
|
||||
(clt_ctrl) ? CMB_STUB_AIF_CTRL_EN : CMB_STUB_AIF_CTRL_DIS );
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_audio_ctrl_ex);
|
||||
|
||||
void mtk_wcn_cmb_stub_func_ctrl (unsigned int type, unsigned int on) {
|
||||
if (cmb_stub_func_ctrl_cb) {
|
||||
(*cmb_stub_func_ctrl_cb)(type, on);
|
||||
}
|
||||
else {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] func_ctrl_cb null \n");
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_func_ctrl);
|
||||
|
||||
/*platform-related APIs*/
|
||||
//void clr_device_working_ability(UINT32 clockId, MT6573_STATE state);
|
||||
//void set_device_working_ability(UINT32 clockId, MT6573_STATE state);
|
||||
|
||||
static int
|
||||
_mt_combo_plt_do_deep_idle(COMBO_IF src, int enter) {
|
||||
int ret = -1;
|
||||
|
||||
const char *combo_if_name[] =
|
||||
{ "COMBO_IF_UART",
|
||||
"COMBO_IF_MSDC"
|
||||
};
|
||||
|
||||
if(src != COMBO_IF_UART && src!= COMBO_IF_MSDC){
|
||||
CMB_STUB_LOG_WARN("src = %d is error\n", src);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(src >= 0 && src < COMBO_IF_MAX){
|
||||
CMB_STUB_LOG_INFO("src = %s, to enter deep idle? %d \n",
|
||||
combo_if_name[src],
|
||||
enter);
|
||||
}
|
||||
|
||||
/*TODO: For Common SDIO configuration, we need to do some judgement between STP and WIFI
|
||||
to decide if the msdc will enter deep idle safely*/
|
||||
|
||||
switch(src){
|
||||
case COMBO_IF_UART:
|
||||
if(enter == 0){
|
||||
//clr_device_working_ability(MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE);
|
||||
//disable_dpidle_by_bit(MT65XX_PDN_PERI_UART2);
|
||||
} else {
|
||||
//set_device_working_ability(MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE);
|
||||
//enable_dpidle_by_bit(MT65XX_PDN_PERI_UART2);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
case COMBO_IF_MSDC:
|
||||
if(enter == 0){
|
||||
//clr_device_working_ability(MT65XX_PDN_PERI_MSDC2, DEEP_IDLE_STATE);
|
||||
} else {
|
||||
//set_device_working_ability(MT65XX_PDN_PERI_MSDC2, DEEP_IDLE_STATE);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
mt_combo_plt_enter_deep_idle (
|
||||
COMBO_IF src
|
||||
) {
|
||||
//return 0;
|
||||
// TODO: [FixMe][GeorgeKuo] handling this depends on common UART or common SDIO
|
||||
return _mt_combo_plt_do_deep_idle(src, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_plt_enter_deep_idle);
|
||||
|
||||
int
|
||||
mt_combo_plt_exit_deep_idle (
|
||||
COMBO_IF src
|
||||
) {
|
||||
//return 0;
|
||||
// TODO: [FixMe][GeorgeKuo] handling this depends on common UART or common SDIO
|
||||
return _mt_combo_plt_do_deep_idle(src, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_plt_exit_deep_idle);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,110 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#if CONFIG_HAS_WAKELOCK
|
||||
#include <linux/wakelock.h>
|
||||
#define CFG_WMT_WAKELOCK_SUPPORT 1
|
||||
#endif
|
||||
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-PLAT]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* ALPS and COMBO header files */
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/* MTK_WCN_COMBO header files */
|
||||
#include "wmt_plat.h"
|
||||
#include "wmt_plat_stub.h"
|
||||
#include "wmt_exp.h"
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static VOID wmt_plat_func_ctrl (UINT32 type, UINT32 on);
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static VOID wmt_plat_func_ctrl (UINT32 type, UINT32 on)
|
||||
{
|
||||
if (on) {
|
||||
mtk_wcn_wmt_func_on((ENUM_WMTDRV_TYPE_T)type);
|
||||
}
|
||||
else {
|
||||
mtk_wcn_wmt_func_off((ENUM_WMTDRV_TYPE_T)type);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_plat_stub_init (void)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
CMB_STUB_CB stub_cb;
|
||||
stub_cb.aif_ctrl_cb = wmt_plat_audio_ctrl;
|
||||
stub_cb.func_ctrl_cb = wmt_plat_func_ctrl;
|
||||
stub_cb.size = sizeof(stub_cb);
|
||||
|
||||
/* register to cmb_stub */
|
||||
iRet = mtk_wcn_cmb_stub_reg(&stub_cb);
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,346 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-CMB-HW]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include "osal.h"
|
||||
#include "mtk_wcn_cmb_hw.h"
|
||||
#include "wmt_plat.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define DFT_RTC_STABLE_TIME 100
|
||||
#define DFT_LDO_STABLE_TIME 100
|
||||
#define DFT_RST_STABLE_TIME 30
|
||||
#define DFT_OFF_STABLE_TIME 10
|
||||
#define DFT_ON_STABLE_TIME 30
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
PWR_SEQ_TIME gPwrSeqTime;
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_pwr_off (VOID)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_off start\n");
|
||||
|
||||
/*1. disable irq --> should be done when do wmt-ic swDeinit period*/
|
||||
// TODO:[FixMe][GeorgeKuo] clarify this
|
||||
|
||||
/*2. set bgf eint/all eint to deinit state, namely input low state*/
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_DEINIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_DEINIT);
|
||||
WMT_INFO_FUNC("CMB-HW, BGF_EINT IRQ unregistered and set BGF_EINT GPIO to correct state!\n");
|
||||
/* 2.1 set ALL_EINT pin to correct state even it is not used currently */
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, ALL_EINT IRQ unregistered and disabled\n");
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_DEINIT);
|
||||
/* 2.2 deinit gps sync */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_SYNC, PIN_STA_DEINIT);
|
||||
|
||||
/*3. set audio interface to CMB_STUB_AIF_0, BT PCM OFF, I2S OFF*/
|
||||
iRet += wmt_plat_audio_ctrl(CMB_STUB_AIF_0, CMB_STUB_AIF_CTRL_DIS);
|
||||
|
||||
/*4. set control gpio into deinit state, namely input low state*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_SDIO_GRP, PIN_STA_DEINIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
|
||||
/*5. set uart tx/rx into deinit state, namely input low state*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_UART_GRP, PIN_STA_DEINIT);
|
||||
|
||||
/* 6. Last, LDO output low */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_OUT_L);
|
||||
|
||||
/*7. deinit gps_lna*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_LNA, PIN_STA_DEINIT);
|
||||
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_off finish\n");
|
||||
return iRet;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_pwr_on (VOID)
|
||||
{
|
||||
static UINT32 _pwr_first_time = 1;
|
||||
INT32 iRet = 0;
|
||||
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_on start\n");
|
||||
#if 0 //IRQ should in inact state before power on, so this step is not needed
|
||||
/* disable interrupt firstly */
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_EINT_DIS);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
#endif
|
||||
/*set all control and eint gpio to init state, namely input low mode*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_SDIO_GRP, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_SYNC, PIN_STA_INIT);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_GPS_LNA, PIN_STA_INIT);
|
||||
// wmt_plat_gpio_ctrl(PIN_WIFI_EINT, PIN_STA_INIT); /* WIFI_EINT is controlled by SDIO host driver */
|
||||
// TODO: [FixMe][George]:WIFI_EINT is used in common SDIO
|
||||
|
||||
/*1. pull high LDO to supply power to chip*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_LDO, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.ldoStableTime);
|
||||
|
||||
/* 2. export RTC clock to chip*/
|
||||
if (_pwr_first_time) {
|
||||
/* rtc clock should be output all the time, so no need to enable output again*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RTC, PIN_STA_INIT);
|
||||
osal_msleep(gPwrSeqTime.rtcStableTime);
|
||||
WMT_INFO_FUNC("CMB-HW, rtc clock exported\n");
|
||||
}
|
||||
|
||||
/*3. set UART Tx/Rx to UART mode*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_UART_GRP, PIN_STA_INIT);
|
||||
|
||||
/*4. PMU->output low, RST->output low, sleep off stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
osal_msleep(gPwrSeqTime.offStableTime);
|
||||
|
||||
/*5. PMU->output high, sleep rst stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.rstStableTime);
|
||||
|
||||
/*6. RST->output high, sleep on stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.onStableTime);
|
||||
|
||||
/*7. set audio interface to CMB_STUB_AIF_1, BT PCM ON, I2S OFF*/
|
||||
/* BT PCM bus default mode. Real control is done by audio */
|
||||
iRet += wmt_plat_audio_ctrl(CMB_STUB_AIF_1, CMB_STUB_AIF_CTRL_DIS);
|
||||
|
||||
/*8. set EINT< -ommited-> move this to WMT-IC module, where common sdio interface will be identified and do proper operation*/
|
||||
// TODO: [FixMe][GeorgeKuo] double check if BGF_INT is implemented ok
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_BGF_EINT, PIN_STA_MUX);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_BGF_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, BGF_EINT IRQ registered and disabled \n");
|
||||
|
||||
/* 8.1 set ALL_EINT pin to correct state even it is not used currently */
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_ALL_EINT, PIN_STA_MUX);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_INIT);
|
||||
iRet += wmt_plat_eirq_ctrl(PIN_ALL_EINT, PIN_STA_EINT_DIS);
|
||||
WMT_INFO_FUNC("CMB-HW, hw_pwr_on finish (%d)\n", iRet);
|
||||
|
||||
_pwr_first_time = 0;
|
||||
return iRet;
|
||||
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_rst (VOID)
|
||||
{
|
||||
INT32 iRet = 0;
|
||||
WMT_INFO_FUNC("CMB-HW, hw_rst start, eirq should be disabled before this step\n");
|
||||
|
||||
/*1. PMU->output low, RST->output low, sleep off stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_L);
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_L);
|
||||
osal_msleep(gPwrSeqTime.offStableTime);
|
||||
|
||||
/*2. PMU->output high, sleep rst stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_PMU, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.rstStableTime);
|
||||
|
||||
/*3. RST->output high, sleep on stable time*/
|
||||
iRet += wmt_plat_gpio_ctrl(PIN_RST, PIN_STA_OUT_H);
|
||||
osal_msleep(gPwrSeqTime.onStableTime);
|
||||
WMT_INFO_FUNC("CMB-HW, hw_rst finish, eirq should be enabled after this step\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static VOID
|
||||
mtk_wcn_cmb_hw_dmp_seq (VOID)
|
||||
{
|
||||
PUINT32 pTimeSlot = (PUINT32)&gPwrSeqTime;
|
||||
WMT_INFO_FUNC("combo chip power on sequence time, RTC (%d), LDO (%d), RST(%d), OFF(%d), ON(%d)\n",
|
||||
pTimeSlot[0], /**pTimeSlot++,*/
|
||||
pTimeSlot[1],
|
||||
pTimeSlot[2],
|
||||
pTimeSlot[3],
|
||||
pTimeSlot[4]
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_init (
|
||||
P_PWR_SEQ_TIME pPwrSeqTime
|
||||
)
|
||||
{
|
||||
if (NULL != pPwrSeqTime &&
|
||||
pPwrSeqTime->ldoStableTime > 0 &&
|
||||
pPwrSeqTime->rtcStableTime > 0 &&
|
||||
pPwrSeqTime->offStableTime > DFT_OFF_STABLE_TIME &&
|
||||
pPwrSeqTime->onStableTime > DFT_ON_STABLE_TIME &&
|
||||
pPwrSeqTime->rstStableTime > DFT_RST_STABLE_TIME
|
||||
) {
|
||||
/*memcpy may be more performance*/
|
||||
WMT_DBG_FUNC("setting hw init sequence parameters\n");
|
||||
osal_memcpy(&gPwrSeqTime, pPwrSeqTime, osal_sizeof(gPwrSeqTime));
|
||||
}
|
||||
else {
|
||||
WMT_WARN_FUNC("invalid pPwrSeqTime parameter, use default hw init sequence parameters\n");
|
||||
gPwrSeqTime.ldoStableTime = DFT_LDO_STABLE_TIME;
|
||||
gPwrSeqTime.offStableTime = DFT_OFF_STABLE_TIME;
|
||||
gPwrSeqTime.onStableTime = DFT_ON_STABLE_TIME;
|
||||
gPwrSeqTime.rstStableTime = DFT_RST_STABLE_TIME;
|
||||
gPwrSeqTime.rtcStableTime = DFT_RTC_STABLE_TIME;
|
||||
}
|
||||
mtk_wcn_cmb_hw_dmp_seq();
|
||||
return 0;
|
||||
}
|
||||
|
||||
INT32
|
||||
mtk_wcn_cmb_hw_deinit (VOID)
|
||||
{
|
||||
|
||||
WMT_WARN_FUNC("mtk_wcn_cmb_hw_deinit start, set to default hw init sequence parameters\n");
|
||||
gPwrSeqTime.ldoStableTime = DFT_LDO_STABLE_TIME;
|
||||
gPwrSeqTime.offStableTime = DFT_OFF_STABLE_TIME;
|
||||
gPwrSeqTime.onStableTime = DFT_ON_STABLE_TIME;
|
||||
gPwrSeqTime.rstStableTime = DFT_RST_STABLE_TIME;
|
||||
gPwrSeqTime.rtcStableTime = DFT_RTC_STABLE_TIME;
|
||||
WMT_WARN_FUNC("mtk_wcn_cmb_hw_deinit finish\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,348 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2009 MediaTek Inc.
|
||||
*
|
||||
* All rights reserved. Copying, compilation, modification, distribution
|
||||
* or any other use whatsoever of this material is strictly prohibited
|
||||
* except in accordance with a Software License Agreement with
|
||||
* MediaTek Inc.
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* LEGAL DISCLAIMER
|
||||
*
|
||||
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND
|
||||
* AGREES THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK
|
||||
* SOFTWARE") RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE
|
||||
* PROVIDED TO BUYER ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY
|
||||
* DISCLAIMS ANY AND ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
||||
* LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
* PARTICULAR PURPOSE OR NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE
|
||||
* ANY WARRANTY WHATSOEVER WITH RESPECT TO THE SOFTWARE OF ANY THIRD PARTY
|
||||
* WHICH MAY BE USED BY, INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK
|
||||
* SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY
|
||||
* WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE
|
||||
* FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S SPECIFICATION OR TO
|
||||
* CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
|
||||
*
|
||||
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
|
||||
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL
|
||||
* BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT
|
||||
* ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY
|
||||
* BUYER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
|
||||
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT
|
||||
* OF LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING
|
||||
* THEREOF AND RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN
|
||||
* FRANCISCO, CA, UNDER THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE
|
||||
* (ICC).
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define CMB_STUB_LOG_INFO(fmt, arg...) printk(KERN_INFO fmt, ##arg)
|
||||
#define CMB_STUB_LOG_WARN(fmt, arg...) printk(KERN_WARNING fmt, ##arg)
|
||||
#define CMB_STUB_LOG_DBG(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
//#include <cust_gpio_usage.h>
|
||||
//#include <mach/mt6573_pll.h> /* clr_device_working_ability, MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE, MT65XX_PDN_PERI_MSDC2 */
|
||||
//#include <mach/mt6575_dcm.h>
|
||||
// TODO: [FixMe][GeorgeKuo] keep prototype unchanged temporarily. Replace it
|
||||
// when integrate MT6628 & ALPS & other built-in modules, such as AUDIO.
|
||||
//#include <mach/mt_combo.h>
|
||||
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static wmt_aif_ctrl_cb cmb_stub_aif_ctrl_cb = NULL;
|
||||
static wmt_func_ctrl_cb cmb_stub_func_ctrl_cb = NULL;
|
||||
static CMB_STUB_AIF_X cmb_stub_aif_stat = CMB_STUB_AIF_0;
|
||||
|
||||
/* A temp translation table between COMBO_AUDIO_STATE_X and CMB_STUB_AIF_X.
|
||||
* This is used for ALPS backward compatible ONLY!!! Remove this table, related
|
||||
* functions, and type definition after modifying other kernel built-in modules,
|
||||
* such as AUDIO. [FixMe][GeorgeKuo]
|
||||
*/
|
||||
static CMB_STUB_AIF_X audio2aif[] = {
|
||||
[COMBO_AUDIO_STATE_0] = CMB_STUB_AIF_0,
|
||||
[COMBO_AUDIO_STATE_1] = CMB_STUB_AIF_1,
|
||||
[COMBO_AUDIO_STATE_2] = CMB_STUB_AIF_2,
|
||||
[COMBO_AUDIO_STATE_3] = CMB_STUB_AIF_3,
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
* \brief A registration function for WMT-PLAT to register itself to CMB-STUB.
|
||||
*
|
||||
* An MTK-WCN-CMB-STUB registration function provided to WMT-PLAT to register
|
||||
* itself and related callback functions when driver being loaded into kernel.
|
||||
*
|
||||
* \param p_stub_cb a pointer carrying CMB_STUB_CB information
|
||||
*
|
||||
* \retval 0 operation success
|
||||
* \retval -1 invalid parameters
|
||||
*/
|
||||
int
|
||||
mtk_wcn_cmb_stub_reg (P_CMB_STUB_CB p_stub_cb)
|
||||
{
|
||||
if ( (!p_stub_cb )
|
||||
|| (p_stub_cb->size != sizeof(CMB_STUB_CB)) ) {
|
||||
CMB_STUB_LOG_WARN( "[cmb_stub] invalid p_stub_cb:0x%p size(%d)\n",
|
||||
p_stub_cb, (p_stub_cb) ? p_stub_cb->size: 0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
CMB_STUB_LOG_DBG( "[cmb_stub] registered, p_stub_cb:0x%p size(%d)\n",
|
||||
p_stub_cb, p_stub_cb->size);
|
||||
|
||||
cmb_stub_aif_ctrl_cb = p_stub_cb->aif_ctrl_cb;
|
||||
cmb_stub_func_ctrl_cb = p_stub_cb->func_ctrl_cb;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_reg);
|
||||
|
||||
/*!
|
||||
* \brief A unregistration function for WMT-PLAT to unregister from CMB-STUB.
|
||||
*
|
||||
* An MTK-WCN-CMB-STUB unregistration function provided to WMT-PLAT to
|
||||
* unregister itself and clear callback function references.
|
||||
*
|
||||
* \retval 0 operation success
|
||||
*/
|
||||
int
|
||||
mtk_wcn_cmb_stub_unreg (void)
|
||||
{
|
||||
cmb_stub_aif_ctrl_cb = NULL;
|
||||
cmb_stub_func_ctrl_cb = NULL;
|
||||
|
||||
CMB_STUB_LOG_INFO("[cmb_stub] unregistered \n"); /* KERN_DEBUG */
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_unreg);
|
||||
|
||||
/* stub functions for kernel to control audio path pin mux */
|
||||
int mtk_wcn_cmb_stub_aif_ctrl (CMB_STUB_AIF_X state, CMB_STUB_AIF_CTRL ctrl)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if ( (CMB_STUB_AIF_MAX <= state)
|
||||
|| (CMB_STUB_AIF_CTRL_MAX <= ctrl) ) {
|
||||
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] aif_ctrl invalid (%d, %d)\n", state, ctrl);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* avoid the early interrupt before we register the eirq_handler */
|
||||
if (cmb_stub_aif_ctrl_cb){
|
||||
ret = (*cmb_stub_aif_ctrl_cb)(state, ctrl);
|
||||
CMB_STUB_LOG_INFO( "[cmb_stub] aif_ctrl_cb state(%d->%d) ctrl(%d) ret(%d)\n",
|
||||
cmb_stub_aif_stat , state, ctrl, ret); /* KERN_DEBUG */
|
||||
|
||||
cmb_stub_aif_stat = state;
|
||||
return ret;
|
||||
}
|
||||
else {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] aif_ctrl_cb null \n");
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_aif_ctrl);
|
||||
|
||||
/* Use a temp translation table between COMBO_AUDIO_STATE_X and CMB_STUB_AIF_X
|
||||
* for ALPS backward compatible ONLY!!! Remove this table, related functions,
|
||||
* and type definition after modifying other kernel built-in modules, such as
|
||||
* AUDIO. [FixMe][GeorgeKuo]
|
||||
*/
|
||||
int
|
||||
mt_combo_audio_ctrl_ex (COMBO_AUDIO_STATE state, u32 clt_ctrl)
|
||||
{
|
||||
/* input sanity check */
|
||||
if (COMBO_AUDIO_STATE_MAX < state) {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] invalid COMBO_AUDIO_STATE(%d)\n", state);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mtk_wcn_cmb_stub_aif_ctrl(audio2aif[state],
|
||||
(clt_ctrl) ? CMB_STUB_AIF_CTRL_EN : CMB_STUB_AIF_CTRL_DIS );
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_audio_ctrl_ex);
|
||||
|
||||
void mtk_wcn_cmb_stub_func_ctrl (unsigned int type, unsigned int on) {
|
||||
if (cmb_stub_func_ctrl_cb) {
|
||||
(*cmb_stub_func_ctrl_cb)(type, on);
|
||||
}
|
||||
else {
|
||||
CMB_STUB_LOG_WARN("[cmb_stub] func_ctrl_cb null \n");
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mtk_wcn_cmb_stub_func_ctrl);
|
||||
|
||||
/*platform-related APIs*/
|
||||
//void clr_device_working_ability(UINT32 clockId, MT6573_STATE state);
|
||||
//void set_device_working_ability(UINT32 clockId, MT6573_STATE state);
|
||||
|
||||
static int
|
||||
_mt_combo_plt_do_deep_idle(COMBO_IF src, int enter) {
|
||||
int ret = -1;
|
||||
|
||||
const char *combo_if_name[] =
|
||||
{ "COMBO_IF_UART",
|
||||
"COMBO_IF_MSDC"
|
||||
};
|
||||
|
||||
if(src != COMBO_IF_UART && src!= COMBO_IF_MSDC){
|
||||
CMB_STUB_LOG_WARN("src = %d is error\n", src);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(src >= 0 && src < COMBO_IF_MAX){
|
||||
CMB_STUB_LOG_INFO("src = %s, to enter deep idle? %d \n",
|
||||
combo_if_name[src],
|
||||
enter);
|
||||
}
|
||||
|
||||
/*TODO: For Common SDIO configuration, we need to do some judgement between STP and WIFI
|
||||
to decide if the msdc will enter deep idle safely*/
|
||||
|
||||
switch(src){
|
||||
case COMBO_IF_UART:
|
||||
if(enter == 0){
|
||||
//clr_device_working_ability(MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE);
|
||||
//disable_dpidle_by_bit(MT65XX_PDN_PERI_UART2);
|
||||
} else {
|
||||
//set_device_working_ability(MT65XX_PDN_PERI_UART3, DEEP_IDLE_STATE);
|
||||
//enable_dpidle_by_bit(MT65XX_PDN_PERI_UART2);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
case COMBO_IF_MSDC:
|
||||
if(enter == 0){
|
||||
//clr_device_working_ability(MT65XX_PDN_PERI_MSDC2, DEEP_IDLE_STATE);
|
||||
} else {
|
||||
//set_device_working_ability(MT65XX_PDN_PERI_MSDC2, DEEP_IDLE_STATE);
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -1;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
mt_combo_plt_enter_deep_idle (
|
||||
COMBO_IF src
|
||||
) {
|
||||
//return 0;
|
||||
// TODO: [FixMe][GeorgeKuo] handling this depends on common UART or common SDIO
|
||||
return _mt_combo_plt_do_deep_idle(src, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_plt_enter_deep_idle);
|
||||
|
||||
int
|
||||
mt_combo_plt_exit_deep_idle (
|
||||
COMBO_IF src
|
||||
) {
|
||||
//return 0;
|
||||
// TODO: [FixMe][GeorgeKuo] handling this depends on common UART or common SDIO
|
||||
return _mt_combo_plt_do_deep_idle(src, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(mt_combo_plt_exit_deep_idle);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,110 +0,0 @@
|
||||
/*! \file
|
||||
\brief Declaration of library functions
|
||||
|
||||
Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#if CONFIG_HAS_WAKELOCK
|
||||
#include <linux/wakelock.h>
|
||||
#define CFG_WMT_WAKELOCK_SUPPORT 1
|
||||
#endif
|
||||
|
||||
#ifdef DFT_TAG
|
||||
#undef DFT_TAG
|
||||
#endif
|
||||
#define DFT_TAG "[WMT-PLAT]"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* E X T E R N A L R E F E R E N C E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* ALPS and COMBO header files */
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/* MTK_WCN_COMBO header files */
|
||||
#include "wmt_plat.h"
|
||||
#include "wmt_plat_stub.h"
|
||||
#include "wmt_exp.h"
|
||||
#include <mach/mtk_wcn_cmb_stub.h>
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N D E C L A R A T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static VOID wmt_plat_func_ctrl (UINT32 type, UINT32 on);
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P U B L I C D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* P R I V A T E D A T A
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* F U N C T I O N S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
static VOID wmt_plat_func_ctrl (UINT32 type, UINT32 on)
|
||||
{
|
||||
if (on) {
|
||||
mtk_wcn_wmt_func_on((ENUM_WMTDRV_TYPE_T)type);
|
||||
}
|
||||
else {
|
||||
mtk_wcn_wmt_func_off((ENUM_WMTDRV_TYPE_T)type);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
INT32 wmt_plat_stub_init (void)
|
||||
{
|
||||
INT32 iRet = -1;
|
||||
CMB_STUB_CB stub_cb;
|
||||
stub_cb.aif_ctrl_cb = wmt_plat_audio_ctrl;
|
||||
stub_cb.func_ctrl_cb = wmt_plat_func_ctrl;
|
||||
stub_cb.size = sizeof(stub_cb);
|
||||
|
||||
/* register to cmb_stub */
|
||||
iRet = mtk_wcn_cmb_stub_reg(&stub_cb);
|
||||
return iRet;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
# Copyright Statement:
|
||||
#
|
||||
# This software/firmware and related documentation ("MediaTek Software") are
|
||||
# protected under relevant copyright laws. The information contained herein
|
||||
# is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
# Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
# any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
# and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
#
|
||||
# MediaTek Inc. (C) 2010. All rights reserved.
|
||||
#
|
||||
# BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
# THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
# RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
# AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
# NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
# SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
# SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
# THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
# THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
# CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
# SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
# STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
# CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
# AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
# OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
# MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
#
|
||||
# The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
# have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
# applicable license agreements with MediaTek Inc.
|
||||
|
||||
|
||||
#
|
||||
# Makefile for the Linux Bluetooth HCI device drivers.
|
||||
#
|
||||
ccflags-y := -I$(src)/include -I$(src)/../common/include -I$(src)/../common/linux/include
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_BT_HCI) += hci_stp.o
|
||||
hci_stp-objs := linux/hci_stp.o
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein
|
||||
* is confidential and proprietary to MediaTek Inc. and/or its licensors.
|
||||
* Without the prior written permission of MediaTek inc. and/or its licensors,
|
||||
* any reproduction, modification, use or disclosure of MediaTek Software,
|
||||
* and information contained herein, in whole or in part, shall be strictly prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
|
||||
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
|
||||
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
|
||||
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
|
||||
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
|
||||
* THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
|
||||
* CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
|
||||
* SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
|
||||
* CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
|
||||
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
|
||||
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
|
||||
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek Software")
|
||||
* have been modified by MediaTek Inc. All revisions are subject to any receiver's
|
||||
* applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
static struct btradio_conf_data sDefaultCfg =
|
||||
{
|
||||
{0x00, 0x00, 0x46, 0x66, 0x20, 0x01},
|
||||
{0x60, 0x00},
|
||||
{0x23, 0x10, 0x00, 0x00},
|
||||
{0x06, 0x80, 0x00, 0x06, 0x03, 0x06},
|
||||
{0x03, 0x40, 0x1F, 0x40, 0x1F, 0x00, 0x04},
|
||||
{0x80, 0x00},
|
||||
{0xFF, 0xFF, 0xFF}
|
||||
};
|
||||
@@ -1,172 +0,0 @@
|
||||
/* Copyright Statement:
|
||||
*
|
||||
* This software/firmware and related documentation ("MediaTek Software") are
|
||||
* protected under relevant copyright laws. The information contained herein is
|
||||
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
|
||||
* the prior written permission of MediaTek inc. and/or its licensors, any
|
||||
* reproduction, modification, use or disclosure of MediaTek Software, and
|
||||
* information contained herein, in whole or in part, shall be strictly
|
||||
* prohibited.
|
||||
*
|
||||
* MediaTek Inc. (C) 2010. All rights reserved.
|
||||
*
|
||||
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
|
||||
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
|
||||
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
|
||||
* ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
|
||||
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||||
* NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
|
||||
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
|
||||
* INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
|
||||
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
|
||||
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
|
||||
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
|
||||
* SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
|
||||
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
|
||||
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
|
||||
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
|
||||
* RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
|
||||
* MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
|
||||
* CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
|
||||
*
|
||||
* The following software/firmware and/or related documentation ("MediaTek
|
||||
* Software") have been modified by MediaTek Inc. All revisions are subject to
|
||||
* any receiver's applicable license agreements with MediaTek Inc.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _HCI_STP_H
|
||||
#define _HCI_STP_H
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/poll.h>
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/fs.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
/* debugging */
|
||||
#include <linux/time.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
/* constant of kernel version */
|
||||
#include <linux/version.h>
|
||||
|
||||
/* kthread APIs */
|
||||
#include <linux/kthread.h>
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* C O M P I L E R F L A G S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
#define HCI_STP_TX_TASKLET (0) /* do tx in a tasklet context */
|
||||
#define HCI_STP_TX_THRD (1) /* do tx in an init thread context */
|
||||
/* select tx context */
|
||||
#define HCI_STP_TX (HCI_STP_TX_THRD)
|
||||
|
||||
|
||||
#if (HCI_STP_TX == HCI_STP_TX_TASKLET)
|
||||
#define HCI_STP_TX_TASKLET_RWLOCK (0) /* use rwlock_t */
|
||||
#define HCI_STP_TX_TASKLET_SPINLOCK (1) /* use spinlock_t */
|
||||
/* select txq protection method */
|
||||
#define HCI_STP_TX_TASKLET_LOCK (HCI_STP_TX_TASKLET_SPINLOCK)
|
||||
#endif
|
||||
|
||||
/* Flag to enable BD address auto-gen mechanism */
|
||||
/* Auto-gen address is illegal, default disabled */
|
||||
#define BD_ADDR_AUTOGEN (0)
|
||||
|
||||
/*******************************************************************************
|
||||
* C O N S T A N T S
|
||||
********************************************************************************
|
||||
*/
|
||||
|
||||
/* HCI-STP flag bits */
|
||||
#define HCI_STP_PROTO_SET (0)
|
||||
/* HCI-STP flag TX states bits */
|
||||
#define HCI_STP_SENDING (1)
|
||||
#define HCI_STP_TX_WAKEUP (2)
|
||||
|
||||
/* maximum delay required, shall also consider possible delay on a busy system. */
|
||||
#define BT_CMD_DELAY_MS_COMM (100) /*(50)*/
|
||||
#define BT_CMD_DELAY_MS_RESET (600) /*(500)*/
|
||||
|
||||
#define BT_CMD_DELAY_SAFE_GUARD (20) /*(2)*/
|
||||
|
||||
/* HCI-STP safer hci_reset handling */
|
||||
#define HCI_STP_SAFE_RESET (1)
|
||||
|
||||
/*******************************************************************************
|
||||
* D A T A T Y P E S
|
||||
********************************************************************************
|
||||
*/
|
||||
struct hci_stp_init_cmd {
|
||||
unsigned char *hci_cmd;
|
||||
unsigned int cmdSz;
|
||||
unsigned char *hci_evt;
|
||||
unsigned int evtSz;
|
||||
char *str;
|
||||
};
|
||||
|
||||
struct hci_stp {
|
||||
struct hci_dev *hdev;
|
||||
unsigned long flags;
|
||||
|
||||
struct sk_buff_head txq; /* used to queue TX packets */
|
||||
unsigned long tx_state;
|
||||
|
||||
struct work_struct init_work;
|
||||
struct completion *p_init_comp;
|
||||
wait_queue_head_t *p_init_evt_wq;
|
||||
spinlock_t init_lock; /* protect init variables: comp and wq */
|
||||
unsigned int init_cmd_idx;
|
||||
int init_evt_rx_flag; /* init result of last sent cmd */
|
||||
|
||||
#if HCI_STP_SAFE_RESET
|
||||
wait_queue_head_t reset_wq;
|
||||
atomic_t reset_count; /* !0: reset in progress */
|
||||
#endif
|
||||
//void *priv; /* unused? */
|
||||
//struct sk_buff *tx_skb; /* unused? */
|
||||
//spinlock_t rx_lock; /* unused? */
|
||||
};
|
||||
|
||||
struct btradio_conf_data {
|
||||
unsigned char addr[6];
|
||||
unsigned char voice[2];
|
||||
unsigned char codec[4];
|
||||
unsigned char radio[6];
|
||||
unsigned char sleep[7];
|
||||
unsigned char feature[2];
|
||||
unsigned char tx_pwr_offset[3];
|
||||
};
|
||||
/*******************************************************************************
|
||||
* M A C R O S
|
||||
********************************************************************************
|
||||
*/
|
||||
#define hci_stp_init_entry(c) \
|
||||
{.hci_cmd=c, .cmdSz=sizeof(c), .hci_evt=c##_evt, .evtSz=sizeof(c##_evt), .str=#c}
|
||||
|
||||
#endif /* end of _HCI_STP_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,82 +0,0 @@
|
||||
# Makefile generated by Mediatek
|
||||
# fm support
|
||||
|
||||
#6628 FM driver
|
||||
ifeq ($(CONFIG_MTK_COMBO_CHIP_MT6628), y)
|
||||
$(warning MT6628_FM)
|
||||
ccflags-y += -I$(src)/inc \
|
||||
-I$(src)/mt6628/inc \
|
||||
-I$(src)/../common/include \
|
||||
-I$(src)/../common/linux/include \
|
||||
-I$(src)/cust/mt6628 \
|
||||
-I$(src)/private/inc \
|
||||
-DMT6628_FM
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_FM) += mtk_fm_drv.o
|
||||
mtk_fm_drv-objs += core/fm_module.o \
|
||||
core/fm_main.o \
|
||||
core/fm_config.o \
|
||||
core/fm_rds_parser.o \
|
||||
core/fm_patch.o \
|
||||
core/fm_utils.o \
|
||||
core/fm_link.o \
|
||||
core/fm_eint.o \
|
||||
mt6628/pub/mt6628_fm_lib.o \
|
||||
mt6628/pub/mt6628_fm_rds.o \
|
||||
mt6628/pub/mt6628_fm_cmd.o \
|
||||
mt6628/pub/mt6628_fm_config.o
|
||||
$(warning $(mtk_fm_drv-objs))
|
||||
endif
|
||||
|
||||
# MT6620 FM driver
|
||||
ifeq ($(CONFIG_MTK_COMBO_CHIP_MT6620), y)
|
||||
$(warning MT6620_FM)
|
||||
ccflags-y += -I$(src)/inc \
|
||||
-I$(src)/mt6620/inc \
|
||||
-I$(src)/../common/include \
|
||||
-I$(src)/../common/linux/include \
|
||||
-I$(src)/cust/mt6620 \
|
||||
-I$(src)/private/inc \
|
||||
-DMT6620_FM
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_FM) += mtk_fm_drv.o
|
||||
mtk_fm_drv-objs += core/fm_module.o \
|
||||
core/fm_main.o \
|
||||
core/fm_config.o \
|
||||
core/fm_rds_parser.o \
|
||||
core/fm_patch.o \
|
||||
core/fm_utils.o \
|
||||
core/fm_link.o \
|
||||
core/fm_eint.o \
|
||||
mt6620/pub/mt6620_fm_lib.o \
|
||||
mt6620/pub/mt6620_fm_rds.o \
|
||||
mt6620/pub/mt6620_fm_cmd.o \
|
||||
mt6620/pub/mt6620_fm_config.o
|
||||
$(warning $(mtk_fm_drv-objs))
|
||||
endif
|
||||
|
||||
# MT6626 FM driver
|
||||
ifeq ($(CONFIG_MTK_COMBO_CHIP_MT6626), y)
|
||||
FM_CHIP = mt6626
|
||||
FM_CHIP_PATH = $(FM_CHIP)/pub/$(FM_CHIP)
|
||||
ccflags-y := -I$(src)/inc \
|
||||
-I$(src)/$(FM_CHIP)/inc \
|
||||
-I$(src)/cust/$(FM_CHIP) \
|
||||
-I$(src)/private/inc \
|
||||
-DMT6626_FM
|
||||
|
||||
obj-$(CONFIG_MTK_COMBO_FM) += mtk_fm_drv.o
|
||||
mtk_fm_drv-objs := core/fm_module.o \
|
||||
core/fm_main.o \
|
||||
core/fm_config.o \
|
||||
core/fm_patch.o \
|
||||
core/fm_rds_parser.o \
|
||||
core/fm_utils.o \
|
||||
core/fm_link.o \
|
||||
$(FM_CHIP_PATH)_fm_lib.o \
|
||||
$(FM_CHIP_PATH)_fm_rds.o \
|
||||
$(FM_CHIP_PATH)_fm_link.o \
|
||||
$(FM_CHIP_PATH)_fm_eint.o
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,597 +0,0 @@
|
||||
/* fm_config.c
|
||||
*
|
||||
* (C) Copyright 2011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver
|
||||
*
|
||||
* 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/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_rds.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_stdlib.h"
|
||||
#include "fm_patch.h"
|
||||
#include "fm_config.h"
|
||||
#if (!defined(MT6628_FM)&&!defined(MT6620_FM))
|
||||
#include "fm_cust_cfg.h"
|
||||
#endif
|
||||
static fm_cust_cfg fm_config;
|
||||
static fm_s32 fm_index = 0;
|
||||
|
||||
#if 0
|
||||
static fm_s32 to_upper(fm_s8 *str)
|
||||
{
|
||||
fm_s32 i = 0;
|
||||
|
||||
for (i = 0; i < (int)strlen(str); i++) {
|
||||
if (('a' <= str[i]) && (str[i] <= 'z')) {
|
||||
str[i] = str[i] - ('a' - 'A');
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
fm_s32 to_upper_n(fm_s8 *str, fm_s32 len)
|
||||
{
|
||||
fm_s32 i = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (('a' <= str[i]) && (str[i] <= 'z')) {
|
||||
str[i] = str[i] - ('a' - 'A');
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 check_hex_str(fm_s8 *str, fm_s32 len)
|
||||
{
|
||||
fm_s32 i = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if ((('a' <= str[i]) && (str[i] <= 'z')) || (('A' <= str[i]) && (str[i] <= 'Z')) || (('0' <= str[i]) && (str[i] <= '9'))) {
|
||||
;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 check_dec_str(fm_s8 *str, fm_s32 len)
|
||||
{
|
||||
fm_s32 i = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (('0' <= str[i]) && (str[i] <= '9')) {
|
||||
;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex)
|
||||
{
|
||||
fm_s32 len = (fm_s32)strlen(in_ascii);
|
||||
int i = 0;
|
||||
fm_u16 tmp;
|
||||
|
||||
len = (len > 4) ? 4 : len;
|
||||
|
||||
if (check_hex_str(in_ascii, len)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
to_upper_n(in_ascii, len);
|
||||
*out_hex = 0;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
if (in_ascii[len-i-1] < 'A') {
|
||||
tmp = in_ascii[len-i-1];
|
||||
*out_hex |= ((tmp - '0') << (4 * i));
|
||||
} else {
|
||||
tmp = in_ascii[len-i-1];
|
||||
*out_hex |= ((tmp - 'A' + 10) << (4 * i));
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec)
|
||||
{
|
||||
fm_s32 len = (fm_s32)strlen(in_ascii);
|
||||
int i = 0;
|
||||
int flag;
|
||||
int multi = 1;
|
||||
|
||||
len = (len > 10) ? 10 : len;
|
||||
|
||||
if (in_ascii[0] == '-') {
|
||||
flag = -1;
|
||||
in_ascii += 1;
|
||||
len -= 1;
|
||||
} else {
|
||||
flag = 1;
|
||||
}
|
||||
|
||||
if (check_dec_str(in_ascii, len)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
*out_dec = 0;
|
||||
multi = 1;
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
*out_dec += ((in_ascii[len-i-1] - '0') * multi);
|
||||
multi *= 10;
|
||||
}
|
||||
|
||||
*out_dec *= flag;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 trim_string(fm_s8 **start)
|
||||
{
|
||||
fm_s8 *end = *start;
|
||||
|
||||
/* Advance to non-space character */
|
||||
while (*(*start) == ' ') {
|
||||
(*start)++;
|
||||
}
|
||||
|
||||
/* Move to end of string */
|
||||
while (*end != '\0') {
|
||||
(end)++;
|
||||
}
|
||||
|
||||
/* Backup to non-space character */
|
||||
do {
|
||||
end--;
|
||||
} while ((end >= *start) && (*end == ' '));
|
||||
|
||||
/* Terminate string after last non-space character */
|
||||
*(++end) = '\0';
|
||||
return (end - *start);
|
||||
}
|
||||
|
||||
fm_s32 trim_path(fm_s8 **start)
|
||||
{
|
||||
fm_s8 *end = *start;
|
||||
|
||||
while (*(*start) == ' ') {
|
||||
(*start)++;
|
||||
}
|
||||
|
||||
while (*end != '\0') {
|
||||
(end)++;
|
||||
}
|
||||
|
||||
do {
|
||||
end--;
|
||||
} while ((end >= *start) && ((*end == ' ') || (*end == '\n') || (*end == '\r')));
|
||||
|
||||
*(++end) = '\0';
|
||||
return (end - *start);
|
||||
}
|
||||
|
||||
fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
fm_s8 *p = buffer;
|
||||
fm_s8 *group_start = NULL;
|
||||
fm_s8 *key_start = NULL;
|
||||
fm_s8 *value_start = NULL;
|
||||
|
||||
enum fm_cfg_parser_state state = FM_CFG_STAT_NONE;
|
||||
|
||||
FMR_ASSERT(p);
|
||||
|
||||
for (p = buffer; *p != '\0'; p++) {
|
||||
switch (state) {
|
||||
case FM_CFG_STAT_NONE: {
|
||||
if (*p == '[') {
|
||||
//if we get char '[' in none state, it means a new group name start
|
||||
state = FM_CFG_STAT_GROUP;
|
||||
group_start = p + 1;
|
||||
} else if (*p == COMMENT_CHAR) {
|
||||
//if we get char '#' in none state, it means a new comment start
|
||||
state = FM_CFG_STAT_COMMENT;
|
||||
} else if (!isspace(*p) && (*p != '\n') && (*p != '\r')) {
|
||||
//if we get an nonspace char in none state, it means a new key start
|
||||
state = FM_CFG_STAT_KEY;
|
||||
key_start = p;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case FM_CFG_STAT_GROUP: {
|
||||
if (*p == ']') {
|
||||
//if we get char ']' in group state, it means a group name complete
|
||||
*p = '\0';
|
||||
//FIX_ME
|
||||
//record group name
|
||||
state = FM_CFG_STAT_NONE;
|
||||
trim_string(&group_start);
|
||||
//WCN_DBG(FM_NTC|MAIN, "g=%s\n", group_start);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case FM_CFG_STAT_COMMENT: {
|
||||
if (*p == '\n') {
|
||||
//if we get char '\n' in comment state, it means new line start
|
||||
state = FM_CFG_STAT_NONE;
|
||||
group_start = p + 1;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case FM_CFG_STAT_KEY: {
|
||||
if (*p == DELIMIT_CHAR) {
|
||||
//if we get char '=' in key state, it means a key name complete
|
||||
*p = '\0';
|
||||
//FIX_ME
|
||||
//record key name
|
||||
state = FM_CFG_STAT_VALUE;
|
||||
value_start = p + 1;
|
||||
trim_string(&key_start);
|
||||
//WCN_DBG(FM_NTC|MAIN, "k=%s\n", key_start);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case FM_CFG_STAT_VALUE: {
|
||||
if (*p == '\n' || *p == '\r') {
|
||||
//if we get char '\n' or '\r' in value state, it means a value complete
|
||||
*p = '\0';
|
||||
//record value
|
||||
trim_string(&value_start);
|
||||
//WCN_DBG(FM_NTC|MAIN, "v=%s\n", value_start);
|
||||
|
||||
if (handler) {
|
||||
ret = handler(group_start, key_start, value_start, cfg);
|
||||
}
|
||||
|
||||
state = FM_CFG_STAT_NONE;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
fm_u16 tmp_hex;
|
||||
fm_s32 tmp_dec;
|
||||
|
||||
//WCN_DBG(FM_NTC|MAIN,"src_key=%s,src_val=%s\n", src_key,src_val);
|
||||
//WCN_DBG(FM_NTC|MAIN,"dst_key=%s\n", dst_key);
|
||||
if (strcmp(src_key, dst_key) == 0) {
|
||||
if (strncmp(src_val, "0x", strlen("0x")) == 0) {
|
||||
src_val += strlen("0x");
|
||||
//WCN_DBG(FM_NTC|MAIN,"%s\n", src_val);
|
||||
ret = ascii_to_hex(src_val, &tmp_hex);
|
||||
|
||||
if (!ret) {
|
||||
*dst_val = tmp_hex;
|
||||
//WCN_DBG(FM_NTC|MAIN, "%s 0x%04x\n", dst_key, tmp_hex);
|
||||
return 0;
|
||||
} else {
|
||||
//WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key);
|
||||
return 1;
|
||||
}
|
||||
} else {
|
||||
ret = ascii_to_dec(src_val, &tmp_dec);
|
||||
|
||||
if (!ret /*&& ((0 <= tmp_dec) && (tmp_dec <= 0xFFFF))*/) {
|
||||
*dst_val = tmp_dec;
|
||||
//WCN_DBG(FM_NTC|MAIN, "%s %d\n", dst_key, tmp_dec);
|
||||
return 0;
|
||||
} else {
|
||||
//WCN_DBG(FM_ERR | MAIN, "%s format error\n", dst_key);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// WCN_DBG(FM_ERR | MAIN, "src_key!=dst_key\n");
|
||||
//}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static fm_s32 cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
|
||||
struct fm_tx_cust_cfg *tx_cfg = &cfg->tx_cfg;
|
||||
|
||||
if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_L", &rx_cfg->long_ana_rssi_th))) {//FMR_RSSI_TH_L = 0x0301
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_RSSI_TH_S", &rx_cfg->short_ana_rssi_th))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_CQI_TH", &rx_cfg->cqi_th))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_MR_TH", &rx_cfg->mr_th))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_SMG_TH", &rx_cfg->smg_th))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_CH_SIZE", &rx_cfg->scan_ch_size))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_SCAN_SORT", &rx_cfg->scan_sort))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_SEEK_SPACE", &rx_cfg->seek_space))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND", &rx_cfg->band))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_L", &rx_cfg->band_freq_l))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_BAND_FREQ_H", &rx_cfg->band_freq_h))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH", &rx_cfg->fake_ch[fm_index]))) {
|
||||
fm_index += 1;
|
||||
rx_cfg->fake_ch_num = (rx_cfg->fake_ch_num < fm_index) ? fm_index : rx_cfg->fake_ch_num;
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_FAKE_CH_RSSI", &rx_cfg->fake_ch_rssi_th))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_DEEMPHASIS", &rx_cfg->deemphasis))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMR_OSC_FREQ", &rx_cfg->osc_freq))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_L", &tx_cfg->scan_hole_low))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMT_SCAN_HOLE_H", &tx_cfg->scan_hole_high))) {
|
||||
return ret;
|
||||
} else if (0 <= (ret = cfg_item_match(key, val, "FMT_PWR_LVL_MAX", &tx_cfg->power_level))) {
|
||||
return ret;
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | MAIN, "invalid key\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static fm_s32 fm_cust_config_default(fm_cust_cfg *cfg)
|
||||
{
|
||||
FMR_ASSERT(cfg);
|
||||
#if (!defined(MT6628_FM)&&!defined(MT6620_FM))
|
||||
|
||||
cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG;
|
||||
cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT;
|
||||
cfg->rx_cfg.cqi_th = FM_RX_CQI_TH;
|
||||
cfg->rx_cfg.mr_th = FM_RX_MR_TH;
|
||||
cfg->rx_cfg.smg_th = FM_RX_SMG_TH;
|
||||
cfg->rx_cfg.scan_ch_size = FM_RX_SCAN_CH_SIZE;
|
||||
cfg->rx_cfg.seek_space = FM_RX_SEEK_SPACE;
|
||||
cfg->rx_cfg.band = FM_RX_BAND;
|
||||
cfg->rx_cfg.band_freq_l = FM_RX_BAND_FREQ_L;
|
||||
cfg->rx_cfg.band_freq_h = FM_RX_BAND_FREQ_H;
|
||||
cfg->rx_cfg.scan_sort = FM_RX_SCAN_SORT_SELECT;
|
||||
cfg->rx_cfg.fake_ch_num = FM_RX_FAKE_CH_NUM;
|
||||
cfg->rx_cfg.fake_ch_rssi_th = FM_RX_FAKE_CH_RSSI;
|
||||
cfg->rx_cfg.fake_ch[0] = FM_RX_FAKE_CH_1;
|
||||
cfg->rx_cfg.fake_ch[1] = FM_RX_FAKE_CH_2;
|
||||
cfg->rx_cfg.fake_ch[2] = FM_RX_FAKE_CH_3;
|
||||
cfg->rx_cfg.fake_ch[3] = FM_RX_FAKE_CH_4;
|
||||
cfg->rx_cfg.fake_ch[4] = FM_RX_FAKE_CH_5;
|
||||
cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS;
|
||||
|
||||
cfg->tx_cfg.scan_hole_low = FM_TX_SCAN_HOLE_LOW;
|
||||
cfg->tx_cfg.scan_hole_high = FM_TX_SCAN_HOLE_HIGH;
|
||||
cfg->tx_cfg.power_level = FM_TX_PWR_LEVEL_MAX;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
fm_s8 *buf = NULL;
|
||||
fm_s32 file_len = 0;
|
||||
|
||||
if (!(buf = fm_zalloc(4096))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
fm_index = 0;
|
||||
|
||||
file_len = fm_file_read(filename, buf, 4096, 0);
|
||||
|
||||
if (file_len <= 0) {
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = cfg_parser(buf, cfg_item_handler, cfg);
|
||||
|
||||
out:
|
||||
|
||||
if (buf) {
|
||||
fm_free(buf);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static fm_s32 fm_cust_config_print(fm_cust_cfg *cfg)
|
||||
{
|
||||
fm_s32 i;
|
||||
|
||||
WCN_DBG(FM_NTC | MAIN, "rssi_l:\t0x%04x\n", cfg->rx_cfg.long_ana_rssi_th);
|
||||
WCN_DBG(FM_NTC | MAIN, "rssi_s:\t0x%04x\n", cfg->rx_cfg.short_ana_rssi_th);
|
||||
WCN_DBG(FM_NTC | MAIN, "mr_th:\t0x%04x\n", cfg->rx_cfg.mr_th);
|
||||
WCN_DBG(FM_NTC | MAIN, "cqi_th:\t0x%04x\n", cfg->rx_cfg.cqi_th);
|
||||
WCN_DBG(FM_NTC | MAIN, "smg_th:\t0x%04x\n", cfg->rx_cfg.smg_th);
|
||||
WCN_DBG(FM_NTC | MAIN, "scan_ch_size:\t%d\n", cfg->rx_cfg.scan_ch_size);
|
||||
WCN_DBG(FM_NTC | MAIN, "seek_space:\t%d\n", cfg->rx_cfg.seek_space);
|
||||
WCN_DBG(FM_NTC | MAIN, "band:\t%d\n", cfg->rx_cfg.band);
|
||||
WCN_DBG(FM_NTC | MAIN, "band_freq_l:\t%d\n", cfg->rx_cfg.band_freq_l);
|
||||
WCN_DBG(FM_NTC | MAIN, "band_freq_h:\t%d\n", cfg->rx_cfg.band_freq_h);
|
||||
WCN_DBG(FM_NTC | MAIN, "scan_sort:\t%d\n", cfg->rx_cfg.scan_sort);
|
||||
WCN_DBG(FM_NTC | MAIN, "fake_ch_num:\t%d\n", cfg->rx_cfg.fake_ch_num);
|
||||
WCN_DBG(FM_NTC | MAIN, "fake_ch_rssi_th:\t%d\n", cfg->rx_cfg.fake_ch_rssi_th);
|
||||
|
||||
for (i = 0; i < cfg->rx_cfg.fake_ch_num; i++) {
|
||||
WCN_DBG(FM_NTC | MAIN, "fake_ch:\t%d\n", cfg->rx_cfg.fake_ch[i]);
|
||||
}
|
||||
|
||||
WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
|
||||
WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
|
||||
WCN_DBG(FM_NTC | MAIN, "scan_hole_low:\t%d\n", cfg->tx_cfg.scan_hole_low);
|
||||
WCN_DBG(FM_NTC | MAIN, "scan_hole_high:\t%d\n", cfg->tx_cfg.scan_hole_high);
|
||||
WCN_DBG(FM_NTC | MAIN, "power_level:\t%d\n", cfg->tx_cfg.power_level);
|
||||
|
||||
return 0;
|
||||
}
|
||||
fm_s32 fm_cust_config(const fm_s8 *filepath)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
fm_s8 *filep = NULL;
|
||||
fm_s8 file_path[51] = {0};
|
||||
|
||||
fm_cust_config_default(&fm_config);
|
||||
WCN_DBG(FM_NTC | MAIN, "FM default config\n");
|
||||
fm_cust_config_print(&fm_config);
|
||||
|
||||
if (!filepath) {
|
||||
filep = FM_CUST_CFG_PATH;
|
||||
} else {
|
||||
memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
|
||||
filep = file_path;
|
||||
trim_path(&filep);
|
||||
}
|
||||
|
||||
ret = fm_cust_config_file(filep, &fm_config);
|
||||
WCN_DBG(FM_NTC | MAIN, "FM cust config\n");
|
||||
fm_cust_config_print(&fm_config);
|
||||
return ret;
|
||||
}
|
||||
|
||||
fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code)
|
||||
{
|
||||
fm_u16 tmp = 0;
|
||||
fm_s32 i;
|
||||
static fm_s32 fake_ch_idx = 0;
|
||||
|
||||
switch (op_code) {
|
||||
//For FM RX
|
||||
case FM_CFG_RX_RSSI_TH_LONG: {
|
||||
tmp = fm_config.rx_cfg.long_ana_rssi_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_RSSI_TH_SHORT: {
|
||||
tmp = fm_config.rx_cfg.short_ana_rssi_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_CQI_TH: {
|
||||
tmp = fm_config.rx_cfg.cqi_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_MR_TH: {
|
||||
tmp = fm_config.rx_cfg.mr_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_SMG_TH: {
|
||||
tmp = fm_config.rx_cfg.smg_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_SCAN_CH_SIZE: {
|
||||
tmp = fm_config.rx_cfg.scan_ch_size;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_SEEK_SPACE: {
|
||||
tmp = fm_config.rx_cfg.seek_space;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_BAND: {
|
||||
tmp = fm_config.rx_cfg.band;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_BAND_FREQ_L: {
|
||||
tmp = fm_config.rx_cfg.band_freq_l;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_BAND_FREQ_H: {
|
||||
tmp = fm_config.rx_cfg.band_freq_h;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_SCAN_SORT: {
|
||||
tmp = fm_config.rx_cfg.scan_sort;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_FAKE_CH_NUM: {
|
||||
tmp = fm_config.rx_cfg.fake_ch_num;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_FAKE_CH: {
|
||||
tmp = fm_config.rx_cfg.fake_ch[fake_ch_idx];
|
||||
i = (fm_config.rx_cfg.fake_ch_num > 0) ? fm_config.rx_cfg.fake_ch_num : FAKE_CH_MAX;
|
||||
fake_ch_idx++;
|
||||
fake_ch_idx = fake_ch_idx % i;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_FAKE_CH_RSSI: {
|
||||
tmp = fm_config.rx_cfg.fake_ch_rssi_th;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_DEEMPHASIS: {
|
||||
tmp = fm_config.rx_cfg.deemphasis;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_RX_OSC_FREQ: {
|
||||
tmp = fm_config.rx_cfg.osc_freq;
|
||||
break;
|
||||
}
|
||||
//For FM TX
|
||||
case FM_CFG_TX_SCAN_HOLE_LOW: {
|
||||
tmp = fm_config.tx_cfg.scan_hole_low;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_TX_SCAN_HOLE_HIGH: {
|
||||
tmp = fm_config.tx_cfg.scan_hole_high;
|
||||
break;
|
||||
}
|
||||
case FM_CFG_TX_PWR_LEVEL: {
|
||||
tmp = fm_config.tx_cfg.power_level;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
WCN_DBG(FM_DBG | MAIN, "cust cfg %d: 0x%04x\n", op_code, tmp);
|
||||
return tmp;
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
/* mt6620_fm_eint.c
|
||||
*
|
||||
* (C) Copyright 2009
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Run <Run.Liu@MediaTek.com>
|
||||
*
|
||||
* WCN combo chip FM Radio Driver -- EINT functions
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
#if (defined(MT6620_FM)||defined(MT6628_FM))
|
||||
#include "stp_exp.h"
|
||||
#include "wmt_exp.h"
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_eint.h"
|
||||
|
||||
fm_s32 fm_enable_eint(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_disable_eint(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_request_eint(void (*parser)(void))
|
||||
{
|
||||
WCN_DBG(FM_NTC|EINT,"%s\n", __func__);
|
||||
|
||||
mtk_wcn_stp_register_event_cb(FM_TASK_INDX, parser);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_eint_pin_cfg(fm_s32 mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
@@ -1,550 +0,0 @@
|
||||
/* fm_link.c
|
||||
*
|
||||
* (C) Copyright 2012
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver -- setup data link common part
|
||||
*
|
||||
* 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/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_stdlib.h"
|
||||
#include "fm_link.h"
|
||||
#if (defined(MT6620_FM)||defined(MT6628_FM))
|
||||
#include "stp_exp.h"
|
||||
#include "wmt_exp.h"
|
||||
static struct fm_link_event *link_event;
|
||||
|
||||
static struct fm_trace_fifo_t *cmd_fifo;
|
||||
|
||||
static struct fm_trace_fifo_t *evt_fifo;
|
||||
|
||||
static fm_s32 (*reset)(fm_s32 sta) = NULL;
|
||||
|
||||
static void WCNfm_wholechip_rst_cb(ENUM_WMTDRV_TYPE_T src,
|
||||
ENUM_WMTDRV_TYPE_T dst,
|
||||
ENUM_WMTMSG_TYPE_T type,
|
||||
void *buf,
|
||||
unsigned int sz)
|
||||
{
|
||||
//To handle reset procedure please
|
||||
ENUM_WMTRSTMSG_TYPE_T rst_msg;
|
||||
|
||||
if (sz <= sizeof(ENUM_WMTRSTMSG_TYPE_T)) {
|
||||
memcpy((char *)&rst_msg, (char *)buf, sz);
|
||||
WCN_DBG(FM_WAR | LINK, "[src=%d], [dst=%d], [type=%d], [buf=0x%x], [sz=%d], [max=%d]\n", src, dst, type, rst_msg, sz, WMTRSTMSG_RESET_MAX);
|
||||
|
||||
if ((src == WMTDRV_TYPE_WMT) && (dst == WMTDRV_TYPE_FM) && (type == WMTMSG_TYPE_RESET)) {
|
||||
if (rst_msg == WMTRSTMSG_RESET_START) {
|
||||
WCN_DBG(FM_WAR | LINK, "FM restart start!\n");
|
||||
if (reset) {
|
||||
reset(1);
|
||||
}
|
||||
|
||||
} else if (rst_msg == WMTRSTMSG_RESET_END) {
|
||||
WCN_DBG(FM_WAR | LINK, "FM restart end!\n");
|
||||
if (reset) {
|
||||
reset(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/*message format invalid*/
|
||||
WCN_DBG(FM_WAR | LINK, "message format invalid!\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_link_setup(void* data)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
|
||||
if (!(link_event = fm_zalloc(sizeof(struct fm_link_event)))) {
|
||||
WCN_DBG(FM_ALT | LINK, "fm_zalloc(fm_link_event) -ENOMEM\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
link_event->ln_event = fm_flag_event_create("ln_evt");
|
||||
|
||||
if (!link_event->ln_event) {
|
||||
WCN_DBG(FM_ALT | LINK, "create mt6620_ln_event failed\n");
|
||||
fm_free(link_event);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fm_flag_event_get(link_event->ln_event);
|
||||
|
||||
|
||||
WCN_DBG(FM_NTC | LINK, "fm link setup\n");
|
||||
|
||||
cmd_fifo = fm_trace_fifo_create("cmd_fifo");
|
||||
if (!cmd_fifo) {
|
||||
WCN_DBG(FM_ALT | LINK, "create cmd_fifo failed\n");
|
||||
ret = -1;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
evt_fifo = fm_trace_fifo_create("evt_fifo");
|
||||
if (!evt_fifo) {
|
||||
WCN_DBG(FM_ALT | LINK, "create evt_fifo failed\n");
|
||||
ret = -1;
|
||||
goto failed;
|
||||
}
|
||||
|
||||
reset = data; // get whole chip reset cb
|
||||
mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_FM, WCNfm_wholechip_rst_cb);
|
||||
return 0;
|
||||
|
||||
failed:
|
||||
fm_trace_fifo_release(evt_fifo);
|
||||
fm_trace_fifo_release(cmd_fifo);
|
||||
fm_flag_event_put(link_event->ln_event);
|
||||
if (link_event) {
|
||||
fm_free(link_event);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
fm_s32 fm_link_release(void)
|
||||
{
|
||||
|
||||
fm_trace_fifo_release(evt_fifo);
|
||||
fm_trace_fifo_release(cmd_fifo);
|
||||
fm_flag_event_put(link_event->ln_event);
|
||||
if (link_event) {
|
||||
fm_free(link_event);
|
||||
}
|
||||
|
||||
WCN_DBG(FM_NTC | LINK, "fm link release\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fm_ctrl_rx
|
||||
* the low level func to read a rigister
|
||||
* @addr - rigister address
|
||||
* @val - the pointer of target buf
|
||||
* If success, return 0; else error code
|
||||
*/
|
||||
fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fm_ctrl_tx
|
||||
* the low level func to write a rigister
|
||||
* @addr - rigister address
|
||||
* @val - value will be writed in the rigister
|
||||
* If success, return 0; else error code
|
||||
*/
|
||||
fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* fm_cmd_tx() - send cmd to FM firmware and wait event
|
||||
* @buf - send buffer
|
||||
* @len - the length of cmd
|
||||
* @mask - the event flag mask
|
||||
* @ cnt - the retry conter
|
||||
* @timeout - timeout per cmd
|
||||
* Return 0, if success; error code, if failed
|
||||
*/
|
||||
fm_s32 fm_cmd_tx(fm_u8* buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, fm_s32(*callback)(struct fm_res_ctx* result))
|
||||
{
|
||||
fm_s32 ret_time = 0;
|
||||
struct task_struct *task = current;
|
||||
struct fm_trace_t trace;
|
||||
|
||||
if ((NULL == buf) || (len < 0) || (0 == mask)
|
||||
|| (cnt > SW_RETRY_CNT_MAX) || (timeout > SW_WAIT_TIMEOUT_MAX)) {
|
||||
WCN_DBG(FM_ERR | LINK, "cmd tx, invalid para\n");
|
||||
return -FM_EPARA;
|
||||
}
|
||||
|
||||
FM_EVENT_CLR(link_event->ln_event, mask);
|
||||
|
||||
#ifdef FM_TRACE_ENABLE
|
||||
trace.type = buf[0];
|
||||
trace.opcode = buf[1];
|
||||
trace.len = len - 4;
|
||||
trace.tid = (fm_s32)task->pid;
|
||||
fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
|
||||
fm_memcpy(trace.pkt, &buf[4], (trace.len > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : trace.len);
|
||||
#endif
|
||||
|
||||
sw_retry:
|
||||
|
||||
#ifdef FM_TRACE_ENABLE
|
||||
if (fm_true == FM_TRACE_FULL(cmd_fifo)) {
|
||||
FM_TRACE_OUT(cmd_fifo, NULL);
|
||||
}
|
||||
FM_TRACE_IN(cmd_fifo, &trace);
|
||||
#endif
|
||||
|
||||
//send cmd to FM firmware
|
||||
if ((ret_time = mtk_wcn_stp_send_data(buf, len, FM_TASK_INDX)) <= 0)
|
||||
{
|
||||
WCN_DBG(FM_EMG | LINK, "send data over stp failed[%d]\n",ret_time);
|
||||
return -FM_ELINK;
|
||||
}
|
||||
|
||||
//wait the response form FM firmware
|
||||
ret_time = FM_EVENT_WAIT_TIMEOUT(link_event->ln_event, mask, timeout);
|
||||
|
||||
if (!ret_time) {
|
||||
if (0 < cnt--) {
|
||||
WCN_DBG(FM_WAR | LINK, "wait even timeout, [retry_cnt=%d], pid=%d\n", cnt, task->pid);
|
||||
fm_print_cmd_fifo();
|
||||
fm_print_evt_fifo();
|
||||
return -FM_EFW;
|
||||
goto sw_retry; //retry if timeout and retry cnt > 0
|
||||
} else {
|
||||
WCN_DBG(FM_ALT | LINK, "fatal error, SW retry failed, reset HW\n");
|
||||
return -FM_EFW;
|
||||
}
|
||||
}
|
||||
|
||||
FM_EVENT_CLR(link_event->ln_event, mask);
|
||||
|
||||
if (callback) {
|
||||
callback(&link_event->result);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_event_parser(fm_s32(*rds_parser)(struct rds_rx_t*, fm_s32))
|
||||
{
|
||||
fm_s32 len;
|
||||
fm_s32 i = 0;
|
||||
fm_u8 opcode = 0;
|
||||
fm_u16 length = 0;
|
||||
fm_u8 ch;
|
||||
fm_u8 rx_buf[RX_BUF_SIZE + 10] = {0}; //the 10 bytes are protect gaps
|
||||
static volatile fm_task_parser_state state = FM_TASK_RX_PARSER_PKT_TYPE;
|
||||
struct fm_trace_t trace;
|
||||
struct task_struct *task = current;
|
||||
|
||||
len = mtk_wcn_stp_receive_data(rx_buf, RX_BUF_SIZE, FM_TASK_INDX);
|
||||
WCN_DBG(FM_DBG | LINK, "[len=%d],[CMD=0x%02x 0x%02x 0x%02x 0x%02x]\n", len, rx_buf[0], rx_buf[1], rx_buf[2], rx_buf[3]);
|
||||
|
||||
while (i < len) {
|
||||
ch = rx_buf[i];
|
||||
|
||||
switch (state) {
|
||||
case FM_TASK_RX_PARSER_PKT_TYPE:
|
||||
|
||||
if (ch == FM_TASK_EVENT_PKT_TYPE) {
|
||||
if ((i + 5) < RX_BUF_SIZE) {
|
||||
WCN_DBG(FM_DBG | LINK, "0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x \n", rx_buf[i], rx_buf[i+1], rx_buf[i+2], rx_buf[i+3], rx_buf[i+4], rx_buf[i+5]);
|
||||
} else {
|
||||
WCN_DBG(FM_DBG | LINK, "0x%02x 0x%02x\n", rx_buf[i], rx_buf[i+1]);
|
||||
}
|
||||
|
||||
state = FM_TASK_RX_PARSER_OPCODE;
|
||||
} else {
|
||||
WCN_DBG(FM_ALT | LINK, "event pkt type error (rx_buf[%d] = 0x%02x)\n", i, ch);
|
||||
}
|
||||
|
||||
i++;
|
||||
break;
|
||||
|
||||
case FM_TASK_RX_PARSER_OPCODE:
|
||||
i++;
|
||||
opcode = ch;
|
||||
state = FM_TASK_RX_PARSER_PKT_LEN_1;
|
||||
break;
|
||||
|
||||
case FM_TASK_RX_PARSER_PKT_LEN_1:
|
||||
i++;
|
||||
length = ch;
|
||||
state = FM_TASK_RX_PARSER_PKT_LEN_2;
|
||||
break;
|
||||
|
||||
case FM_TASK_RX_PARSER_PKT_LEN_2:
|
||||
i++;
|
||||
length |= (fm_u16)(ch << 0x8);
|
||||
|
||||
#ifdef FM_TRACE_ENABLE
|
||||
trace.type = FM_TASK_EVENT_PKT_TYPE;
|
||||
trace.opcode = opcode;
|
||||
trace.len = length;
|
||||
trace.tid = (fm_s32)task->pid;
|
||||
fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
|
||||
fm_memcpy(trace.pkt, &rx_buf[i], (length > FM_TRACE_PKT_SIZE) ? FM_TRACE_PKT_SIZE : length);
|
||||
|
||||
if (fm_true == FM_TRACE_FULL(cmd_fifo)) {
|
||||
FM_TRACE_OUT(cmd_fifo, NULL);
|
||||
}
|
||||
FM_TRACE_IN(cmd_fifo, &trace);
|
||||
#endif
|
||||
if (length > 0) {
|
||||
state = FM_TASK_RX_PARSER_PKT_PAYLOAD;
|
||||
} else {
|
||||
state = FM_TASK_RX_PARSER_PKT_TYPE;
|
||||
FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FM_TASK_RX_PARSER_PKT_PAYLOAD:
|
||||
|
||||
switch (opcode) {
|
||||
case FM_TUNE_OPCODE:
|
||||
|
||||
if ((length == 1) && (rx_buf[i] == 1)) {
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_TUNE_DONE);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FM_SOFT_MUTE_TUNE_OPCODE:
|
||||
|
||||
if (length >= 2) {
|
||||
fm_memcpy(link_event->result.cqi, &rx_buf[i], (length > FM_CQI_BUF_SIZE) ? FM_CQI_BUF_SIZE : length);
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_SM_TUNE);
|
||||
}
|
||||
break;
|
||||
|
||||
case FM_SEEK_OPCODE:
|
||||
|
||||
if ((i + 1) < RX_BUF_SIZE) {
|
||||
link_event->result.seek_result = rx_buf[i] + (rx_buf[i+1] << 8); // 8760 means 87.60Mhz
|
||||
}
|
||||
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_SEEK_DONE);
|
||||
break;
|
||||
|
||||
case FM_SCAN_OPCODE:
|
||||
|
||||
//check if the result data is long enough
|
||||
if ((RX_BUF_SIZE - i) < (sizeof(fm_u16) * FM_SCANTBL_SIZE)) {
|
||||
WCN_DBG(FM_ALT | LINK, "FM_SCAN_OPCODE err, [tblsize=%d],[bufsize=%d]\n", (sizeof(fm_u16) * FM_SCANTBL_SIZE), (RX_BUF_SIZE - i));
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE);
|
||||
return 0;
|
||||
} else if ((length >= FM_CQI_BUF_SIZE) && ((RX_BUF_SIZE - i) >= FM_CQI_BUF_SIZE)) {
|
||||
fm_memcpy(link_event->result.cqi, &rx_buf[i], FM_CQI_BUF_SIZE);
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_CQI_DONE);
|
||||
} else {
|
||||
fm_memcpy(link_event->result.scan_result, &rx_buf[i], sizeof(fm_u16) * FM_SCANTBL_SIZE);
|
||||
FM_EVENT_SEND(link_event->ln_event, FLAG_SCAN_DONE);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case FSPI_READ_OPCODE:
|
||||
|
||||
if ((i + 1) < RX_BUF_SIZE) {
|
||||
link_event->result.fspi_rd = (rx_buf[i] + (rx_buf[i+1] << 8));
|
||||
}
|
||||
|
||||
FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
|
||||
break;
|
||||
|
||||
case RDS_RX_DATA_OPCODE:
|
||||
|
||||
//check if the rds data is long enough
|
||||
if ((RX_BUF_SIZE - i) < length) {
|
||||
WCN_DBG(FM_ALT | LINK, "RDS RX err, [rxlen=%d],[bufsize=%d]\n", (fm_s32)length, (RX_BUF_SIZE - i));
|
||||
FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
|
||||
break;
|
||||
}
|
||||
|
||||
//copy rds data to rds buf
|
||||
fm_memcpy(&link_event->result.rds_rx_result, &rx_buf[i], length);
|
||||
|
||||
/*Handle the RDS data that we get*/
|
||||
if (rds_parser) {
|
||||
rds_parser(&link_event->result.rds_rx_result, length);
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | LINK, "no method to parse RDS data\n");
|
||||
}
|
||||
|
||||
FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
|
||||
break;
|
||||
|
||||
default:
|
||||
FM_EVENT_SEND(link_event->ln_event, (1 << opcode));
|
||||
break;
|
||||
}
|
||||
|
||||
state = FM_TASK_RX_PARSER_PKT_TYPE;
|
||||
i += length;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_bool fm_wait_stc_done(fm_u32 sec)
|
||||
{
|
||||
return fm_true;
|
||||
}
|
||||
|
||||
fm_s32 fm_force_active_event(fm_u32 mask)
|
||||
{
|
||||
fm_u32 flag;
|
||||
|
||||
flag = FM_EVENT_GET(link_event->ln_event);
|
||||
WCN_DBG(FM_WAR | LINK, "before force active event, [flag=0x%08x]\n", flag);
|
||||
flag = FM_EVENT_SEND(link_event->ln_event, mask);
|
||||
WCN_DBG(FM_WAR | LINK, "after force active event, [flag=0x%08x]\n", flag);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern fm_s32 fm_print_cmd_fifo(void)
|
||||
{
|
||||
#ifdef FM_TRACE_ENABLE
|
||||
struct fm_trace_t trace;
|
||||
fm_s32 i = 0;
|
||||
|
||||
while (fm_false == FM_TRACE_EMPTY(cmd_fifo)) {
|
||||
fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
|
||||
FM_TRACE_OUT(cmd_fifo, &trace);
|
||||
WCN_DBG(FM_ALT | LINK, "trace, type %d, op %d, len %d, tid %d, time %d\n", trace.type, trace.opcode, trace.len, trace.tid, jiffies_to_msecs(abs(trace.time)));
|
||||
i = 0;
|
||||
while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE-8))) {
|
||||
WCN_DBG(FM_ALT | LINK, "trace, %02x %02x %02x %02x %02x %02x %02x %02x\n", \
|
||||
trace.pkt[i], trace.pkt[i+1], trace.pkt[i+2], trace.pkt[i+3], trace.pkt[i+4], trace.pkt[i+5], trace.pkt[i+6], trace.pkt[i+7]);
|
||||
i += 8;
|
||||
}
|
||||
WCN_DBG(FM_ALT | LINK, "trace\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern fm_s32 fm_print_evt_fifo(void)
|
||||
{
|
||||
#ifdef FM_TRACE_ENABLE
|
||||
struct fm_trace_t trace;
|
||||
fm_s32 i = 0;
|
||||
|
||||
while (fm_false == FM_TRACE_EMPTY(evt_fifo)) {
|
||||
fm_memset(trace.pkt, 0, FM_TRACE_PKT_SIZE);
|
||||
FM_TRACE_OUT(evt_fifo, &trace);
|
||||
WCN_DBG(FM_ALT | LINK, "%s: op %d, len %d, %d\n", evt_fifo->name, trace.opcode, trace.len, jiffies_to_msecs(abs(trace.time)));
|
||||
i = 0;
|
||||
while ((trace.len > 0) && (i < trace.len) && (i < (FM_TRACE_PKT_SIZE-8))) {
|
||||
WCN_DBG(FM_ALT | LINK, "%s: %02x %02x %02x %02x %02x %02x %02x %02x\n", \
|
||||
evt_fifo->name, trace.pkt[i], trace.pkt[i+1], trace.pkt[i+2], trace.pkt[i+3], trace.pkt[i+4], trace.pkt[i+5], trace.pkt[i+6], trace.pkt[i+7]);
|
||||
i += 8;
|
||||
}
|
||||
WCN_DBG(FM_ALT | LINK, "%s\n", evt_fifo->name);
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
fm_s32 fm_trace_in(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra)
|
||||
{
|
||||
FMR_ASSERT(new_tra);
|
||||
|
||||
if (thiz->len < thiz->size) {
|
||||
fm_memcpy(&(thiz->trace[thiz->in]), new_tra, sizeof(struct fm_trace_t));
|
||||
thiz->trace[thiz->in].time = jiffies;
|
||||
thiz->in = (thiz->in + 1) % thiz->size;
|
||||
thiz->len++;
|
||||
//WCN_DBG(FM_DBG | RDSC, "add a new tra[len=%d]\n", thiz->len);
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | RDSC, "tra buf is full\n");
|
||||
return -FM_ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_trace_out(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra)
|
||||
{
|
||||
if (thiz->len > 0) {
|
||||
if (dst_tra) {
|
||||
fm_memcpy(dst_tra, &(thiz->trace[thiz->out]), sizeof(struct fm_trace_t));
|
||||
fm_memset(&(thiz->trace[thiz->out]), 0, sizeof(struct fm_trace_t));
|
||||
}
|
||||
thiz->out = (thiz->out + 1) % thiz->size;
|
||||
thiz->len--;
|
||||
//WCN_DBG(FM_DBG | RDSC, "del a tra[len=%d]\n", thiz->len);
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | RDSC, "tra buf is empty\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_bool fm_trace_is_full(struct fm_trace_fifo_t *thiz)
|
||||
{
|
||||
return (thiz->len == thiz->size) ? fm_true : fm_false;
|
||||
}
|
||||
|
||||
fm_bool fm_trace_is_empty(struct fm_trace_fifo_t *thiz)
|
||||
{
|
||||
return (thiz->len == 0) ? fm_true : fm_false;
|
||||
}
|
||||
|
||||
|
||||
struct fm_trace_fifo_t* fm_trace_fifo_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_trace_fifo_t *tmp;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_trace_fifo_t)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_trace_fifo) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fm_memcpy(tmp->name, name, 20);
|
||||
tmp->size = FM_TRACE_FIFO_SIZE;
|
||||
tmp->in = 0;
|
||||
tmp->out = 0;
|
||||
tmp->len = 0;
|
||||
tmp->trace_in = fm_trace_in;
|
||||
tmp->trace_out = fm_trace_out;
|
||||
tmp->is_full = fm_trace_is_full;
|
||||
tmp->is_empty = fm_trace_is_empty;
|
||||
|
||||
WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->name);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo)
|
||||
{
|
||||
if (fifo) {
|
||||
WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->name);
|
||||
fm_free(fifo);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,146 +0,0 @@
|
||||
/* fm_patch.c
|
||||
*
|
||||
* (C) Copyright 2011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver -- patch functions
|
||||
*
|
||||
* 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/fs.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
|
||||
/*
|
||||
* fm_file_exist - test file
|
||||
* @filename - source file name
|
||||
* If exsit, return 0, else error code
|
||||
*/
|
||||
fm_s32 fm_file_exist(const fm_s8 *filename)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
mm_segment_t old_fs;
|
||||
struct file *fp = NULL;
|
||||
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
fp = filp_open(filename, O_RDONLY, 0);
|
||||
|
||||
if (IS_ERR(fp)) {
|
||||
WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
|
||||
set_fs(old_fs);
|
||||
return -FM_EPATCH;
|
||||
} else {
|
||||
WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
|
||||
}
|
||||
|
||||
if (fp) {
|
||||
filp_close(fp, NULL);
|
||||
}
|
||||
|
||||
set_fs(old_fs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* fm_file_read - read FM DSP patch/coeff/hwcoeff/rom binary file
|
||||
* @filename - source file name
|
||||
* @dst - target buffer
|
||||
* @len - desired read length
|
||||
* @position - the read position
|
||||
* If success, return read length in bytes, else error code
|
||||
*/
|
||||
fm_s32 fm_file_read(const fm_s8 *filename, fm_u8* dst, fm_s32 len, fm_s32 position)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
loff_t pos = position;
|
||||
mm_segment_t old_fs;
|
||||
struct file *fp = NULL;
|
||||
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
fp = filp_open(filename, O_RDONLY, 0);
|
||||
|
||||
if (IS_ERR(fp)) {
|
||||
WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
|
||||
set_fs(old_fs);
|
||||
return -FM_EPATCH;
|
||||
} else {
|
||||
WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
|
||||
}
|
||||
|
||||
ret = vfs_read(fp, (char __user *)dst, len, &pos);
|
||||
|
||||
if (ret < 0) {
|
||||
WCN_DBG(FM_ERR | CHIP, "read \"%s\" failed\n", filename);
|
||||
} else if (ret < len) {
|
||||
WCN_DBG(FM_NTC | CHIP, "read \"%s\" part data\n", filename);
|
||||
} else {
|
||||
WCN_DBG(FM_NTC | CHIP, "read \"%s\" full data\n", filename);
|
||||
}
|
||||
|
||||
if (fp) {
|
||||
filp_close(fp, NULL);
|
||||
}
|
||||
|
||||
set_fs(old_fs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_file_write(const fm_s8 *filename, fm_u8* dst, fm_s32 len, fm_s32 *ppos)
|
||||
{
|
||||
fm_s32 ret = 0;
|
||||
loff_t pos = *ppos;
|
||||
mm_segment_t old_fs;
|
||||
struct file *fp = NULL;
|
||||
|
||||
old_fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
fp = filp_open(filename, O_CREAT | O_RDWR, 0);
|
||||
|
||||
if (IS_ERR(fp)) {
|
||||
WCN_DBG(FM_ERR | CHIP, "open \"%s\" failed\n", filename);
|
||||
set_fs(old_fs);
|
||||
return -FM_EPATCH;
|
||||
} else {
|
||||
WCN_DBG(FM_NTC | CHIP, "open \"%s\" ok\n", filename);
|
||||
}
|
||||
|
||||
WCN_DBG(FM_NTC | CHIP, "\"%s\" old pos %d\n", filename, (int)pos);
|
||||
ret = vfs_write(fp, (char __user *)dst, len, &pos);
|
||||
WCN_DBG(FM_NTC | CHIP, "\"%s\" new pos %d\n", filename, (int)pos);
|
||||
*ppos = pos;
|
||||
if (ret < 0) {
|
||||
WCN_DBG(FM_ERR | CHIP, "write \"%s\" failed\n", filename);
|
||||
} else if (ret < len) {
|
||||
WCN_DBG(FM_NTC | CHIP, "write \"%s\" data\n", filename);
|
||||
}
|
||||
|
||||
if (fp) {
|
||||
filp_close(fp, NULL);
|
||||
}
|
||||
|
||||
set_fs(old_fs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,685 +0,0 @@
|
||||
/* fm_event.c
|
||||
*
|
||||
* (C) Copyright 2011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver -- a common event
|
||||
*
|
||||
* 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/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/wait.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_stdlib.h"
|
||||
#include "fm_utils.h"
|
||||
|
||||
static fm_u32 fm_event_send(struct fm_flag_event* thiz, fm_u32 mask)
|
||||
{
|
||||
thiz->flag |= mask;
|
||||
//WCN_DBG(FM_DBG|MAIN, "%s set 0x%08x\n", thiz->name, thiz->flag);
|
||||
wake_up((wait_queue_head_t*)(thiz->priv));
|
||||
|
||||
return thiz->flag;
|
||||
}
|
||||
|
||||
static fm_s32 fm_event_wait(struct fm_flag_event* thiz, fm_u32 mask)
|
||||
{
|
||||
return wait_event_interruptible(*(wait_queue_head_t*)(thiz->priv), ((thiz->flag & mask) == mask));
|
||||
}
|
||||
|
||||
/**
|
||||
* fm_event_check - sleep until a condition gets true or a timeout elapses
|
||||
* @thiz: the pointer of current object
|
||||
* @mask: bitmap in fm_u32
|
||||
* @timeout: timeout, in jiffies
|
||||
*
|
||||
* fm_event_set() has to be called after changing any variable that could
|
||||
* change the result of the wait condition.
|
||||
*
|
||||
* The function returns 0 if the @timeout elapsed, and the remaining
|
||||
* jiffies if the condition evaluated to true before the timeout elapsed.
|
||||
*/
|
||||
long fm_event_wait_timeout(struct fm_flag_event* thiz, fm_u32 mask, long timeout)
|
||||
{
|
||||
return wait_event_timeout(*((wait_queue_head_t*)(thiz->priv)), ((thiz->flag & mask) == mask), timeout*HZ);
|
||||
}
|
||||
|
||||
static fm_u32 fm_event_clr(struct fm_flag_event* thiz, fm_u32 mask)
|
||||
{
|
||||
thiz->flag &= ~mask;
|
||||
//WCN_DBG(FM_DBG|MAIN, "%s clr 0x%08x\n", thiz->name, thiz->flag);
|
||||
return thiz->flag;
|
||||
}
|
||||
|
||||
static fm_u32 fm_event_get(struct fm_flag_event* thiz)
|
||||
{
|
||||
return thiz->flag;
|
||||
|
||||
}
|
||||
|
||||
static fm_u32 fm_event_rst(struct fm_flag_event* thiz)
|
||||
{
|
||||
return thiz->flag = 0;
|
||||
}
|
||||
|
||||
struct fm_flag_event* fm_flag_event_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_flag_event *tmp;
|
||||
wait_queue_head_t *wq;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_flag_event)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_event) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(wq = fm_zalloc(sizeof(wait_queue_head_t)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(wait_queue_head_t) -ENOMEM\n");
|
||||
fm_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fm_memcpy(tmp->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
tmp->priv = wq;
|
||||
init_waitqueue_head(wq);
|
||||
tmp->ref = 0;
|
||||
|
||||
tmp->send = fm_event_send;
|
||||
tmp->wait = fm_event_wait;
|
||||
tmp->wait_timeout = fm_event_wait_timeout;
|
||||
tmp->clr = fm_event_clr;
|
||||
tmp->get = fm_event_get;
|
||||
tmp->rst = fm_event_rst;
|
||||
|
||||
tmp->rst(tmp); //set flag to 0x00000000
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
fm_s32 fm_flag_event_get(struct fm_flag_event *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_flag_event_put(struct fm_flag_event *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
fm_free(thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
//fm lock methods
|
||||
static fm_s32 fm_lock_try(struct fm_lock *thiz,fm_s32 retryCnt)
|
||||
{
|
||||
fm_s32 retry_cnt = 0;
|
||||
struct semaphore *sem;
|
||||
struct task_struct *task = current;
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(thiz->priv);
|
||||
|
||||
while(down_trylock((struct semaphore*)thiz->priv))
|
||||
{
|
||||
WCN_DBG(FM_WAR | MAIN, "down_trylock failed\n");
|
||||
if(++retry_cnt < retryCnt)
|
||||
{
|
||||
WCN_DBG(FM_WAR | MAIN,"[retryCnt=%d]\n", retry_cnt);
|
||||
msleep_interruptible(50);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
WCN_DBG(FM_CRT | MAIN,"down_trylock retry failed\n");
|
||||
return -FM_ELOCK;
|
||||
}
|
||||
}
|
||||
|
||||
sem = (struct semaphore*)thiz->priv;
|
||||
WCN_DBG(FM_NTC | MAIN, "%s --->trylock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count, task->pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//fm try lock methods
|
||||
static fm_s32 fm_lock_lock(struct fm_lock *thiz)
|
||||
{
|
||||
struct semaphore *sem;
|
||||
struct task_struct *task = current;
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(thiz->priv);
|
||||
|
||||
if (down_interruptible((struct semaphore*)thiz->priv)) {
|
||||
WCN_DBG(FM_CRT | MAIN, "get mutex failed\n");
|
||||
return -FM_ELOCK;
|
||||
}
|
||||
|
||||
sem = (struct semaphore*)thiz->priv;
|
||||
WCN_DBG(FM_NTC | MAIN, "%s --->lock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count, task->pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_lock_unlock(struct fm_lock *thiz)
|
||||
{
|
||||
struct semaphore *sem;
|
||||
struct task_struct *task = current;
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(thiz->priv);
|
||||
sem = (struct semaphore*)thiz->priv;
|
||||
WCN_DBG(FM_NTC | MAIN, "%s <---unlock, cnt=%d, pid=%d\n", thiz->name, (int)sem->count + 1, task->pid);
|
||||
up((struct semaphore*)thiz->priv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fm_lock* fm_lock_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_lock *tmp;
|
||||
struct semaphore *mutex;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(mutex = fm_zalloc(sizeof(struct semaphore)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct semaphore) -ENOMEM\n");
|
||||
fm_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tmp->priv = mutex;
|
||||
sema_init(mutex, 1);
|
||||
tmp->ref = 0;
|
||||
fm_memcpy(tmp->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
|
||||
tmp->lock = fm_lock_lock;
|
||||
tmp->trylock = fm_lock_try;
|
||||
tmp->unlock = fm_lock_unlock;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
fm_s32 fm_lock_get(struct fm_lock *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_lock_put(struct fm_lock *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
fm_free(thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
//fm lock methods
|
||||
static fm_s32 fm_spin_lock_lock(struct fm_lock *thiz)
|
||||
{
|
||||
struct task_struct *task = current;
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(thiz->priv);
|
||||
|
||||
spin_lock_bh((spinlock_t *)thiz->priv);
|
||||
|
||||
WCN_DBG(FM_NTC | MAIN, "%s --->lock pid=%d\n", thiz->name, task->pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_spin_lock_unlock(struct fm_lock *thiz)
|
||||
{
|
||||
struct task_struct *task = current;
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(thiz->priv);
|
||||
|
||||
WCN_DBG(FM_NTC | MAIN, "%s <---unlock, pid=%d\n", thiz->name, task->pid);
|
||||
spin_unlock_bh((spinlock_t *)thiz->priv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fm_lock* fm_spin_lock_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_lock *tmp;
|
||||
spinlock_t *spin_lock;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_lock)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_lock) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(spin_lock = fm_zalloc(sizeof(spinlock_t)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(spinlock_t) -ENOMEM\n");
|
||||
fm_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tmp->priv = spin_lock;
|
||||
spin_lock_init(spin_lock);
|
||||
tmp->ref = 0;
|
||||
fm_memcpy(tmp->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
|
||||
tmp->lock = fm_spin_lock_lock;
|
||||
tmp->unlock = fm_spin_lock_unlock;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_spin_lock_get(struct fm_lock *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_spin_lock_put(struct fm_lock *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
fm_free(thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* fm timer
|
||||
*
|
||||
*/
|
||||
static fm_s32 fm_timer_init(struct fm_timer *thiz, void (*timeout)(unsigned long data), unsigned long data, signed long time, fm_s32 flag)
|
||||
{
|
||||
struct timer_list *timerlist = (struct timer_list*)thiz->priv;
|
||||
|
||||
thiz->flag = flag;
|
||||
thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED;
|
||||
thiz->timeout_func = timeout;
|
||||
thiz->data = data;
|
||||
thiz->timeout_ms = time;
|
||||
|
||||
timerlist->expires = jiffies + (thiz->timeout_ms) / (1000 / HZ);
|
||||
timerlist->function = thiz->timeout_func;
|
||||
timerlist->data = (unsigned long)thiz->data;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_timer_start(struct fm_timer *thiz)
|
||||
{
|
||||
struct timer_list *timerlist = (struct timer_list*)thiz->priv;
|
||||
|
||||
thiz->flag |= FM_TIMER_FLAG_ACTIVATED;
|
||||
mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_timer_update(struct fm_timer *thiz)
|
||||
{
|
||||
struct timer_list *timerlist = (struct timer_list*)thiz->priv;
|
||||
|
||||
if (thiz->flag & FM_TIMER_FLAG_ACTIVATED) {
|
||||
mod_timer(timerlist, jiffies + (thiz->timeout_ms) / (1000 / HZ));
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static fm_s32 fm_timer_stop(struct fm_timer *thiz)
|
||||
{
|
||||
struct timer_list *timerlist = (struct timer_list*)thiz->priv;
|
||||
|
||||
thiz->flag &= ~FM_TIMER_FLAG_ACTIVATED;
|
||||
del_timer(timerlist);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static fm_s32 fm_timer_control(struct fm_timer *thiz, enum fm_timer_ctrl cmd, void* arg)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fm_timer* fm_timer_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_timer *tmp;
|
||||
struct timer_list *timerlist;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_timer)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_timer) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(timerlist = fm_zalloc(sizeof(struct timer_list)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct timer_list) -ENOMEM\n");
|
||||
fm_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
init_timer(timerlist);
|
||||
|
||||
fm_memcpy(tmp->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
tmp->priv = timerlist;
|
||||
tmp->ref = 0;
|
||||
tmp->init = fm_timer_init;
|
||||
tmp->start = fm_timer_start;
|
||||
tmp->stop = fm_timer_stop;
|
||||
tmp->update = fm_timer_update;
|
||||
tmp->control = fm_timer_control;
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
fm_s32 fm_timer_get(struct fm_timer *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_timer_put(struct fm_timer *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
fm_free(thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FM work thread mechanism
|
||||
*/
|
||||
static fm_s32 fm_work_init(struct fm_work *thiz, void (*work_func)(unsigned long data), unsigned long data)
|
||||
{
|
||||
struct work_struct *sys_work = (struct work_struct*)thiz->priv;
|
||||
work_func_t func;
|
||||
|
||||
thiz->work_func = work_func;
|
||||
thiz->data = data;
|
||||
func = (work_func_t)thiz->work_func;
|
||||
|
||||
INIT_WORK(sys_work, func);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
struct fm_work* fm_work_create(const fm_s8 *name)
|
||||
{
|
||||
struct fm_work *my_work;
|
||||
struct work_struct *sys_work;
|
||||
|
||||
if (!(my_work = fm_zalloc(sizeof(struct fm_work)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_work) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(sys_work = fm_zalloc(sizeof(struct work_struct)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(struct work_struct) -ENOMEM\n");
|
||||
fm_free(my_work);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fm_memcpy(my_work->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
my_work->priv = sys_work;
|
||||
my_work->init = fm_work_init;
|
||||
|
||||
return my_work;
|
||||
}
|
||||
|
||||
fm_s32 fm_work_get(struct fm_work *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_work_put(struct fm_work *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
fm_free(thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static fm_s32 fm_workthread_add_work(struct fm_workthread *thiz, struct fm_work *work)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
FMR_ASSERT(work);
|
||||
|
||||
queue_work((struct workqueue_struct*)thiz->priv, (struct work_struct*)work->priv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fm_workthread* fm_workthread_create(const fm_s8* name)
|
||||
{
|
||||
struct fm_workthread *my_thread;
|
||||
struct workqueue_struct *sys_thread;
|
||||
|
||||
if (!(my_thread = fm_zalloc(sizeof(struct fm_workthread)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_workthread) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sys_thread = create_singlethread_workqueue(name);
|
||||
|
||||
fm_memcpy(my_thread->name, name, (strlen(name)>FM_NAME_MAX)?(FM_NAME_MAX):(strlen(name)));
|
||||
my_thread->priv = sys_thread;
|
||||
my_thread->add_work = fm_workthread_add_work;
|
||||
|
||||
return my_thread;
|
||||
}
|
||||
|
||||
fm_s32 fm_workthread_get(struct fm_workthread *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_workthread_put(struct fm_workthread *thiz)
|
||||
{
|
||||
FMR_ASSERT(thiz);
|
||||
thiz->ref--;
|
||||
|
||||
if (thiz->ref == 0) {
|
||||
destroy_workqueue((struct workqueue_struct*)thiz->priv);
|
||||
fm_free(thiz);
|
||||
return 0;
|
||||
} else if (thiz->ref > 0) {
|
||||
return -FM_EINUSE;
|
||||
} else {
|
||||
return -FM_EPARA;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_fifo_in(struct fm_fifo *thiz, void *item)
|
||||
{
|
||||
FMR_ASSERT(item);
|
||||
|
||||
if (thiz->len < thiz->size) {
|
||||
fm_memcpy((thiz->obj.priv + (thiz->item_size * thiz->in)), item, thiz->item_size);
|
||||
thiz->in = (thiz->in + 1) % thiz->size;
|
||||
thiz->len++;
|
||||
//WCN_DBG(FM_DBG | MAIN, "add a new item[len=%d]\n", thiz->len);
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | MAIN, "%s fifo is full\n", thiz->obj.name);
|
||||
return -FM_ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_s32 fm_fifo_out(struct fm_fifo *thiz, void *item)
|
||||
{
|
||||
if (thiz->len > 0) {
|
||||
if (item) {
|
||||
fm_memcpy(item, (thiz->obj.priv + (thiz->item_size * thiz->out)), thiz->item_size);
|
||||
fm_memset((thiz->obj.priv + (thiz->item_size * thiz->out)), 0, thiz->item_size);
|
||||
}
|
||||
thiz->out = (thiz->out + 1) % thiz->size;
|
||||
thiz->len--;
|
||||
//WCN_DBG(FM_DBG | MAIN, "del an item[len=%d]\n", thiz->len);
|
||||
} else {
|
||||
WCN_DBG(FM_WAR | MAIN, "%s fifo is empty\n", thiz->obj.name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
fm_bool fm_fifo_is_full(struct fm_fifo *thiz)
|
||||
{
|
||||
return (thiz->len == thiz->size) ? fm_true : fm_false;
|
||||
}
|
||||
|
||||
fm_bool fm_fifo_is_empty(struct fm_fifo *thiz)
|
||||
{
|
||||
return (thiz->len == 0) ? fm_true : fm_false;
|
||||
}
|
||||
|
||||
fm_s32 fm_fifo_get_total_len(struct fm_fifo *thiz)
|
||||
{
|
||||
return thiz->size;
|
||||
}
|
||||
|
||||
fm_s32 fm_fifo_get_valid_len(struct fm_fifo *thiz)
|
||||
{
|
||||
return thiz->len;
|
||||
}
|
||||
|
||||
fm_s32 fm_fifo_reset(struct fm_fifo *thiz)
|
||||
{
|
||||
fm_memset(thiz->obj.priv, 0, thiz->item_size * thiz->size);
|
||||
thiz->in = 0;
|
||||
thiz->out = 0;
|
||||
thiz->len = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct fm_fifo* fm_fifo_init(struct fm_fifo* fifo, void *buf, const fm_s8 *name, fm_s32 item_size, fm_s32 item_num)
|
||||
{
|
||||
fm_memcpy(fifo->obj.name, name, 20);
|
||||
fifo->size = item_num;
|
||||
fifo->in = 0;
|
||||
fifo->out = 0;
|
||||
fifo->len = 0;
|
||||
fifo->item_size = item_size;
|
||||
fifo->obj.priv = buf;
|
||||
|
||||
fifo->input = fm_fifo_in;
|
||||
fifo->output = fm_fifo_out;
|
||||
fifo->is_full = fm_fifo_is_full;
|
||||
fifo->is_empty = fm_fifo_is_empty;
|
||||
fifo->get_total_len = fm_fifo_get_total_len;
|
||||
fifo->get_valid_len = fm_fifo_get_valid_len;
|
||||
fifo->reset = fm_fifo_reset;
|
||||
|
||||
WCN_DBG(FM_NTC | LINK, "%s inited\n", fifo->obj.name);
|
||||
|
||||
return fifo;
|
||||
}
|
||||
|
||||
struct fm_fifo* fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num)
|
||||
{
|
||||
struct fm_fifo *tmp;
|
||||
void *buf;
|
||||
|
||||
if (!(tmp = fm_zalloc(sizeof(struct fm_fifo)))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!(buf = fm_zalloc(item_size * item_num))) {
|
||||
WCN_DBG(FM_ALT | MAIN, "fm_zalloc(fm_fifo) -ENOMEM\n");
|
||||
fm_free(tmp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tmp = fm_fifo_init(tmp, buf, name, item_size, item_num);
|
||||
|
||||
WCN_DBG(FM_NTC | LINK, "%s created\n", tmp->obj.name);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
fm_s32 fm_fifo_release(struct fm_fifo *fifo)
|
||||
{
|
||||
if (fifo) {
|
||||
WCN_DBG(FM_NTC | LINK, "%s released\n", fifo->obj.name);
|
||||
if (fifo->obj.priv) {
|
||||
fm_free(fifo->obj.priv);
|
||||
}
|
||||
fm_free(fifo);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,133 +0,0 @@
|
||||
/* alps/ALPS_SW/TRUNK/MAIN/alps/kernel/arch/arm/mach-mt6516/include/mach/fm.h
|
||||
*
|
||||
* (C) Copyright 2009
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* William Chung <William.Chung@MediaTek.com>
|
||||
*
|
||||
* MT6516 AR10x0 FM Radio Driver
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __FM_CUST_CFG_H__
|
||||
#define __FM_CUST_CFG_H__
|
||||
|
||||
//scan sort algorithm
|
||||
enum {
|
||||
FM_SCAN_SORT_NON = 0,
|
||||
FM_SCAN_SORT_UP,
|
||||
FM_SCAN_SORT_DOWN,
|
||||
FM_SCAN_SORT_MAX
|
||||
};
|
||||
//***********************************FM config for customer ***********************************
|
||||
//RX
|
||||
#define FMR_RSSI_TH_LONG_MT6620 0x0301 //FM radio long antenna RSSI threshold(11.375dBuV)
|
||||
#define FMR_RSSI_TH_SHORT_MT6620 0x02E0 //FM radio short antenna RSSI threshold(-1dBuV)
|
||||
#define FMR_CQI_TH_MT6620 0x00E9 //FM radio Channel quality indicator threshold(0x0000~0x00FF)
|
||||
//***********************************FM config for engineer ***********************************
|
||||
//RX
|
||||
#define FMR_MR_TH_MT6620 0x01BD //FM radio MR threshold
|
||||
#if 0
|
||||
//*****************************************************************************************
|
||||
//***********************************FM config for customer ***********************************
|
||||
//*****************************************************************************************
|
||||
#define FMR_SEEK_SPACE 1 //FM radio seek space,1:100KHZ; 2:200KHZ
|
||||
#define FMR_SCAN_CH_SIZE 40 //FM radio scan max channel size
|
||||
#define FMR_BAND 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
|
||||
#define FM_SCAN_SORT_SELECT FM_SCAN_SORT_NON
|
||||
#define FM_FAKE_CH_NUM 1
|
||||
#define FM_FAKE_CH_RSSI 40
|
||||
#define FM_FAKE_CH_1 1075
|
||||
#define FM_FAKE_CH_2 0
|
||||
#define FM_FAKE_CH_3 0
|
||||
#define FM_FAKE_CH_4 0
|
||||
#define FM_FAKE_CH_5 0
|
||||
|
||||
//TX
|
||||
#define FMTX_PWR_LEVEL_MAX 120
|
||||
|
||||
//*****************************************************************************************
|
||||
#define ADDR_SCAN_TH 0xE0 //scan thrshold register
|
||||
#define ADDR_CQI_TH 0xE1 //scan CQI register
|
||||
|
||||
//TX
|
||||
#define FMTX_SCAN_HOLE_LOW 923 //92.3MHz~95.4MHz should not show to user
|
||||
#define FMTX_SCAN_HOLE_HIGH 954 //92.3MHz~95.4MHz should not show to user
|
||||
//*****************************************************************************************
|
||||
|
||||
// errno
|
||||
#define FM_SUCCESS 0
|
||||
#define FM_FAILED 1
|
||||
#define FM_EPARM 2
|
||||
#define FM_BADSTATUS 3
|
||||
#define FM_TUNE_FAILED 4
|
||||
#define FM_SEEK_FAILED 5
|
||||
#define FM_BUSY 6
|
||||
#define FM_SCAN_FAILED 7
|
||||
|
||||
//max scan chl num
|
||||
#define FM_MAX_CHL_SIZE FMR_SCAN_CH_SIZE
|
||||
// auto HiLo
|
||||
#define FM_AUTO_HILO_OFF 0
|
||||
#define FM_AUTO_HILO_ON 1
|
||||
|
||||
#define FM_CHIP_AR1000 0x1000
|
||||
#define FM_CHIP_MT5192 0x91
|
||||
#define FM_CHIP_MT5193 0x92
|
||||
#define FM_CHIP_MT6616 0x6616
|
||||
#define FM_CHIP_MT6626 0x6626
|
||||
#define FM_CHIP_MT6628 0x6628
|
||||
#define FM_CHIP_MT6620 0x6620
|
||||
#define FM_CHIP_UNSUPPORTED 0xffff
|
||||
|
||||
// seek threshold
|
||||
#define FM_SEEKTH_LEVEL_DEFAULT 4
|
||||
#endif
|
||||
//RX
|
||||
#define FM_RX_RSSI_TH_LONG_MT6620 -296 //FM radio long antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_RSSI_TH_SHORT_MT6620 -296 //FM radio short antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_DESENSE_RSSI_MT6620 -245
|
||||
#define FM_RX_PAMD_TH_MT6620 -12
|
||||
#define FM_RX_MR_TH_MT6620 -67
|
||||
#define FM_RX_ATDC_TH_MT6620 219
|
||||
#define FM_RX_PRX_TH_MT6620 64
|
||||
#define FM_RX_SMG_TH_MT6620 6 //FM soft-mute gain threshold
|
||||
#define FM_RX_DEEMPHASIS_MT6620 0 //0-50us, China Mainland; 1-75us China Taiwan
|
||||
#define FM_RX_OSC_FREQ_MT6620 0 //0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz
|
||||
#if 0
|
||||
#define FM_RX_RSSI_TH_LONG_MT6620 0xF2D8 //FM radio long antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_RSSI_TH_SHORT_MT6620 0xF2D8 //FM radio short antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_CQI_TH_MT6620 0x00E9 //FM radio Channel quality indicator threshold(0x0000~0x00FF)
|
||||
#define FM_RX_MR_TH_MT6620 0x01BD //FM radio MR threshold
|
||||
#define FM_RX_SMG_TH_MT6620 0x4025 //FM soft-mute gain threshold
|
||||
#define FM_RX_SEEK_SPACE_MT6620 1 //FM radio seek space,1:100KHZ; 2:200KHZ
|
||||
#define FM_RX_SCAN_CH_SIZE_MT6620 40 //FM radio scan max channel size
|
||||
#define FM_RX_BAND_MT6620 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
|
||||
|
||||
#define FM_RX_SCAN_SORT_SELECT_MT6620 FM_SCAN_SORT_NON
|
||||
#define FM_RX_FAKE_CH_NUM_MT6620 1
|
||||
#define FM_RX_FAKE_CH_RSSI_MT6620 40
|
||||
#define FM_RX_FAKE_CH_1_MT6620 1075
|
||||
#define FM_RX_FAKE_CH_2_MT6620 0
|
||||
#define FM_RX_FAKE_CH_3_MT6620 0
|
||||
#define FM_RX_FAKE_CH_4_MT6620 0
|
||||
#define FM_RX_FAKE_CH_5_MT6620 0
|
||||
#endif
|
||||
//TX
|
||||
#define FM_TX_PWR_LEVEL_MAX_MT6620 120
|
||||
#define FM_TX_SCAN_HOLE_LOW_MT6620 923 //92.3MHz~95.4MHz should not show to user
|
||||
#define FM_TX_SCAN_HOLE_HIGH_MT6620 954 //92.3MHz~95.4MHz should not show to user
|
||||
|
||||
#endif // __FM_CUST_CFG_H__
|
||||
@@ -1,105 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* (C) Copyright 20011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __FM_CUST_CFG_H__
|
||||
#define __FM_CUST_CFG_H__
|
||||
|
||||
//scan sort algorithm
|
||||
enum{
|
||||
FM_SCAN_SORT_NON = 0,
|
||||
FM_SCAN_SORT_UP,
|
||||
FM_SCAN_SORT_DOWN,
|
||||
FM_SCAN_SORT_MAX
|
||||
};
|
||||
|
||||
//*****************************************************************************************
|
||||
//***********************************FM config for customer: start******************************
|
||||
//*****************************************************************************************
|
||||
//RX
|
||||
#define FM_RX_RSSI_TH_LONG 0xFF01 //FM radio long antenna RSSI threshold(11.375dBuV)
|
||||
#define FM_RX_RSSI_TH_SHORT 0xFEE0 //FM radio short antenna RSSI threshold(-1dBuV)
|
||||
#define FM_RX_CQI_TH 0x00E9 //FM radio Channel quality indicator threshold(0x0000~0x00FF)
|
||||
#define FM_RX_MR_TH 0x01BD //FM radio MR threshold
|
||||
#define FM_RX_SMG_TH 0x4025 //FM soft-mute gain threshold
|
||||
#define FM_RX_SEEK_SPACE 1 //FM radio seek space,1:100KHZ; 2:200KHZ
|
||||
#define FM_RX_SCAN_CH_SIZE 40 //FM radio scan max channel size
|
||||
#define FM_RX_BAND 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
|
||||
#define FM_RX_BAND_FREQ_L 875 //FM radio special band low freq(Default 87.5MHz)
|
||||
#define FM_RX_BAND_FREQ_H 1080 //FM radio special band high freq(Default 108.0MHz)
|
||||
#define FM_RX_SCAN_SORT_SELECT FM_SCAN_SORT_NON
|
||||
#define FM_RX_FAKE_CH_NUM 1
|
||||
#define FM_RX_FAKE_CH_RSSI 40
|
||||
#define FM_RX_FAKE_CH_1 1075
|
||||
#define FM_RX_FAKE_CH_2 0
|
||||
#define FM_RX_FAKE_CH_3 0
|
||||
#define FM_RX_FAKE_CH_4 0
|
||||
#define FM_RX_FAKE_CH_5 0
|
||||
#define FM_RX_DEEMPHASIS 0 //0-50us, China Mainland; 1-75us China Taiwan
|
||||
#define FM_RX_OSC_FREQ 0 //0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz
|
||||
|
||||
//TX
|
||||
#define FM_TX_PWR_LEVEL_MAX 120
|
||||
#define FM_TX_SCAN_HOLE_LOW 923 //92.3MHz~95.4MHz should not show to user
|
||||
#define FM_TX_SCAN_HOLE_HIGH 954 //92.3MHz~95.4MHz should not show to user
|
||||
|
||||
|
||||
//*****************************************************************************************
|
||||
//***********************************FM config for customer:end *******************************
|
||||
//*****************************************************************************************
|
||||
// band
|
||||
#define FM_BAND_UNKNOWN 0
|
||||
#define FM_BAND_UE 1 // US/Europe band 87.5MHz ~ 108MHz (DEFAULT)
|
||||
#define FM_BAND_JAPAN 2 // Japan band 76MHz ~ 90MHz
|
||||
#define FM_BAND_JAPANW 3 // Japan wideband 76MHZ ~ 108MHz
|
||||
#define FM_BAND_SPECIAL 4 // special band between 76MHZ and 108MHz
|
||||
#define FM_BAND_DEFAULT FM_BAND_UE
|
||||
#define FM_FREQ_MIN FM_RX_BAND_FREQ_L
|
||||
#define FM_FREQ_MAX FM_RX_BAND_FREQ_H
|
||||
#define FM_RAIDO_BAND FM_BAND_UE
|
||||
// space
|
||||
#define FM_SPACE_UNKNOWN 0
|
||||
#define FM_SPACE_100K 1
|
||||
#define FM_SPACE_200K 2
|
||||
#define FM_SPACE_DEFAULT FM_RX_SEEK_SPACE
|
||||
#define FM_SEEK_SPACE FM_RX_SEEK_SPACE
|
||||
//max scan chl num
|
||||
#define FM_MAX_CHL_SIZE FM_RX_SCAN_CH_SIZE
|
||||
// auto HiLo
|
||||
#define FM_AUTO_HILO_OFF 0
|
||||
#define FM_AUTO_HILO_ON 1
|
||||
// seek direction
|
||||
#define FM_SEEK_UP 0
|
||||
#define FM_SEEK_DOWN 1
|
||||
|
||||
#define FM_CHIP_AR1000 0x1000
|
||||
#define FM_CHIP_MT5192 0x91
|
||||
#define FM_CHIP_MT5193 0x92
|
||||
#define FM_CHIP_MT6616 0x6616
|
||||
#define FM_CHIP_MT6626 0x6626
|
||||
#define FM_CHIP_MT6628 0x6628
|
||||
#define FM_CHIP_MT6620 0x6620
|
||||
#define FM_CHIP_UNSUPPORTED 0xffff
|
||||
|
||||
// seek threshold
|
||||
#define FM_SEEKTH_LEVEL_DEFAULT 4
|
||||
#endif // __FM_CUST_CFG_H__
|
||||
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* (C) Copyright 20011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng Xia<Hongcheng.Xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __FM_CUST_CFG_H__
|
||||
#define __FM_CUST_CFG_H__
|
||||
|
||||
//scan sort algorithm
|
||||
enum{
|
||||
FM_SCAN_SORT_NON = 0,
|
||||
FM_SCAN_SORT_UP,
|
||||
FM_SCAN_SORT_DOWN,
|
||||
FM_SCAN_SORT_MAX
|
||||
};
|
||||
/*typedef struct {
|
||||
fm_s32 short_ana_rssi_th;
|
||||
fm_s32 long_ana_rssi_th;
|
||||
fm_s32 desene_rssi_th;
|
||||
fm_s32 pamd_th;
|
||||
fm_s32 mr_th;
|
||||
fm_s32 atdc_th;
|
||||
fm_u32 prx_th;
|
||||
fm_u32 atdev_th;
|
||||
fm_u16 smg_th;
|
||||
fm_u16 deemphasis;
|
||||
fm_u16 osc_freq;
|
||||
}mt6628_fm_rx_cust_cfg;
|
||||
|
||||
typedef struct{
|
||||
mt6628_fm_rx_cust_cfg rx_cfg;
|
||||
}mt6628_fm_cust_cfg;
|
||||
*/
|
||||
//*****************************************************************************************
|
||||
//***********************************FM config for customer: start******************************
|
||||
//*****************************************************************************************
|
||||
//RX
|
||||
#define FM_RX_RSSI_TH_LONG_MT6628 -296 //FM radio long antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_RSSI_TH_SHORT_MT6628 -296 //FM radio short antenna RSSI threshold(-4dBuV)
|
||||
#define FM_RX_DESENSE_RSSI_MT6628 -258
|
||||
#define FM_RX_PAMD_TH_MT6628 -12
|
||||
#define FM_RX_MR_TH_MT6628 -67
|
||||
#define FM_RX_ATDC_TH_MT6628 3496
|
||||
#define FM_RX_PRX_TH_MT6628 64
|
||||
#define FM_RX_SMG_TH_MT6628 16421 //FM soft-mute gain threshold
|
||||
#define FM_RX_DEEMPHASIS_MT6628 0 //0-50us, China Mainland; 1-75us China Taiwan
|
||||
#define FM_RX_OSC_FREQ_MT6628 0 //0-26MHz; 1-19MHz; 2-24MHz; 3-38.4MHz; 4-40MHz; 5-52MHz
|
||||
//#define FM_RX_SEEK_SPACE_MT6628 1 //FM radio seek space,1:100KHZ; 2:200KHZ
|
||||
//#define FM_RX_SCAN_CH_SIZE_MT6628 40 //FM radio scan max channel size
|
||||
//#define FM_RX_BAND_MT6628 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
|
||||
//#define FM_RX_SCAN_SORT_SELECT_MT6628 FM_SCAN_SORT_NON
|
||||
//#define FM_RX_FAKE_CH_NUM_MT6628 1
|
||||
//#define FM_RX_FAKE_CH_RSSI_MT6628 40
|
||||
//#define FM_RX_FAKE_CH_1_MT6628 1075
|
||||
//#define FM_RX_FAKE_CH_2_MT6628 0
|
||||
//#define FM_RX_FAKE_CH_3_MT6628 0
|
||||
//#define FM_RX_FAKE_CH_4_MT6628 0
|
||||
//#define FM_RX_FAKE_CH_5_MT6628 0
|
||||
|
||||
//TX
|
||||
//#define FM_TX_PWR_LEVEL_MAX_MT6628 120
|
||||
//#define FM_TX_SCAN_HOLE_LOW_MT6628 923 //92.3MHz~95.4MHz should not show to user
|
||||
//#define FM_TX_SCAN_HOLE_HIGH_MT6628 954 //92.3MHz~95.4MHz should not show to user
|
||||
|
||||
|
||||
//*****************************************************************************************
|
||||
//***********************************FM config for customer:end *******************************
|
||||
//*****************************************************************************************
|
||||
|
||||
//#define FM_SEEK_SPACE_MT6628 FM_RX_SEEK_SPACE_MT6628
|
||||
//max scan chl num
|
||||
//#define FM_MAX_CHL_SIZ_MT6628E FM_RX_SCAN_CH_SIZE_MT6628
|
||||
// auto HiLo
|
||||
#define FM_AUTO_HILO_OFF_MT6628 0
|
||||
#define FM_AUTO_HILO_ON_MT6628 1
|
||||
|
||||
|
||||
// seek threshold
|
||||
#define FM_SEEKTH_LEVEL_DEFAULT_MT6628 4
|
||||
|
||||
#endif // __FM_CUST_CFG_H__
|
||||
@@ -1,200 +0,0 @@
|
||||
/* fm_config.h
|
||||
*
|
||||
* (C) Copyright 2011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* FM Radio Driver
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef __FM_CONFIG_H__
|
||||
#define __FM_CONFIG_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_rds.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_stdlib.h"
|
||||
|
||||
// band
|
||||
#define FM_BAND_UNKNOWN 0
|
||||
#define FM_BAND_UE 1 // US/Europe band 87.5MHz ~ 108MHz (DEFAULT)
|
||||
#define FM_BAND_JAPAN 2 // Japan band 76MHz ~ 90MHz
|
||||
#define FM_BAND_JAPANW 3 // Japan wideband 76MHZ ~ 108MHz
|
||||
#define FM_BAND_SPECIAL 4 // special band between 76MHZ and 108MHz
|
||||
#define FM_BAND_DEFAULT FM_BAND_UE
|
||||
#define FM_RAIDO_BAND FM_BAND_UE
|
||||
#define FM_FREQ_MIN FM_RX_BAND_FREQ_L
|
||||
#define FM_FREQ_MAX FM_RX_BAND_FREQ_H
|
||||
|
||||
#ifdef MTK_FM_50KHZ_SUPPORT
|
||||
#define FM_UE_FREQ_MIN 8750
|
||||
#define FM_UE_FREQ_MAX 10800
|
||||
#define FM_JP_FREQ_MIN 7600
|
||||
#define FM_JP_FREQ_MAX 10800
|
||||
|
||||
#define FM_RX_BAND_FREQ_L 8750 //FM radio special band low freq(Default 87.5MHz)
|
||||
#define FM_RX_BAND_FREQ_H 10800 //FM radio special band high freq(Default 108.0MHz)
|
||||
//TX
|
||||
#define FM_TX_SCAN_HOLE_LOW 9230 //92.3MHz~95.4MHz should not show to user
|
||||
#define FM_TX_SCAN_HOLE_HIGH 9540 //92.3MHz~95.4MHz should not show to user
|
||||
|
||||
#else
|
||||
#define FM_UE_FREQ_MIN 875
|
||||
#define FM_UE_FREQ_MAX 1080
|
||||
#define FM_JP_FREQ_MIN 760
|
||||
#define FM_JP_FREQ_MAX 1080
|
||||
|
||||
#define FM_RX_BAND_FREQ_L 875 //FM radio special band low freq(Default 87.5MHz)
|
||||
#define FM_RX_BAND_FREQ_H 1080 //FM radio special band high freq(Default 108.0MHz)
|
||||
//TX
|
||||
#define FM_TX_SCAN_HOLE_LOW 923 //92.30MHz~95.40MHz should not show to user
|
||||
#define FM_TX_SCAN_HOLE_HIGH 954 //92.30MHz~95.40MHz should not show to user
|
||||
|
||||
#endif //MTK_FM_50KHZ_SUPPORT
|
||||
|
||||
// space
|
||||
#define FM_SPACE_UNKNOWN 0
|
||||
#define FM_SPACE_100K 1
|
||||
#define FM_SPACE_200K 2
|
||||
#define FM_SPACE_50K 5
|
||||
|
||||
#ifdef MTK_FM_50KHZ_SUPPORT
|
||||
#define FM_SPACE_DEFAULT FM_SPACE_50K
|
||||
#else
|
||||
#define FM_SPACE_DEFAULT FM_SPACE_100K
|
||||
#endif
|
||||
|
||||
#define FM_TX_SCAN_UP (0)
|
||||
#define FM_TX_SCAN_DOWN (1)
|
||||
#define FM_TX_SCAN_MAX 10
|
||||
#define FM_TX_SCAN_MIN 1
|
||||
|
||||
// seek direction
|
||||
#define FM_SEEK_UP 0
|
||||
#define FM_SEEK_DOWN 1
|
||||
|
||||
#define FM_CHIP_AR1000 0x1000
|
||||
#define FM_CHIP_MT5192 0x91
|
||||
#define FM_CHIP_MT5193 0x92
|
||||
#define FM_CHIP_MT6616 0x6616
|
||||
#define FM_CHIP_MT6626 0x6626
|
||||
#define FM_CHIP_MT6628 0x6628
|
||||
#define FM_CHIP_MT6620 0x6620
|
||||
#define FM_CHIP_UNSUPPORTED 0xffff
|
||||
|
||||
enum fm_cfg_parser_state {
|
||||
FM_CFG_STAT_NONE = 0,
|
||||
FM_CFG_STAT_GROUP,
|
||||
FM_CFG_STAT_KEY,
|
||||
FM_CFG_STAT_VALUE,
|
||||
FM_CFG_STAT_COMMENT
|
||||
};
|
||||
|
||||
typedef enum fm_cfg_parser_state fm_cfg_parser_state_t;
|
||||
|
||||
#define COMMENT_CHAR '#'
|
||||
#define DELIMIT_CHAR '='
|
||||
|
||||
#define isspace(a) ((a) == 0x20)
|
||||
|
||||
#define FAKE_CH_MAX 10
|
||||
#define FM_CUST_CFG_PATH "/etc/fm_cust.cfg"
|
||||
|
||||
struct fm_rx_cust_cfg {
|
||||
fm_s32 desene_rssi_th;
|
||||
fm_s32 pamd_th;
|
||||
fm_s32 mr_th;
|
||||
fm_s32 atdc_th;
|
||||
fm_s32 prx_th;
|
||||
fm_s32 atdev_th;
|
||||
fm_s32 short_ana_rssi_th;
|
||||
fm_s32 long_ana_rssi_th;
|
||||
fm_s32 cqi_th;
|
||||
// fm_u16 mr_th;
|
||||
fm_s32 smg_th;
|
||||
fm_s32 scan_ch_size;
|
||||
fm_s32 seek_space;
|
||||
fm_s32 band;
|
||||
fm_s32 band_freq_l;
|
||||
fm_s32 band_freq_h;
|
||||
fm_s32 scan_sort;
|
||||
fm_s32 fake_ch[FAKE_CH_MAX];
|
||||
fm_s32 fake_ch_num;
|
||||
fm_s32 fake_ch_rssi_th;
|
||||
fm_s32 deemphasis;
|
||||
fm_s32 osc_freq;
|
||||
};
|
||||
|
||||
struct fm_tx_cust_cfg {
|
||||
fm_s32 scan_hole_low;
|
||||
fm_s32 scan_hole_high;
|
||||
fm_s32 power_level;
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
struct fm_rx_cust_cfg rx_cfg;
|
||||
struct fm_tx_cust_cfg tx_cfg;
|
||||
}fm_cust_cfg;
|
||||
|
||||
enum fm_cust_cfg_op {
|
||||
FM_CFG_RX_RSSI_TH_LONG = 0,
|
||||
FM_CFG_RX_RSSI_TH_SHORT,
|
||||
FM_CFG_RX_CQI_TH,
|
||||
FM_CFG_RX_MR_TH,
|
||||
FM_CFG_RX_SMG_TH,
|
||||
FM_CFG_RX_SCAN_CH_SIZE,
|
||||
FM_CFG_RX_SEEK_SPACE,
|
||||
FM_CFG_RX_BAND,
|
||||
FM_CFG_RX_BAND_FREQ_L,
|
||||
FM_CFG_RX_BAND_FREQ_H,
|
||||
FM_CFG_RX_SCAN_SORT,
|
||||
FM_CFG_RX_FAKE_CH_NUM,
|
||||
FM_CFG_RX_FAKE_CH_RSSI,
|
||||
FM_CFG_RX_FAKE_CH,
|
||||
FM_CFG_RX_DEEMPHASIS,
|
||||
FM_CFG_RX_OSC_FREQ,
|
||||
|
||||
FM_CFG_TX_SCAN_HOLE_LOW,
|
||||
FM_CFG_TX_SCAN_HOLE_HIGH,
|
||||
FM_CFG_TX_PWR_LEVEL,
|
||||
FM_CFG_MAX
|
||||
};
|
||||
|
||||
typedef fm_s32(*CFG_HANDLER)(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg);
|
||||
extern fm_s32 to_upper_n(fm_s8 *str, fm_s32 len);
|
||||
extern fm_s32 check_hex_str(fm_s8 *str, fm_s32 len);
|
||||
extern fm_s32 check_dec_str(fm_s8 *str, fm_s32 len);
|
||||
extern fm_s32 ascii_to_hex(fm_s8 *in_ascii, fm_u16 *out_hex);
|
||||
extern fm_s32 ascii_to_dec(fm_s8 *in_ascii, fm_s32 *out_dec);
|
||||
extern fm_s32 trim_string(fm_s8 **start);
|
||||
extern fm_s32 trim_path(fm_s8 **start);
|
||||
extern fm_s32 cfg_parser(fm_s8 *buffer, CFG_HANDLER handler, fm_cust_cfg *cfg);
|
||||
extern fm_s32 cfg_item_match(fm_s8 *src_key, fm_s8 *src_val, fm_s8 *dst_key, fm_s32 *dst_val);
|
||||
|
||||
extern fm_s32 fm_cust_config(const fm_s8 *filepath);
|
||||
extern fm_u16 fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
|
||||
#ifdef MT6628_FM
|
||||
extern fm_s32 MT6628fm_cust_config_setup(const fm_s8 *filepath);
|
||||
extern fm_u16 MT6628fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
|
||||
#endif
|
||||
#ifdef MT6620_FM
|
||||
extern fm_s32 MT6620fm_cust_config_setup(const fm_s8 *filepath);
|
||||
extern fm_u16 MT6620fm_cust_config_fetch(enum fm_cust_cfg_op op_code);
|
||||
#endif
|
||||
#endif //__FM_CONFIG_H__
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
#ifndef __FM_DBG_H__
|
||||
#define __FM_DBG_H__
|
||||
|
||||
#include <linux/kernel.h> //for printk()
|
||||
|
||||
//DBG zone
|
||||
#define BASE 4
|
||||
#define MAIN (1 << (BASE+0))
|
||||
#define LINK (1 << (BASE+1))
|
||||
#define EINT (1 << (BASE+2))
|
||||
#define CHIP (1 << (BASE+3))
|
||||
#define RDSC (1 << (BASE+4))
|
||||
#define G0 (1 << (BASE+5))
|
||||
#define G1 (1 << (BASE+6))
|
||||
#define G2 (1 << (BASE+7))
|
||||
#define G3 (1 << (BASE+8))
|
||||
#define G4 (1 << (BASE+9))
|
||||
#define G14 (1 << (BASE+10))
|
||||
#define RAW (1 << (BASE+11))
|
||||
#define OPEN (1 << (BASE+12))
|
||||
#define IOCTL (1 << (BASE+13))
|
||||
#define READ_ (1 << (BASE+14))
|
||||
#define CLOSE (1 << (BASE+15))
|
||||
#define CQI (1 << (BASE+16))
|
||||
#define ALL 0xfffffff0
|
||||
|
||||
//DBG level
|
||||
#define L0 0x00000000 // EMERG, system will crush
|
||||
#define L1 0x00000001 // ALERT, need action in time
|
||||
#define L2 0x00000002 // CRIT, important HW or SW operation failed
|
||||
#define L3 0x00000003 // ERR, normal HW or SW ERR
|
||||
#define L4 0x00000004 // WARNING, importan path or somewhere may occurs err
|
||||
#define L5 0x00000005 // NOTICE, normal case
|
||||
#define L6 0x00000006 // INFO, print info if need
|
||||
#define L7 0x00000007 // DEBUG, for debug info
|
||||
|
||||
#define FM_EMG L0
|
||||
#define FM_ALT L1
|
||||
#define FM_CRT L2
|
||||
#define FM_ERR L3
|
||||
#define FM_WAR L4
|
||||
#define FM_NTC L5
|
||||
#define FM_INF L6
|
||||
#define FM_DBG L7
|
||||
|
||||
extern fm_u32 g_dbg_level;
|
||||
#define WCN_DBG(flag, fmt, args...) \
|
||||
do { \
|
||||
if ((((flag)&0x0000000f)<=(g_dbg_level&0x0000000f)) && ((flag)&0xfffffff0)& g_dbg_level) { \
|
||||
printk(KERN_ALERT "[" #flag "]" fmt, ## args); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
|
||||
|
||||
#endif //__FM_DBG_H__
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
#ifndef __FM_EINT_H__
|
||||
#define __FM_EINT_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
|
||||
enum{
|
||||
FM_EINT_PIN_EINT_MODE,
|
||||
FM_EINT_PIN_GPIO_MODE,
|
||||
FM_EINT_PIN_MAX_MODE
|
||||
};
|
||||
|
||||
extern fm_s32 fm_enable_eint(void);
|
||||
extern fm_s32 fm_disable_eint(void);
|
||||
extern fm_s32 fm_request_eint(void (*parser)(void));
|
||||
extern fm_s32 fm_eint_pin_cfg(fm_s32 mode);
|
||||
|
||||
#endif //__FM_EINT_H__
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
#ifndef __FM_ERR_H__
|
||||
#define __FM_ERR_H__
|
||||
|
||||
#include <linux/kernel.h> //for printk()
|
||||
|
||||
#define FM_ERR_BASE 1000
|
||||
typedef enum fm_drv_err_t {
|
||||
FM_EOK = FM_ERR_BASE,
|
||||
FM_EBUF,
|
||||
FM_EPARA,
|
||||
FM_ELINK,
|
||||
FM_ELOCK,
|
||||
FM_EFW,
|
||||
FM_ECRC,
|
||||
FM_EWRST, //wholechip reset
|
||||
FM_ESRST, //subsystem reset
|
||||
FM_EPATCH,
|
||||
FM_ENOMEM,
|
||||
FM_EINUSE, //other client is using this object
|
||||
FM_EMAX
|
||||
} fm_drv_err_t;
|
||||
|
||||
#define FMR_ASSERT(a) { \
|
||||
if ((a) == NULL) { \
|
||||
printk("%s,invalid pointer\n", __func__);\
|
||||
return -FM_EPARA; \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif //__FM_ERR_H__
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
#ifndef __FM_INTERFACE_H__
|
||||
#define __FM_INTERFACE_H__
|
||||
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_rds.h"
|
||||
#include "fm_utils.h"
|
||||
|
||||
/******************************************************************************
|
||||
* STRUCTURE DEFINITIONS
|
||||
*****************************************************************************/
|
||||
enum fm_op_state {
|
||||
FM_STA_STOP = 0,
|
||||
FM_STA_PLAY = 1,
|
||||
FM_STA_TUNE = 2,
|
||||
FM_STA_SEEK = 3,
|
||||
FM_STA_SCAN = 4,
|
||||
FM_STA_RAMPDOWN = 5,
|
||||
FM_STA_UNKOWN = 100,
|
||||
FM_STA_MAX
|
||||
};
|
||||
|
||||
enum fm_pwr_state {
|
||||
FM_PWR_OFF = 0,
|
||||
FM_PWR_RX_ON = 1,
|
||||
FM_PWR_TX_ON = 2,
|
||||
FM_PWR_MAX
|
||||
};
|
||||
|
||||
enum fm_audio_path {
|
||||
FM_AUD_ANALOG = 0, //analog: line in
|
||||
FM_AUD_DIGITAL = 1, //digital: I2S
|
||||
FM_AUD_MAX
|
||||
};
|
||||
|
||||
enum fm_antenna_type {
|
||||
FM_ANA_LONG = 0, //long antenna
|
||||
FM_ANA_SHORT = 1, //short antenna
|
||||
FM_ANA_MAX
|
||||
};
|
||||
|
||||
struct fm_hw_info {
|
||||
fm_s32 chip_id; //chip ID, eg. 6620
|
||||
fm_s32 eco_ver; //chip ECO version, eg. E3
|
||||
fm_s32 rom_ver; //FM DSP rom code version, eg. V2
|
||||
fm_s32 patch_ver; //FM DSP patch version, eg. 1.11
|
||||
fm_s32 reserve;
|
||||
};
|
||||
|
||||
typedef struct fm_i2s_info {
|
||||
fm_s32 status;
|
||||
fm_s32 mode;
|
||||
fm_s32 rate;
|
||||
} fm_i2s_info_t;
|
||||
|
||||
|
||||
struct fm_platform {
|
||||
struct cdev cdev;
|
||||
dev_t dev_t;
|
||||
struct class *cls;
|
||||
struct device *dev;
|
||||
};
|
||||
|
||||
struct fm {
|
||||
//chip info
|
||||
fm_u16 chip_id; //chip id, such as 6616/6620/6626/6628
|
||||
fm_u16 device_id; //chip version
|
||||
//basic run time info
|
||||
fm_s32 ref; //fm driver can be multi opened
|
||||
fm_bool chipon; //Chip power state
|
||||
enum fm_pwr_state pwr_sta; //FM module power state
|
||||
enum fm_op_state op_sta; //current operation state: tune, seek, scan ...
|
||||
enum fm_audio_path aud_path; //I2S or Analog
|
||||
fm_s32 vol; //current audio volume from chip side
|
||||
fm_bool mute; // true: mute, false: playing
|
||||
fm_bool rds_on; // true: on, false: off
|
||||
enum fm_antenna_type ana_type; //long/short antenna
|
||||
fm_bool via_bt; // true: fm over bt controller; false: fm over host
|
||||
fm_u16 min_freq; // for UE, 875KHz
|
||||
fm_u16 max_freq; // for UE, 1080KHz
|
||||
fm_u16 cur_freq; //current frequency
|
||||
fm_u8 band; // UE/JAPAN/JPANWD
|
||||
/*FM Tx*/
|
||||
fm_u32 vcoon;//TX VCO tracking ON duiration(ms)
|
||||
fm_u32 vcooff;//TX RTC VCO tracking interval(s)
|
||||
fm_u32 txpwrctl;//TX power contrl interval(s)
|
||||
fm_u32 tx_pwr;
|
||||
fm_bool rdstx_on; //false:rds tx off, true:rds tx on
|
||||
//RDS data
|
||||
struct fm_flag_event *rds_event;//pointer to rds event
|
||||
struct rds_t *pstRDSData; //rds spec data buffer
|
||||
//platform data
|
||||
struct fm_platform platform; //platform related members
|
||||
|
||||
struct fm_workthread *eint_wkthd;
|
||||
struct fm_workthread *timer_wkthd;
|
||||
struct fm_work *eint_wk;
|
||||
struct fm_work *rds_wk;
|
||||
struct fm_work *rst_wk; //work for subsystem reset
|
||||
//Tx
|
||||
struct fm_work *fm_tx_desense_wifi_work;
|
||||
struct fm_work *fm_tx_power_ctrl_work;
|
||||
|
||||
};
|
||||
|
||||
struct fm_callback {
|
||||
//call backs
|
||||
fm_u16(*cur_freq_get)(void);
|
||||
fm_s32(*cur_freq_set)(fm_u16 new_freq);
|
||||
// fm_u16(*chan_para_get)(fm_u16 freq); //get channel parameter, HL side/ FA / ATJ
|
||||
};
|
||||
|
||||
struct fm_basic_interface {
|
||||
//mt66x6 lib interfaces
|
||||
fm_s32(*low_pwr_wa)(fm_s32 onoff);
|
||||
fm_s32(*pwron)(fm_s32 data);
|
||||
fm_s32(*pwroff)(fm_s32 data);
|
||||
fm_s32(*msdelay)(fm_u32 val);
|
||||
fm_s32(*usdelay)(fm_u32 val);
|
||||
fm_s32(*read)(fm_u8 addr, fm_u16 *val);
|
||||
fm_s32(*write)(fm_u8 addr, fm_u16 val);
|
||||
fm_s32(*setbits)(fm_u8 addr, fm_u16 bits, fm_u16 msk);
|
||||
fm_u16(*chipid_get)(void);
|
||||
fm_s32(*mute)(fm_bool mute);
|
||||
fm_s32(*rampdown)(void);
|
||||
fm_s32(*pwrupseq)(fm_u16 *chip_id, fm_u16 *device_id);
|
||||
fm_s32(*pwrdownseq)(void);
|
||||
fm_bool(*setfreq)(fm_u16 freq);
|
||||
fm_bool(*seek)(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 dir, fm_u16 space);
|
||||
fm_s32(*seekstop)(void);
|
||||
fm_bool(*scan)(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl, fm_u16 *tblsize, fm_u16 dir, fm_u16 space);
|
||||
fm_bool(*jammer_scan)(fm_u16 min_freq, fm_u16 max_freq, fm_u16 *freq, fm_u16 *tbl, fm_u16 *tblsize, fm_u16 dir, fm_u16 space);
|
||||
fm_s32(*cqi_get)(fm_s8 *buf, fm_s32 buf_len);
|
||||
fm_s32(*scanstop)(void);
|
||||
fm_s32(*rssiget)(fm_s32 *rssi);
|
||||
fm_s32(*volset)(fm_u8 vol);
|
||||
fm_s32(*volget)(fm_u8 *vol);
|
||||
fm_s32(*dumpreg)(void);
|
||||
fm_bool(*msget)(fm_u16 *ms); //mono/stereo indicator get
|
||||
fm_s32(*msset)(fm_s32 ms); //mono/stereo force set
|
||||
fm_bool(*pamdget)(fm_u16 *pamd);
|
||||
fm_bool(*em)(fm_u16 group, fm_u16 item, fm_u32 val);
|
||||
fm_s32(*anaswitch)(fm_s32 ana);
|
||||
fm_s32(*anaget)(void);
|
||||
fm_s32(*caparray_get)(fm_s32 *ca);
|
||||
fm_s32(*i2s_set)(fm_s32 onoff, fm_s32 mode, fm_s32 sample);
|
||||
fm_s32(*i2s_get)(fm_s32 *ponoff, fm_s32 *pmode, fm_s32 *psample);
|
||||
fm_s32(*hwinfo_get)(struct fm_hw_info *req);
|
||||
fm_s32(*is_dese_chan)(fm_u16 freq); // check if this is a de-sense channel
|
||||
fm_s32(*softmute_tune)(fm_u16 freq,fm_s32 *rssi,fm_bool *valid);
|
||||
fm_s32(*desense_check)(fm_u16 freq,fm_s32 rssi); // check if this is a valid channel
|
||||
fm_s32(*get_freq_cqi)(fm_u16 freq,fm_s32 *cqi);
|
||||
fm_s32(*cqi_log)(fm_s32 min_freq, fm_s32 max_freq,fm_s32 space, fm_s32 cnt);//cqi log tool
|
||||
fm_s32(*fm_via_bt)(fm_bool flag);//fm over BT:1:enable,0:disable
|
||||
/*tx function*/
|
||||
fm_s32(*tx_support)(fm_s32 *sup);
|
||||
fm_s32(*rdstx_enable)(fm_s32 *flag);
|
||||
fm_bool(*tune_tx)(fm_u16 freq);
|
||||
fm_s32(*pwrupseq_tx)(void);
|
||||
fm_s32(*pwrdownseq_tx)(void);
|
||||
fm_s32 (*tx_pwr_ctrl)(fm_u16 freq, fm_s32 *ctr);
|
||||
fm_s32 (*rtc_drift_ctrl)(fm_u16 freq, fm_s32 *ctr);
|
||||
fm_s32 (*tx_desense_wifi)(fm_u16 freq, fm_s32 *ctr);
|
||||
fm_s32 (*tx_scan)(fm_u16 min_freq, fm_u16 max_freq,fm_u16 *pFreq,fm_u16 *pScanTBL,fm_u16 *ScanTBLsize,fm_u16 scandir,fm_u16 space);
|
||||
};
|
||||
|
||||
struct fm_rds_interface {
|
||||
//rds lib interfaces
|
||||
fm_s32(*rds_blercheck)(rds_t *dst);
|
||||
fm_bool(*rds_onoff)(rds_t *dst, fm_bool onoff);
|
||||
fm_s32(*rds_parser)(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, fm_u16(*getfreq)(void));
|
||||
fm_u16(*rds_gbc_get)(void); //good block counter
|
||||
fm_u16(*rds_bbc_get)(void); //bad block counter
|
||||
fm_u8(*rds_bbr_get)(void); //bad block ratio
|
||||
fm_s32(*rds_bc_reset)(void); //reset block counter
|
||||
fm_u32(*rds_bci_get)(void); //bler check interval
|
||||
fm_s32(*rds_log_get)(struct rds_rx_t *dst, fm_s32 *dst_len);
|
||||
fm_s32(*rds_gc_get)(struct rds_group_cnt_t *dst, rds_t *rdsp);
|
||||
fm_s32(*rds_gc_reset)(rds_t *rdsp);
|
||||
/*Tx*/
|
||||
fm_s32(*rds_tx)(fm_u16 pi, fm_u16 *ps, fm_u16 *other_rds, fm_u8 other_rds_cnt);
|
||||
fm_s32(*rds_tx_enable)(void);
|
||||
fm_s32(*rds_tx_disable)(void);
|
||||
fm_s32(*rdstx_support)(fm_s32 *sup);
|
||||
};
|
||||
|
||||
struct fm_lowlevel_ops {
|
||||
struct fm_callback cb;
|
||||
struct fm_basic_interface bi;
|
||||
struct fm_rds_interface ri;
|
||||
};
|
||||
|
||||
#if (!defined(MT6620_FM)&&!defined(MT6628_FM))
|
||||
extern fm_s32 fm_low_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 fm_rds_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
#endif
|
||||
#ifdef MT6620_FM
|
||||
extern fm_s32 MT6620fm_low_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6620fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6620fm_rds_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6620fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
#endif
|
||||
#ifdef MT6628_FM
|
||||
extern fm_s32 MT6628fm_low_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6628fm_low_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6628fm_rds_ops_register(struct fm_lowlevel_ops *ops);
|
||||
extern fm_s32 MT6628fm_rds_ops_unregister(struct fm_lowlevel_ops *ops);
|
||||
#endif
|
||||
/*
|
||||
* fm_get_channel_space - get the spcace of gived channel
|
||||
* @freq - value in 760~1080 or 7600~10800
|
||||
*
|
||||
* Return 0, if 760~1080; return 1, if 7600 ~ 10800, else err code < 0
|
||||
*/
|
||||
|
||||
extern fm_s32 fm_get_channel_space(int freq);
|
||||
#endif //__FM_INTERFACE_H__
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
#ifndef __FM_IOCTL_H__
|
||||
#define __FM_IOCTL_H__
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_rds.h"
|
||||
#include "fm_main.h"
|
||||
|
||||
#define FM_IOC_MAGIC 0xf5 // FIXME: any conflict?
|
||||
|
||||
#define FM_IOCTL_POWERUP _IOWR(FM_IOC_MAGIC, 0, struct fm_tune_parm*)
|
||||
#define FM_IOCTL_POWERDOWN _IOWR(FM_IOC_MAGIC, 1, int32_t*)
|
||||
#define FM_IOCTL_TUNE _IOWR(FM_IOC_MAGIC, 2, struct fm_tune_parm*)
|
||||
#define FM_IOCTL_SEEK _IOWR(FM_IOC_MAGIC, 3, struct fm_seek_parm*)
|
||||
#define FM_IOCTL_SETVOL _IOWR(FM_IOC_MAGIC, 4, uint32_t*)
|
||||
#define FM_IOCTL_GETVOL _IOWR(FM_IOC_MAGIC, 5, uint32_t*)
|
||||
#define FM_IOCTL_MUTE _IOWR(FM_IOC_MAGIC, 6, uint32_t*)
|
||||
#define FM_IOCTL_GETRSSI _IOWR(FM_IOC_MAGIC, 7, int32_t*)
|
||||
#define FM_IOCTL_SCAN _IOWR(FM_IOC_MAGIC, 8, struct fm_scan_parm*)
|
||||
#define FM_IOCTL_STOP_SCAN _IO(FM_IOC_MAGIC, 9)
|
||||
#define FM_IOCTL_POWERUP_TX _IOWR(FM_IOC_MAGIC, 20, struct fm_tune_parm*)
|
||||
#define FM_IOCTL_TUNE_TX _IOWR(FM_IOC_MAGIC, 21, struct fm_tune_parm*)
|
||||
#define FM_IOCTL_RDS_TX _IOWR(FM_IOC_MAGIC, 22, struct fm_rds_tx_parm*)
|
||||
|
||||
//IOCTL and struct for test
|
||||
#define FM_IOCTL_GETCHIPID _IOWR(FM_IOC_MAGIC, 10, uint16_t*)
|
||||
#define FM_IOCTL_EM_TEST _IOWR(FM_IOC_MAGIC, 11, struct fm_em_parm*)
|
||||
#define FM_IOCTL_RW_REG _IOWR(FM_IOC_MAGIC, 12, struct fm_ctl_parm*)
|
||||
#define FM_IOCTL_GETMONOSTERO _IOWR(FM_IOC_MAGIC, 13, uint16_t*)
|
||||
#define FM_IOCTL_GETCURPAMD _IOWR(FM_IOC_MAGIC, 14, uint16_t*)
|
||||
#define FM_IOCTL_GETGOODBCNT _IOWR(FM_IOC_MAGIC, 15, uint16_t*)
|
||||
#define FM_IOCTL_GETBADBNT _IOWR(FM_IOC_MAGIC, 16, uint16_t*)
|
||||
#define FM_IOCTL_GETBLERRATIO _IOWR(FM_IOC_MAGIC, 17, uint16_t*)
|
||||
|
||||
//IOCTL for RDS
|
||||
#define FM_IOCTL_RDS_ONOFF _IOWR(FM_IOC_MAGIC, 18, uint16_t*)
|
||||
#define FM_IOCTL_RDS_SUPPORT _IOWR(FM_IOC_MAGIC, 19, int32_t*)
|
||||
|
||||
#define FM_IOCTL_RDS_SIM_DATA _IOWR(FM_IOC_MAGIC, 23, uint32_t*)
|
||||
#define FM_IOCTL_IS_FM_POWERED_UP _IOWR(FM_IOC_MAGIC, 24, uint32_t*)
|
||||
|
||||
//IOCTL for FM Tx
|
||||
#define FM_IOCTL_TX_SUPPORT _IOWR(FM_IOC_MAGIC, 25, int32_t*)
|
||||
#define FM_IOCTL_RDSTX_SUPPORT _IOWR(FM_IOC_MAGIC, 26, int32_t*)
|
||||
#define FM_IOCTL_RDSTX_ENABLE _IOWR(FM_IOC_MAGIC, 27, int32_t*)
|
||||
#define FM_IOCTL_TX_SCAN _IOWR(FM_IOC_MAGIC, 28, struct fm_tx_scan_parm*)
|
||||
|
||||
//IOCTL for FM over BT
|
||||
#define FM_IOCTL_OVER_BT_ENABLE _IOWR(FM_IOC_MAGIC, 29, int32_t*)
|
||||
|
||||
//IOCTL for FM ANTENNA SWITCH
|
||||
#define FM_IOCTL_ANA_SWITCH _IOWR(FM_IOC_MAGIC, 30, int32_t*)
|
||||
#define FM_IOCTL_GETCAPARRAY _IOWR(FM_IOC_MAGIC, 31, int32_t*)
|
||||
|
||||
//IOCTL for FM compensation by GPS RTC
|
||||
#define FM_IOCTL_GPS_RTC_DRIFT _IOWR(FM_IOC_MAGIC, 32, struct fm_gps_rtc_info*)
|
||||
|
||||
//IOCTL for FM I2S Setting
|
||||
#define FM_IOCTL_I2S_SETTING _IOWR(FM_IOC_MAGIC, 33, struct fm_i2s_setting*)
|
||||
|
||||
#define FM_IOCTL_RDS_GROUPCNT _IOWR(FM_IOC_MAGIC, 34, struct rds_group_cnt_req_t*)
|
||||
#define FM_IOCTL_RDS_GET_LOG _IOWR(FM_IOC_MAGIC, 35, struct rds_raw_t*)
|
||||
|
||||
#define FM_IOCTL_SCAN_GETRSSI _IOWR(FM_IOC_MAGIC, 36, struct fm_rssi_req*)
|
||||
#define FM_IOCTL_SETMONOSTERO _IOWR(FM_IOC_MAGIC, 37, int32_t)
|
||||
|
||||
#define FM_IOCTL_RDS_BC_RST _IOWR(FM_IOC_MAGIC, 38, int32_t*)
|
||||
#define FM_IOCTL_CQI_GET _IOWR(FM_IOC_MAGIC, 39, struct fm_cqi_req*)
|
||||
#define FM_IOCTL_GET_HW_INFO _IOWR(FM_IOC_MAGIC, 40, struct fm_hw_info*)
|
||||
#define FM_IOCTL_GET_I2S_INFO _IOWR(FM_IOC_MAGIC, 41, struct fm_i2s_info*)
|
||||
#define FM_IOCTL_IS_DESE_CHAN _IOWR(FM_IOC_MAGIC, 42, int32_t*)
|
||||
|
||||
#define FM_IOCTL_SCAN_NEW _IOWR(FM_IOC_MAGIC, 60, struct fm_scan_t*)
|
||||
#define FM_IOCTL_SEEK_NEW _IOWR(FM_IOC_MAGIC, 61, struct fm_seek_t*)
|
||||
#define FM_IOCTL_TUNE_NEW _IOWR(FM_IOC_MAGIC, 62, struct fm_tune_t*)
|
||||
#define FM_IOCTL_SOFT_MUTE_TUNE _IOWR(FM_IOC_MAGIC, 63, struct fm_softmute_tune_t*)/*for soft mute tune*/
|
||||
#define FM_IOCTL_DESENSE_CHECK _IOWR(FM_IOC_MAGIC, 64, fm_desense_check_t*)
|
||||
|
||||
#define FM_IOCTL_DUMP_REG _IO(FM_IOC_MAGIC, 0xFF)
|
||||
|
||||
#endif //__FM_IOCTL_H__
|
||||
|
||||
@@ -1,218 +0,0 @@
|
||||
#ifndef __FM_LINK_H__
|
||||
#define __FM_LINK_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_rds.h"
|
||||
|
||||
typedef enum {
|
||||
FM_TASK_RX_PARSER_PKT_TYPE = 0,
|
||||
FM_TASK_RX_PARSER_OPCODE,
|
||||
FM_TASK_RX_PARSER_PKT_LEN_1,
|
||||
FM_TASK_RX_PARSER_PKT_LEN_2,
|
||||
FM_TASK_RX_PARSER_PKT_PAYLOAD,
|
||||
FM_TASK_RX_PARSER_BUFFER_CONGESTION
|
||||
} fm_task_parser_state;
|
||||
|
||||
enum {
|
||||
FM_TASK_COMMAND_PKT_TYPE = 0x01,
|
||||
FM_TASK_EVENT_PKT_TYPE = 0x04
|
||||
};
|
||||
|
||||
enum {
|
||||
FM_STP_TEST_OPCODE = 0x00,
|
||||
FSPI_ENABLE_OPCODE = 0x01,
|
||||
FSPI_MUX_SEL_OPCODE = 0x02,
|
||||
FSPI_READ_OPCODE = 0x03,
|
||||
FSPI_WRITE_OPCODE = 0x04,
|
||||
FI2C_READ_OPCODE = 0x05,
|
||||
FI2C_WRITE_OPCODE = 0x06,
|
||||
FM_ENABLE_OPCODE = 0x07,
|
||||
FM_RESET_OPCODE = 0x08,
|
||||
FM_TUNE_OPCODE = 0x09,
|
||||
FM_SEEK_OPCODE = 0x0a,
|
||||
FM_SCAN_OPCODE = 0x0b,
|
||||
RDS_RX_ENABLE_OPCODE = 0x0c,
|
||||
RDS_RX_DATA_OPCODE = 0x0d,
|
||||
FM_RAMPDOWN_OPCODE = 0x0e,
|
||||
FM_MCUCLK_SEL_OPCODE = 0x0f,
|
||||
FM_MODEMCLK_SEL_OPCODE = 0x10,
|
||||
RDS_TX_OPCODE = 0x11,
|
||||
FM_PATCH_DOWNLOAD_OPCODE = 0x12,
|
||||
FM_COEFF_DOWNLOAD_OPCODE = 0x13,
|
||||
FM_HWCOEFF_DOWNLOAD_OPCODE = 0x14,
|
||||
FM_ROM_DOWNLOAD_OPCODE = 0x15,
|
||||
FM_SOFT_MUTE_TUNE_OPCODE = 0x17,
|
||||
};
|
||||
|
||||
enum {
|
||||
FLAG_TEST = (1 << FM_STP_TEST_OPCODE),
|
||||
FLAG_FSPI_EN = (1 << FSPI_ENABLE_OPCODE),
|
||||
FLAG_FSPI_MUXSEL = (1 << FSPI_MUX_SEL_OPCODE),
|
||||
FLAG_FSPI_RD = (1 << FSPI_READ_OPCODE),
|
||||
FLAG_FSPI_WR = (1 << FSPI_WRITE_OPCODE),
|
||||
FLAG_I2C_RD = (1 << FI2C_READ_OPCODE),
|
||||
FLAG_I2C_WR = (1 << FI2C_WRITE_OPCODE),
|
||||
FLAG_EN = (1 << FM_ENABLE_OPCODE),
|
||||
FLAG_RST = (1 << FM_RESET_OPCODE),
|
||||
FLAG_TUNE = (1 << FM_TUNE_OPCODE),
|
||||
FLAG_SEEK = (1 << FM_SEEK_OPCODE),
|
||||
FLAG_SCAN = (1 << FM_SCAN_OPCODE),
|
||||
FLAG_RDS_RX_EN = (1 << RDS_RX_ENABLE_OPCODE),
|
||||
FLAG_RDS_DATA = (1 << RDS_RX_DATA_OPCODE),
|
||||
FLAG_RAMPDOWN = (1 << FM_RAMPDOWN_OPCODE),
|
||||
FLAG_MCUCLK = (1 << FM_MCUCLK_SEL_OPCODE),
|
||||
FLAG_MODEMCLK = (1 << FM_MODEMCLK_SEL_OPCODE),
|
||||
FLAG_RDS_TX = (1 << RDS_TX_OPCODE),
|
||||
FLAG_PATCH = (1 << FM_PATCH_DOWNLOAD_OPCODE),
|
||||
FLAG_COEFF = (1 << FM_COEFF_DOWNLOAD_OPCODE),
|
||||
FLAG_HWCOEFF = (1 << FM_HWCOEFF_DOWNLOAD_OPCODE),
|
||||
FLAG_ROM = (1 << FM_ROM_DOWNLOAD_OPCODE),
|
||||
FLAG_SM_TUNE = (1 << FM_SOFT_MUTE_TUNE_OPCODE), // 23
|
||||
FLAG_CQI_DONE = (1 << 27),
|
||||
FLAG_TUNE_DONE = (1 << 28),
|
||||
FLAG_SEEK_DONE = (1 << 29),
|
||||
FLAG_SCAN_DONE = (1 << 30),
|
||||
FLAG_TERMINATE = (1 << 31)
|
||||
};
|
||||
|
||||
#define FM_SCANTBL_SIZE 16
|
||||
#define FM_CQI_BUF_SIZE 96
|
||||
struct fm_res_ctx {
|
||||
fm_u16 fspi_rd;
|
||||
fm_u16 seek_result;
|
||||
fm_u16 scan_result[FM_SCANTBL_SIZE];
|
||||
fm_s8 cqi[FM_CQI_BUF_SIZE];
|
||||
struct rds_rx_t rds_rx_result;
|
||||
};
|
||||
|
||||
#define FM_TRACE_ENABLE
|
||||
|
||||
#define FM_TRACE_FIFO_SIZE 200
|
||||
#define FM_TRACE_PKT_SIZE 60
|
||||
struct fm_trace_t {
|
||||
fm_s32 type;
|
||||
fm_s32 opcode;
|
||||
fm_s32 len;
|
||||
fm_u8 pkt[FM_TRACE_PKT_SIZE]; // full packet
|
||||
unsigned long time;
|
||||
fm_s32 tid;
|
||||
};
|
||||
|
||||
struct fm_trace_fifo_t {
|
||||
fm_s8 name[20+1];
|
||||
struct fm_trace_t trace[FM_TRACE_FIFO_SIZE];
|
||||
fm_u32 size;
|
||||
fm_u32 in;
|
||||
fm_u32 out;
|
||||
fm_u32 len;
|
||||
fm_s32 (*trace_in)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *new_tra);
|
||||
fm_s32 (*trace_out)(struct fm_trace_fifo_t *thiz, struct fm_trace_t *dst_tra);
|
||||
fm_bool (*is_full)(struct fm_trace_fifo_t *thiz);
|
||||
fm_bool (*is_empty)(struct fm_trace_fifo_t *thiz);
|
||||
};
|
||||
|
||||
#define FM_TRACE_IN(fifop, tracep) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->trace_in){ \
|
||||
__ret = (fifop)->trace_in(fifop, tracep); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_TRACE_OUT(fifop, tracep) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->trace_out){ \
|
||||
__ret = (fifop)->trace_out(fifop, tracep); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_TRACE_FULL(fifop) \
|
||||
({ \
|
||||
fm_bool __ret = (fm_bool)fm_false; \
|
||||
if(fifop && (fifop)->is_full){ \
|
||||
__ret = (fifop)->is_full(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_TRACE_EMPTY(fifop) \
|
||||
({ \
|
||||
fm_bool __ret = (fm_bool)fm_false; \
|
||||
if(fifop && (fifop)->is_empty){ \
|
||||
__ret = (fifop)->is_empty(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#if (defined(MT6620_FM)||defined(MT6628_FM))
|
||||
#include "fm_utils.h"
|
||||
|
||||
#define RX_BUF_SIZE 128
|
||||
#define TX_BUF_SIZE 1024
|
||||
|
||||
#define SW_RETRY_CNT (1)
|
||||
#define SW_RETRY_CNT_MAX (5)
|
||||
#define SW_WAIT_TIMEOUT_MAX (100)
|
||||
// FM operation timeout define for error handle
|
||||
#define TEST_TIMEOUT (3)
|
||||
#define FSPI_EN_TIMEOUT (3)
|
||||
#define FSPI_MUXSEL_TIMEOUT (3)
|
||||
#define FSPI_RD_TIMEOUT (3)
|
||||
#define FSPI_WR_TIMEOUT (3)
|
||||
#define I2C_RD_TIMEOUT (3)
|
||||
#define I2C_WR_TIMEOUT (3)
|
||||
#define EN_TIMEOUT (3)
|
||||
#define RST_TIMEOUT (3)
|
||||
#define TUNE_TIMEOUT (3)
|
||||
#define SM_TUNE_TIMEOUT (6)
|
||||
#define SEEK_TIMEOUT (15)
|
||||
#define SCAN_TIMEOUT (15) //usualy scan will cost 10 seconds
|
||||
#define RDS_RX_EN_TIMEOUT (3)
|
||||
#define RDS_DATA_TIMEOUT (100)
|
||||
#define RAMPDOWN_TIMEOUT (3)
|
||||
#define MCUCLK_TIMEOUT (3)
|
||||
#define MODEMCLK_TIMEOUT (3)
|
||||
#define RDS_TX_TIMEOUT (3)
|
||||
#define PATCH_TIMEOUT (3)
|
||||
#define COEFF_TIMEOUT (3)
|
||||
#define HWCOEFF_TIMEOUT (3)
|
||||
#define ROM_TIMEOUT (3)
|
||||
|
||||
struct fm_link_event {
|
||||
struct fm_flag_event *ln_event;
|
||||
struct fm_res_ctx result; // seek/scan/read/RDS
|
||||
};
|
||||
#endif
|
||||
|
||||
/*
|
||||
* FM data and ctrl link APIs: platform related and bus related
|
||||
*/
|
||||
extern fm_s32 fm_link_setup(void* data);
|
||||
|
||||
extern fm_s32 fm_link_release(void);
|
||||
|
||||
extern fm_s32 fm_cmd_tx(fm_u8* buf, fm_u16 len, fm_s32 mask, fm_s32 cnt, fm_s32 timeout, fm_s32(*callback)(struct fm_res_ctx* result));
|
||||
|
||||
extern fm_s32 fm_event_parser(fm_s32(*rds_parser)(struct rds_rx_t*, fm_s32));
|
||||
|
||||
extern fm_s32 fm_ctrl_rx(fm_u8 addr, fm_u16 *val);
|
||||
|
||||
extern fm_s32 fm_ctrl_tx(fm_u8 addr, fm_u16 val);
|
||||
|
||||
extern fm_s32 fm_force_active_event(fm_u32 mask);
|
||||
|
||||
extern fm_bool fm_wait_stc_done(fm_u32 sec);
|
||||
|
||||
extern struct fm_trace_fifo_t* fm_trace_fifo_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_trace_fifo_release(struct fm_trace_fifo_t *fifo);
|
||||
|
||||
extern fm_s32 fm_print_cmd_fifo(void);
|
||||
|
||||
extern fm_s32 fm_print_evt_fifo(void);
|
||||
|
||||
#endif //__FM_LINK_H__
|
||||
|
||||
@@ -1,384 +0,0 @@
|
||||
#ifndef __FM_MAIN_H__
|
||||
#define __FM_MAIN_H__
|
||||
#include "fm_typedef.h"
|
||||
#include "fm_dbg.h"
|
||||
#include "fm_err.h"
|
||||
#include "fm_rds.h"
|
||||
#include "fm_eint.h"
|
||||
#include "fm_link.h"
|
||||
#include "fm_interface.h"
|
||||
#include "fm_stdlib.h"
|
||||
#include "fm_private.h"
|
||||
|
||||
#define FM_NAME "fm"
|
||||
#define FM_DEVICE_NAME "/dev/fm"
|
||||
|
||||
#define FM_VOL_MAX 0x2B // 43 volume(0-15)
|
||||
#define FM_TIMER_TIMEOUT_DEFAULT 1000
|
||||
#define FM_TIMER_TIMEOUT_MIN 1000
|
||||
#define FM_TIMER_TIMEOUT_MAX 1000000
|
||||
//FM Tx
|
||||
#define FM_TX_PWR_LEVEL_MAX 120 //FM transmitter power level, rang: 85db~120db, default 120db
|
||||
|
||||
#define FM_TX_PWR_CTRL_INVAL_DEFAULT 10
|
||||
#define FM_TX_PWR_CTRL_INVAL_MIN 5
|
||||
#define FM_TX_PWR_CTRL_INVAL_MAX 10000
|
||||
|
||||
#define FM_TX_VCO_OFF_DEFAULT 5
|
||||
#define FM_TX_VCO_OFF_MIN 1
|
||||
#define FM_TX_VCO_OFF_MAX 10000
|
||||
|
||||
#define FM_TX_VCO_ON_DEFAULT 100
|
||||
#define FM_TX_VCO_ON_MIN 10
|
||||
#define FM_TX_VCO_ON_MAX 10000
|
||||
|
||||
#define FM_GPS_RTC_AGE_TH 2
|
||||
#define FM_GPS_RTC_DRIFT_TH 0
|
||||
#define FM_GPS_RTC_TIME_DIFF_TH 10
|
||||
#define FM_GPS_RTC_RETRY_CNT 1
|
||||
#define FM_GPS_RTC_DRIFT_MAX 5000
|
||||
enum{
|
||||
FM_GPS_RTC_INFO_OLD = 0,
|
||||
FM_GPS_RTC_INFO_NEW = 1,
|
||||
FM_GPS_RTC_INFO_MAX
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FM_OVER_BT_DISABLE = 0,
|
||||
FM_OVER_BT_ENABLE
|
||||
}fm_over_bt_enable_state;
|
||||
|
||||
#define FM_RDS_ENABLE 0x01 // 1: enable RDS, 0:disable RDS
|
||||
#define FM_RDS_DATA_READY (1 << 0)
|
||||
|
||||
// errno
|
||||
#define FM_SUCCESS 0
|
||||
#define FM_FAILED 1
|
||||
#define FM_EPARM 2
|
||||
#define FM_BADSTATUS 3
|
||||
#define FM_TUNE_FAILED 4
|
||||
#define FM_SEEK_FAILED 5
|
||||
#define FM_BUSY 6
|
||||
#define FM_SCAN_FAILED 7
|
||||
|
||||
struct fm_tune_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 band;
|
||||
fm_u8 space;
|
||||
fm_u8 hilo;
|
||||
fm_u16 freq; // IN/OUT parameter
|
||||
};
|
||||
|
||||
struct fm_seek_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 band;
|
||||
fm_u8 space;
|
||||
fm_u8 hilo;
|
||||
fm_u8 seekdir;
|
||||
fm_u8 seekth;
|
||||
fm_u16 freq; // IN/OUT parameter
|
||||
};
|
||||
|
||||
#ifdef MTK_FM_50KHZ_SUPPORT
|
||||
struct fm_scan_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 band;
|
||||
fm_u8 space;
|
||||
fm_u8 hilo;
|
||||
fm_u16 freq; // OUT parameter
|
||||
fm_u16 ScanTBL[26]; //need no less than the chip
|
||||
fm_u16 ScanTBLSize; //IN/OUT parameter
|
||||
};
|
||||
#else
|
||||
struct fm_scan_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 band;
|
||||
fm_u8 space;
|
||||
fm_u8 hilo;
|
||||
fm_u16 freq; // OUT parameter
|
||||
fm_u16 ScanTBL[16]; //need no less than the chip
|
||||
fm_u16 ScanTBLSize; //IN/OUT parameter
|
||||
};
|
||||
#endif
|
||||
|
||||
struct fm_cqi {
|
||||
fm_s32 ch;
|
||||
fm_s32 rssi;
|
||||
fm_s32 reserve;
|
||||
};
|
||||
|
||||
struct fm_cqi_req {
|
||||
fm_u16 ch_num;
|
||||
fm_s32 buf_size;
|
||||
fm_s8 *cqi_buf;
|
||||
};
|
||||
|
||||
struct fm_ch_rssi {
|
||||
fm_u16 freq;
|
||||
fm_s32 rssi;
|
||||
};
|
||||
|
||||
enum fm_scan_cmd_t {
|
||||
FM_SCAN_CMD_INIT = 0,
|
||||
FM_SCAN_CMD_START,
|
||||
FM_SCAN_CMD_GET_NUM,
|
||||
FM_SCAN_CMD_GET_CH,
|
||||
FM_SCAN_CMD_GET_RSSI,
|
||||
FM_SCAN_CMD_GET_CH_RSSI,
|
||||
FM_SCAN_CMD_MAX
|
||||
};
|
||||
|
||||
struct fm_scan_t {
|
||||
enum fm_scan_cmd_t cmd;
|
||||
fm_s32 ret; // 0, success; else error code
|
||||
fm_u16 lower; // lower band, Eg, 7600 -> 76.0Mhz
|
||||
fm_u16 upper; // upper band, Eg, 10800 -> 108.0Mhz
|
||||
fm_s32 space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
|
||||
fm_s32 num; // valid channel number
|
||||
void *priv;
|
||||
fm_s32 sr_size; // scan result buffer size in bytes
|
||||
union {
|
||||
fm_u16 *ch_buf; // channel buffer
|
||||
fm_s32 *rssi_buf; // rssi buffer
|
||||
struct fm_ch_rssi *ch_rssi_buf; //channel and RSSI buffer
|
||||
} sr;
|
||||
};
|
||||
|
||||
struct fm_seek_t {
|
||||
fm_s32 ret; // 0, success; else error code
|
||||
fm_u16 freq;
|
||||
fm_u16 lower; // lower band, Eg, 7600 -> 76.0Mhz
|
||||
fm_u16 upper; // upper band, Eg, 10800 -> 108.0Mhz
|
||||
fm_s32 space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
|
||||
fm_s32 dir; // 0: up; 1: down
|
||||
fm_s32 th; // seek threshold in dbm(Eg, -95dbm)
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct fm_tune_t {
|
||||
fm_s32 ret; // 0, success; else error code
|
||||
fm_u16 freq;
|
||||
fm_u16 lower; // lower band, Eg, 7600 -> 76.0Mhz
|
||||
fm_u16 upper; // upper band, Eg, 10800 -> 108.0Mhz
|
||||
fm_s32 space; // 5: 50KHz, 10: 100Khz, 20: 200Khz
|
||||
void *priv;
|
||||
};
|
||||
|
||||
|
||||
#ifdef MTK_FM_50KHZ_SUPPORT
|
||||
struct fm_rssi_req {
|
||||
fm_u16 num;
|
||||
fm_u16 read_cnt;
|
||||
struct fm_ch_rssi cr[26*16];
|
||||
};
|
||||
#else
|
||||
struct fm_rssi_req {
|
||||
fm_u16 num;
|
||||
fm_u16 read_cnt;
|
||||
struct fm_ch_rssi cr[16*16];
|
||||
};
|
||||
#endif
|
||||
|
||||
struct fm_rds_tx_parm {
|
||||
fm_u8 err;
|
||||
fm_u16 pi;
|
||||
fm_u16 ps[12]; // 4 ps
|
||||
fm_u16 other_rds[87]; // 0~29 other groups
|
||||
fm_u8 other_rds_cnt; // # of other group
|
||||
};
|
||||
|
||||
typedef struct fm_rds_tx_req {
|
||||
unsigned char pty; // 0~31 integer
|
||||
unsigned char rds_rbds; // 0:RDS, 1:RBDS
|
||||
unsigned char dyn_pty; // 0:static, 1:dynamic
|
||||
unsigned short pi_code; // 2-byte hex
|
||||
unsigned char ps_buf[8]; // hex buf of PS
|
||||
unsigned char ps_len; // length of PS, must be 0 / 8"
|
||||
unsigned char af; // 0~204, 0:not used, 1~204:(87.5+0.1*af)MHz
|
||||
unsigned char ah; // Artificial head, 0:no, 1:yes
|
||||
unsigned char stereo; // 0:mono, 1:stereo
|
||||
unsigned char compress; // Audio compress, 0:no, 1:yes
|
||||
unsigned char tp; // traffic program, 0:no, 1:yes
|
||||
unsigned char ta; // traffic announcement, 0:no, 1:yes
|
||||
unsigned char speech; // 0:music, 1:speech
|
||||
} fm_rds_tx_req;
|
||||
|
||||
#define TX_SCAN_MAX 10
|
||||
#define TX_SCAN_MIN 1
|
||||
|
||||
struct fm_tx_scan_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 band; //87.6~108MHz
|
||||
fm_u8 space;
|
||||
fm_u8 hilo;
|
||||
fm_u16 freq; // start freq, if less than band min freq, then will use band min freq
|
||||
fm_u8 scandir;
|
||||
fm_u16 ScanTBL[TX_SCAN_MAX]; //need no less than the chip
|
||||
fm_u16 ScanTBLSize; //IN: desired size, OUT: scan result size
|
||||
};
|
||||
|
||||
struct fm_gps_rtc_info {
|
||||
fm_s32 err; //error number, 0: success, other: err code
|
||||
fm_s32 retryCnt; //GPS mnl can decide retry times
|
||||
fm_s32 ageThd; //GPS 3D fix time diff threshold
|
||||
fm_s32 driftThd; //GPS RTC drift threshold
|
||||
struct timeval tvThd; //time value diff threshold
|
||||
fm_s32 age; //GPS 3D fix time diff
|
||||
fm_s32 drift; //GPS RTC drift
|
||||
union {
|
||||
unsigned long stamp; //time stamp in jiffies
|
||||
struct timeval tv; //time stamp value in RTC
|
||||
};
|
||||
fm_s32 flag; //rw flag
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
FM_I2S_ON = 0,
|
||||
FM_I2S_OFF
|
||||
} fm_i2s_state;
|
||||
|
||||
typedef enum {
|
||||
FM_I2S_MASTER = 0,
|
||||
FM_I2S_SLAVE
|
||||
} fm_i2s_mode;
|
||||
|
||||
typedef enum {
|
||||
FM_I2S_32K = 0,
|
||||
FM_I2S_44K,
|
||||
FM_I2S_48K
|
||||
} fm_i2s_sample;
|
||||
|
||||
struct fm_i2s_setting {
|
||||
fm_s32 onoff;
|
||||
fm_s32 mode;
|
||||
fm_s32 sample;
|
||||
};
|
||||
typedef struct
|
||||
{
|
||||
fm_s32 freq;
|
||||
fm_s32 rssi;
|
||||
}fm_desense_check_t;
|
||||
|
||||
typedef enum {
|
||||
FM_RX = 0,
|
||||
FM_TX = 1
|
||||
} FM_PWR_T;
|
||||
|
||||
struct fm_ctl_parm {
|
||||
fm_u8 err;
|
||||
fm_u8 addr;
|
||||
fm_u16 val;
|
||||
fm_u16 rw_flag;//0:write, 1:read
|
||||
};
|
||||
struct fm_em_parm {
|
||||
fm_u16 group_idx;
|
||||
fm_u16 item_idx;
|
||||
fm_u32 item_value;
|
||||
};
|
||||
|
||||
enum {
|
||||
FM_SUBSYS_RST_OFF,
|
||||
FM_SUBSYS_RST_START,
|
||||
FM_SUBSYS_RST_END,
|
||||
FM_SUBSYS_RST_MAX
|
||||
};
|
||||
enum{
|
||||
FM_TX_PWR_CTRL_DISABLE,
|
||||
FM_TX_PWR_CTRL_ENABLE,
|
||||
FM_TX_PWR_CTRL_MAX
|
||||
};
|
||||
|
||||
enum{
|
||||
FM_TX_RTC_CTRL_DISABLE,
|
||||
FM_TX_RTC_CTRL_ENABLE,
|
||||
FM_TX_RTC_CTRL_MAX
|
||||
};
|
||||
|
||||
enum{
|
||||
FM_TX_DESENSE_DISABLE,
|
||||
FM_TX_DESENSE_ENABLE,
|
||||
FM_TX_DESENSE_MAX
|
||||
};
|
||||
|
||||
struct fm_softmute_tune_t
|
||||
{
|
||||
fm_s32 rssi; // RSSI of current channel
|
||||
fm_u16 freq; //current frequency
|
||||
fm_bool valid; //current channel is valid(true) or not(false)
|
||||
};
|
||||
|
||||
//init and deinit APIs
|
||||
extern fm_s32 fm_env_setup(void);
|
||||
extern fm_s32 fm_env_destroy(void);
|
||||
extern struct fm* fm_dev_init(fm_u32 arg);
|
||||
extern fm_s32 fm_dev_destroy(struct fm *fm);
|
||||
|
||||
|
||||
//fm main basic APIs
|
||||
extern enum fm_pwr_state fm_pwr_state_get(struct fm *fmp);
|
||||
extern enum fm_pwr_state fm_pwr_state_set(struct fm *fmp, enum fm_pwr_state sta);
|
||||
extern fm_s32 fm_open(struct fm *fmp);
|
||||
extern fm_s32 fm_close(struct fm *fmp);
|
||||
extern fm_s32 fm_rds_read(struct fm *fmp, fm_s8 *dst, fm_s32 len);
|
||||
extern fm_s32 fm_powerup(struct fm *fm, struct fm_tune_parm *parm);
|
||||
extern fm_s32 fm_powerdown(struct fm *fm);
|
||||
extern fm_s32 fm_seek(struct fm *fm, struct fm_seek_parm *parm);
|
||||
extern fm_s32 fm_scan(struct fm *fm, struct fm_scan_parm *parm);
|
||||
extern fm_s32 fm_cqi_get(struct fm *fm, fm_s32 ch_num, fm_s8 *buf, fm_s32 buf_size);
|
||||
extern fm_s32 fm_get_hw_info(struct fm *pfm, struct fm_hw_info *req);
|
||||
extern fm_s32 fm_hwscan_stop(struct fm *fm);
|
||||
extern fm_s32 fm_ana_switch(struct fm *fm, fm_s32 antenna);
|
||||
extern fm_s32 fm_setvol(struct fm *fm, fm_u32 vol);
|
||||
extern fm_s32 fm_getvol(struct fm *fm, fm_u32 *vol);
|
||||
extern fm_s32 fm_mute(struct fm *fm, fm_u32 bmute);
|
||||
extern fm_s32 fm_getrssi(struct fm *fm, fm_s32 *rssi);
|
||||
extern fm_s32 fm_reg_read(struct fm *fm, fm_u8 addr, fm_u16 *val);
|
||||
extern fm_s32 fm_reg_write(struct fm *fm, fm_u8 addr, fm_u16 val);
|
||||
extern fm_s32 fm_chipid_get(struct fm *fm, fm_u16 *chipid);
|
||||
extern fm_s32 fm_monostereo_get(struct fm *fm, fm_u16 *ms);
|
||||
extern fm_s32 fm_monostereo_set(struct fm *fm, fm_s32 ms);
|
||||
extern fm_s32 fm_pamd_get(struct fm *fm, fm_u16 *pamd);
|
||||
extern fm_s32 fm_caparray_get(struct fm *fm, fm_s32 *ca);
|
||||
extern fm_s32 fm_em_test(struct fm *fm, fm_u16 group, fm_u16 item, fm_u32 val);
|
||||
extern fm_s32 fm_rds_onoff(struct fm *fm, fm_u16 rdson_off);
|
||||
extern fm_s32 fm_rds_good_bc_get(struct fm *fm, fm_u16 *gbc);
|
||||
extern fm_s32 fm_rds_bad_bc_get(struct fm *fm, fm_u16 *bbc);
|
||||
extern fm_s32 fm_rds_bler_ratio_get(struct fm *fm, fm_u16 *bbr);
|
||||
extern fm_s32 fm_rds_group_cnt_get(struct fm *fm, struct rds_group_cnt_t *dst);
|
||||
extern fm_s32 fm_rds_group_cnt_reset(struct fm *fm);
|
||||
extern fm_s32 fm_rds_log_get(struct fm *fm, struct rds_rx_t *dst, fm_s32 *dst_len);
|
||||
extern fm_s32 fm_rds_block_cnt_reset(struct fm *fm);
|
||||
extern fm_s32 fm_i2s_set(struct fm *fm, fm_s32 onoff, fm_s32 mode, fm_s32 sample);
|
||||
extern fm_s32 fm_get_i2s_info(struct fm *pfm, struct fm_i2s_info *req);
|
||||
extern fm_s32 fm_tune(struct fm *fm, struct fm_tune_parm *parm);
|
||||
extern fm_s32 fm_is_dese_chan(struct fm *pfm, fm_u16 freq);
|
||||
extern fm_s32 fm_desense_check(struct fm *pfm, fm_u16 freq,fm_s32 rssi);
|
||||
extern fm_s32 fm_sys_state_get(struct fm *fmp);
|
||||
extern fm_s32 fm_sys_state_set(struct fm *fmp, fm_s32 sta);
|
||||
extern fm_s32 fm_subsys_reset(struct fm *fm);
|
||||
|
||||
extern fm_s32 fm_scan_new(struct fm *fm, struct fm_scan_t *parm);
|
||||
extern fm_s32 fm_seek_new(struct fm *fm, struct fm_seek_t *parm);
|
||||
extern fm_s32 fm_tune_new(struct fm *fm, struct fm_tune_t *parm);
|
||||
|
||||
extern fm_s32 fm_cust_config_setup(fm_s8 * filename);
|
||||
extern fm_s32 fm_cqi_log(void);
|
||||
extern fm_s32 fm_soft_mute_tune(struct fm *fm, struct fm_softmute_tune_t *parm);
|
||||
extern fm_s32 fm_dump_reg(void);
|
||||
extern fm_s32 fm_get_gps_rtc_info(struct fm_gps_rtc_info *src);
|
||||
extern fm_s32 fm_over_bt(struct fm *fm, fm_s32 flag);
|
||||
|
||||
/*tx function*/
|
||||
extern fm_s32 fm_tx_support(struct fm *fm, fm_s32 *support);
|
||||
|
||||
extern fm_s32 fm_powerup_tx(struct fm *fm, struct fm_tune_parm *parm);
|
||||
extern fm_s32 fm_tune_tx(struct fm *fm, struct fm_tune_parm *parm);
|
||||
extern fm_s32 fm_powerdowntx(struct fm *fm);
|
||||
extern fm_s32 fm_rds_tx(struct fm *fm, struct fm_rds_tx_parm *parm);
|
||||
extern fm_s32 fm_rdstx_support(struct fm *fm, fm_s32 *support);
|
||||
extern fm_s32 fm_rdstx_enable(struct fm *fm, fm_s32 *support);
|
||||
extern fm_s32 fm_tx_scan(struct fm *fm, struct fm_tx_scan_parm *parm);
|
||||
|
||||
#endif //__FM_MAIN_H__
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
#ifndef __FM_PATCH_H__
|
||||
#define __FM_PATCH_H__
|
||||
|
||||
enum {
|
||||
FM_ROM_V1 = 0,
|
||||
FM_ROM_V2 = 1,
|
||||
FM_ROM_V3 = 2,
|
||||
FM_ROM_V4 = 3,
|
||||
FM_ROM_V5 = 4,
|
||||
FM_ROM_MAX
|
||||
};
|
||||
|
||||
struct fm_patch_tbl {
|
||||
fm_s32 idx;
|
||||
fm_s8 *patch;
|
||||
fm_s8 *coeff;
|
||||
fm_s8 *rom;
|
||||
fm_s8 *hwcoeff;
|
||||
};
|
||||
|
||||
extern fm_s32 fm_file_exist(const fm_s8 *filename);
|
||||
|
||||
extern fm_s32 fm_file_read(const fm_s8 *filename, fm_u8* dst, fm_s32 len, fm_s32 position);
|
||||
|
||||
extern fm_s32 fm_file_write(const fm_s8 *filename, fm_u8* dst, fm_s32 len, fm_s32 *ppos);
|
||||
|
||||
|
||||
#endif //__FM_PATCH_H__
|
||||
|
||||
@@ -1,219 +0,0 @@
|
||||
#ifndef __FM_RDS_H__
|
||||
#define __FM_RDS_H__
|
||||
#include "fm_typedef.h"
|
||||
|
||||
//FM_RDS_DATA_CRC_FFOST
|
||||
#define FM_RDS_GDBK_IND_A (0x08)
|
||||
#define FM_RDS_GDBK_IND_B (0x04)
|
||||
#define FM_RDS_GDBK_IND_C (0x02)
|
||||
#define FM_RDS_GDBK_IND_D (0x01)
|
||||
#define FM_RDS_DCO_FIFO_OFST (0x01E0)
|
||||
#define FM_RDS_READ_DELAY (0x80)
|
||||
|
||||
#define RDS_RX_BLOCK_PER_GROUP (4)
|
||||
#define RDS_RX_GROUP_SIZE (2*RDS_RX_BLOCK_PER_GROUP)
|
||||
#define MAX_RDS_RX_GROUP_CNT (12)
|
||||
#define RDS_RT_MULTI_REV_TH 100
|
||||
|
||||
typedef struct rds_packet_t {
|
||||
fm_u16 blkA;
|
||||
fm_u16 blkB;
|
||||
fm_u16 blkC;
|
||||
fm_u16 blkD;
|
||||
fm_u16 cbc; //correct bit cnt
|
||||
fm_u16 crc; //crc checksum
|
||||
} rds_packet_t;
|
||||
|
||||
typedef struct rds_rx_t {
|
||||
fm_u16 sin;
|
||||
fm_u16 cos;
|
||||
rds_packet_t data[MAX_RDS_RX_GROUP_CNT];
|
||||
} rds_rx_t;
|
||||
|
||||
typedef enum rds_ps_state_machine_t {
|
||||
RDS_PS_START = 0,
|
||||
RDS_PS_DECISION,
|
||||
RDS_PS_GETLEN,
|
||||
RDS_PS_DISPLAY,
|
||||
RDS_PS_FINISH,
|
||||
RDS_PS_MAX
|
||||
} rds_ps_state_machine_t;
|
||||
|
||||
typedef enum rds_rt_state_machine_t {
|
||||
RDS_RT_START = 0,
|
||||
RDS_RT_DECISION,
|
||||
RDS_RT_GETLEN,
|
||||
RDS_RT_DISPLAY,
|
||||
RDS_RT_FINISH,
|
||||
RDS_RT_MAX
|
||||
} rds_rt_state_machine_t;
|
||||
|
||||
|
||||
enum {
|
||||
RDS_GRP_VER_A = 0, //group version A
|
||||
RDS_GRP_VER_B
|
||||
};
|
||||
|
||||
typedef enum rds_blk_t {
|
||||
RDS_BLK_A = 0,
|
||||
RDS_BLK_B,
|
||||
RDS_BLK_C,
|
||||
RDS_BLK_D,
|
||||
RDS_BLK_MAX
|
||||
} rds_blk_t;
|
||||
|
||||
//For RDS feature, these strcutures also be defined in "fm.h"
|
||||
typedef struct rds_flag_t {
|
||||
fm_u8 TP;
|
||||
fm_u8 TA;
|
||||
fm_u8 Music;
|
||||
fm_u8 Stereo;
|
||||
fm_u8 Artificial_Head;
|
||||
fm_u8 Compressed;
|
||||
fm_u8 Dynamic_PTY;
|
||||
fm_u8 Text_AB;
|
||||
fm_u32 flag_status;
|
||||
} rds_flag_t;
|
||||
|
||||
typedef struct rds_ct_t {
|
||||
fm_u16 Month;
|
||||
fm_u16 Day;
|
||||
fm_u16 Year;
|
||||
fm_u16 Hour;
|
||||
fm_u16 Minute;
|
||||
fm_u8 Local_Time_offset_signbit;
|
||||
fm_u8 Local_Time_offset_half_hour;
|
||||
} rds_ct_t;
|
||||
|
||||
typedef struct rds_af_t {
|
||||
fm_s16 AF_Num;
|
||||
fm_s16 AF[2][25]; //100KHz
|
||||
fm_u8 Addr_Cnt;
|
||||
fm_u8 isMethod_A;
|
||||
fm_u8 isAFNum_Get;
|
||||
} rds_af_t;
|
||||
|
||||
typedef struct rds_ps_t {
|
||||
fm_u8 PS[4][8];
|
||||
fm_u8 Addr_Cnt;
|
||||
} rds_ps_t;
|
||||
|
||||
typedef struct rds_rt_t {
|
||||
fm_u8 TextData[4][64];
|
||||
fm_u8 GetLength;
|
||||
fm_u8 isRTDisplay;
|
||||
fm_u8 TextLength;
|
||||
fm_u8 isTypeA;
|
||||
fm_u8 BufCnt;
|
||||
fm_u16 Addr_Cnt;
|
||||
} rds_rt_t;
|
||||
|
||||
typedef struct rds_raw_t {
|
||||
fm_s32 dirty; //indicate if the data changed or not
|
||||
fm_s32 len; //the data len form chip
|
||||
fm_u8 data[146];
|
||||
} rds_raw_t;
|
||||
|
||||
typedef struct rds_group_cnt_t {
|
||||
unsigned long total;
|
||||
unsigned long groupA[16]; //RDS groupA counter
|
||||
unsigned long groupB[16]; //RDS groupB counter
|
||||
} rds_group_cnt_t;
|
||||
|
||||
typedef enum rds_group_cnt_op_t {
|
||||
RDS_GROUP_CNT_READ = 0,
|
||||
RDS_GROUP_CNT_WRITE,
|
||||
RDS_GROUP_CNT_RESET,
|
||||
RDS_GROUP_CNT_MAX
|
||||
} rds_group_cnt_op_t;
|
||||
|
||||
typedef struct rds_group_cnt_req_t {
|
||||
fm_s32 err;
|
||||
enum rds_group_cnt_op_t op;
|
||||
struct rds_group_cnt_t gc;
|
||||
} rds_group_cnt_req_t;
|
||||
|
||||
typedef struct rds_t {
|
||||
struct rds_ct_t CT;
|
||||
struct rds_flag_t RDSFlag;
|
||||
fm_u16 PI;
|
||||
fm_u8 Switch_TP;
|
||||
fm_u8 PTY;
|
||||
struct rds_af_t AF_Data;
|
||||
struct rds_af_t AFON_Data;
|
||||
fm_u8 Radio_Page_Code;
|
||||
fm_u16 Program_Item_Number_Code;
|
||||
fm_u8 Extend_Country_Code;
|
||||
fm_u16 Language_Code;
|
||||
struct rds_ps_t PS_Data;
|
||||
fm_u8 PS_ON[8];
|
||||
struct rds_rt_t RT_Data;
|
||||
fm_u16 event_status; //will use RDSFlag_Struct RDSFlag->flag_status to check which event, is that ok?
|
||||
struct rds_group_cnt_t gc;
|
||||
} rds_t;
|
||||
|
||||
|
||||
//Need care the following definition.
|
||||
//valid Rds Flag for notify
|
||||
typedef enum rds_flag_status_t {
|
||||
RDS_FLAG_IS_TP = 0x0001, // Program is a traffic program
|
||||
RDS_FLAG_IS_TA = 0x0002, // Program currently broadcasts a traffic ann.
|
||||
RDS_FLAG_IS_MUSIC = 0x0004, // Program currently broadcasts music
|
||||
RDS_FLAG_IS_STEREO = 0x0008, // Program is transmitted in stereo
|
||||
RDS_FLAG_IS_ARTIFICIAL_HEAD = 0x0010, // Program is an artificial head recording
|
||||
RDS_FLAG_IS_COMPRESSED = 0x0020, // Program content is compressed
|
||||
RDS_FLAG_IS_DYNAMIC_PTY = 0x0040, // Program type can change
|
||||
RDS_FLAG_TEXT_AB = 0x0080 // If this flag changes state, a new radio text string begins
|
||||
} rds_flag_status_t;
|
||||
|
||||
typedef enum rds_event_status_t {
|
||||
RDS_EVENT_FLAGS = 0x0001, // One of the RDS flags has changed state
|
||||
RDS_EVENT_PI_CODE = 0x0002, // The program identification code has changed
|
||||
RDS_EVENT_PTY_CODE = 0x0004, // The program type code has changed
|
||||
RDS_EVENT_PROGRAMNAME = 0x0008, // The program name has changed
|
||||
RDS_EVENT_UTCDATETIME = 0x0010, // A new UTC date/time is available
|
||||
RDS_EVENT_LOCDATETIME = 0x0020, // A new local date/time is available
|
||||
RDS_EVENT_LAST_RADIOTEXT = 0x0040, // A radio text string was completed
|
||||
RDS_EVENT_AF = 0x0080, // Current Channel RF signal strength too weak, need do AF switch
|
||||
RDS_EVENT_AF_LIST = 0x0100, // An alternative frequency list is ready
|
||||
RDS_EVENT_AFON_LIST = 0x0200, // An alternative frequency list is ready
|
||||
RDS_EVENT_TAON = 0x0400, // Other Network traffic announcement start
|
||||
RDS_EVENT_TAON_OFF = 0x0800, // Other Network traffic announcement finished.
|
||||
RDS_EVENT_RDS = 0x2000, // RDS Interrupt had arrived durint timer period
|
||||
RDS_EVENT_NO_RDS = 0x4000, // RDS Interrupt not arrived durint timer period
|
||||
RDS_EVENT_RDS_TIMER = 0x8000 // Timer for RDS Bler Check. ---- BLER block error rate
|
||||
} rds_event_status_t;
|
||||
|
||||
|
||||
#define RDS_LOG_SIZE 2
|
||||
struct rds_log_t {
|
||||
struct rds_rx_t rds_log[RDS_LOG_SIZE];
|
||||
fm_s32 log_len[RDS_LOG_SIZE];
|
||||
fm_u32 size;
|
||||
fm_u32 in;
|
||||
fm_u32 out;
|
||||
fm_u32 len;
|
||||
fm_s32(*log_in)(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
|
||||
fm_s32(*log_out)(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
|
||||
};
|
||||
|
||||
extern fm_s32 rds_parser(rds_t *rds_dst, struct rds_rx_t *rds_raw, fm_s32 rds_size, fm_u16(*getfreq)(void));
|
||||
extern fm_s32 rds_grp_counter_get(struct rds_group_cnt_t *dst, struct rds_group_cnt_t *src);
|
||||
extern fm_s32 rds_grp_counter_reset(struct rds_group_cnt_t *gc);
|
||||
extern fm_s32 rds_log_in(struct rds_log_t *thiz, struct rds_rx_t *new_log, fm_s32 new_len);
|
||||
extern fm_s32 rds_log_out(struct rds_log_t *thiz, struct rds_rx_t *dst, fm_s32 *dst_len);
|
||||
|
||||
|
||||
#define DEFINE_RDSLOG(name) \
|
||||
struct rds_log_t name = { \
|
||||
.size = RDS_LOG_SIZE, \
|
||||
.in = 0, \
|
||||
.out = 0, \
|
||||
.len = 0, \
|
||||
.log_in = rds_log_in, \
|
||||
.log_out = rds_log_out, \
|
||||
}
|
||||
|
||||
|
||||
#endif //__FM_RDS_H__
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
#ifndef __FM_STDLIB_H__
|
||||
#define __FM_STDLIB_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
#include <linux/string.h>
|
||||
|
||||
#if 1
|
||||
#define fm_memset(buf, a, len) \
|
||||
({ \
|
||||
void *__ret = (void*)0; \
|
||||
__ret = memset((buf), (a), (len)); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define fm_memcpy(dst, src, len) \
|
||||
({ \
|
||||
void *__ret = (void*)0; \
|
||||
__ret = memcpy((dst), (src), (len)); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define fm_malloc(len) \
|
||||
({ \
|
||||
void *__ret = (void*)0; \
|
||||
__ret = kmalloc(len, GFP_KERNEL); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define fm_zalloc(len) \
|
||||
({ \
|
||||
void *__ret = (void*)0; \
|
||||
__ret = kzalloc(len, GFP_KERNEL); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define fm_free(ptr) kfree(ptr)
|
||||
|
||||
#define fm_vmalloc(len) \
|
||||
({ \
|
||||
void *__ret = (void*)0; \
|
||||
__ret = vmalloc(len); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define fm_vfree(ptr) vfree(ptr)
|
||||
|
||||
#else
|
||||
inline void* fm_memset(void *buf, fm_s8 val, fm_s32 len)
|
||||
{
|
||||
return memset(buf, val, len);
|
||||
}
|
||||
|
||||
inline void* fm_memcpy(void *dst, const void *src, fm_s32 len)
|
||||
{
|
||||
return memcpy(dst, src, len);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif //__FM_STDLIB_H__
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
#ifndef __FM_TYPEDEF_H__
|
||||
#define __FM_TYPEDEF_H__
|
||||
|
||||
typedef signed char fm_s8;
|
||||
typedef signed short fm_s16;
|
||||
typedef signed int fm_s32;
|
||||
typedef signed long long fm_s64;
|
||||
typedef unsigned char fm_u8;
|
||||
typedef unsigned short fm_u16;
|
||||
typedef unsigned int fm_u32;
|
||||
typedef unsigned long long fm_u64;
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE (0)
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE (1)
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL (0)
|
||||
#endif
|
||||
|
||||
#ifndef BOOL
|
||||
typedef unsigned char BOOL;
|
||||
#endif
|
||||
|
||||
typedef enum fm_bool {
|
||||
fm_false = 0,
|
||||
fm_true = 1
|
||||
} fm_bool;
|
||||
|
||||
|
||||
#endif //__FM_TYPEDEF_H__
|
||||
|
||||
@@ -1,309 +0,0 @@
|
||||
#ifndef __FM_UTILS_H__
|
||||
#define __FM_UTILS_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
|
||||
|
||||
/**
|
||||
* Base structure of fm object
|
||||
*/
|
||||
#define FM_NAME_MAX 20
|
||||
struct fm_object {
|
||||
fm_s8 name[FM_NAME_MAX+1]; // name of fm object
|
||||
fm_u8 type; // type of fm object
|
||||
fm_u8 flag; // flag of fm object
|
||||
fm_s32 ref;
|
||||
void *priv;
|
||||
//struct fm_list *list; // list node of fm object
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* FM FIFO
|
||||
*/
|
||||
struct fm_fifo {
|
||||
struct fm_object obj;
|
||||
fm_s32 size;
|
||||
fm_s32 in;
|
||||
fm_s32 out;
|
||||
fm_s32 len;
|
||||
fm_s32 item_size;
|
||||
fm_s32 (*input)(struct fm_fifo *thiz, void *item);
|
||||
fm_s32 (*output)(struct fm_fifo *thiz, void *item);
|
||||
fm_bool (*is_full)(struct fm_fifo *thiz);
|
||||
fm_bool (*is_empty)(struct fm_fifo *thiz);
|
||||
fm_s32 (*get_total_len)(struct fm_fifo *thiz);
|
||||
fm_s32 (*get_valid_len)(struct fm_fifo *thiz);
|
||||
fm_s32 (*reset)(struct fm_fifo *thiz);
|
||||
};
|
||||
|
||||
extern struct fm_fifo* fm_fifo_init(struct fm_fifo* fifo, void *buf, const fm_s8 *name, fm_s32 item_size, fm_s32 item_num);
|
||||
|
||||
extern struct fm_fifo* fm_fifo_create(const fm_s8 *name, fm_s32 item_size, fm_s32 item_num);
|
||||
|
||||
extern fm_s32 fm_fifo_release(struct fm_fifo *fifo);
|
||||
|
||||
#define FM_FIFO_INPUT(fifop, item) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->input){ \
|
||||
__ret = (fifop)->input(fifop, item); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_OUTPUT(fifop, item) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->output){ \
|
||||
__ret = (fifop)->output(fifop, item); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_IS_FULL(fifop) \
|
||||
({ \
|
||||
fm_bool __ret = fm_false; \
|
||||
if(fifop && (fifop)->is_full){ \
|
||||
__ret = (fifop)->is_full(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_IS_EMPTY(fifop) \
|
||||
({ \
|
||||
fm_bool __ret = fm_false; \
|
||||
if(fifop && (fifop)->is_empty){ \
|
||||
__ret = (fifop)->is_empty(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_RESET(fifop) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->reset){ \
|
||||
__ret = (fifop)->reset(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_GET_TOTAL_LEN(fifop) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->get_total_len){ \
|
||||
__ret = (fifop)->get_total_len(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_FIFO_GET_VALID_LEN(fifop) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(fifop && (fifop)->get_valid_len){ \
|
||||
__ret = (fifop)->get_valid_len(fifop); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
|
||||
/*
|
||||
* FM asynchronous information mechanism
|
||||
*/
|
||||
struct fm_flag_event {
|
||||
fm_s32 ref;
|
||||
fm_s8 name[FM_NAME_MAX+1];
|
||||
void *priv;
|
||||
|
||||
volatile fm_u32 flag;
|
||||
|
||||
//flag methods
|
||||
fm_u32(*send)(struct fm_flag_event* thiz, fm_u32 mask);
|
||||
fm_s32(*wait)(struct fm_flag_event* thiz, fm_u32 mask);
|
||||
long(*wait_timeout)(struct fm_flag_event* thiz, fm_u32 mask, long timeout);
|
||||
fm_u32(*clr)(struct fm_flag_event* thiz, fm_u32 mask);
|
||||
fm_u32(*get)(struct fm_flag_event* thiz);
|
||||
fm_u32(*rst)(struct fm_flag_event* thiz);
|
||||
};
|
||||
|
||||
extern struct fm_flag_event* fm_flag_event_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_flag_event_get(struct fm_flag_event *thiz);
|
||||
|
||||
extern fm_s32 fm_flag_event_put(struct fm_flag_event *thiz);
|
||||
|
||||
#define FM_EVENT_SEND(eventp, mask) \
|
||||
({ \
|
||||
fm_u32 __ret = (fm_u32)0; \
|
||||
if(eventp && (eventp)->send){ \
|
||||
__ret = (eventp)->send(eventp, mask); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_EVENT_WAIT(eventp, mask) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(eventp && (eventp)->wait){ \
|
||||
__ret = (eventp)->wait(eventp, mask); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_EVENT_WAIT_TIMEOUT(eventp, mask, timeout) \
|
||||
({ \
|
||||
long __ret = (long)0; \
|
||||
if(eventp && (eventp)->wait_timeout){ \
|
||||
__ret = (eventp)->wait_timeout(eventp, mask, timeout); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_EVENT_GET(eventp) \
|
||||
({ \
|
||||
fm_u32 __ret = (fm_u32)0; \
|
||||
if(eventp && (eventp)->get){ \
|
||||
__ret = (eventp)->get(eventp); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_EVENT_RESET(eventp) \
|
||||
({ \
|
||||
fm_u32 __ret = (fm_u32)0; \
|
||||
if(eventp && (eventp)->rst){ \
|
||||
__ret = (eventp)->rst(eventp); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_EVENT_CLR(eventp, mask) \
|
||||
({ \
|
||||
fm_u32 __ret = (fm_u32)0; \
|
||||
if(eventp && (eventp)->clr){ \
|
||||
__ret = (eventp)->clr(eventp, mask); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/*
|
||||
* FM lock mechanism
|
||||
*/
|
||||
struct fm_lock {
|
||||
fm_s8 name[FM_NAME_MAX+1];
|
||||
fm_s32 ref;
|
||||
void *priv;
|
||||
|
||||
//lock methods
|
||||
fm_s32(*lock)(struct fm_lock* thiz);
|
||||
fm_s32(*trylock)(struct fm_lock *thiz,fm_s32 retryCnt);
|
||||
fm_s32(*unlock)(struct fm_lock* thiz);
|
||||
};
|
||||
|
||||
extern struct fm_lock* fm_lock_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_lock_get(struct fm_lock *thiz);
|
||||
|
||||
extern fm_s32 fm_lock_put(struct fm_lock *thiz);
|
||||
|
||||
extern struct fm_lock* fm_spin_lock_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_spin_lock_get(struct fm_lock *thiz);
|
||||
|
||||
extern fm_s32 fm_spin_lock_put(struct fm_lock *thiz);
|
||||
|
||||
#define FM_LOCK(a) \
|
||||
({ \
|
||||
fm_s32 __ret = (fm_s32)0; \
|
||||
if(a && (a)->lock){ \
|
||||
__ret = (a)->lock(a); \
|
||||
} \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define FM_UNLOCK(a) \
|
||||
{ \
|
||||
if((a)->unlock){ \
|
||||
(a)->unlock(a); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FM timer mechanism
|
||||
*/
|
||||
enum fm_timer_ctrl {
|
||||
FM_TIMER_CTRL_GET_TIME = 0,
|
||||
FM_TIMER_CTRL_SET_TIME = 1,
|
||||
FM_TIMER_CTRL_MAX
|
||||
};
|
||||
|
||||
#define FM_TIMER_FLAG_ACTIVATED (1<<0)
|
||||
|
||||
struct fm_timer {
|
||||
fm_s32 ref;
|
||||
fm_s8 name[FM_NAME_MAX+1];
|
||||
void *priv; // platform detail impliment
|
||||
|
||||
fm_s32 flag; // timer active/inactive
|
||||
void (*timeout_func)(unsigned long data); // timeout function
|
||||
unsigned long data; // timeout function's parameter
|
||||
signed long timeout_ms; // timeout tick
|
||||
//Tx parameters
|
||||
volatile fm_u32 count;
|
||||
volatile fm_u8 tx_pwr_ctrl_en;
|
||||
volatile fm_u8 tx_rtc_ctrl_en;
|
||||
volatile fm_u8 tx_desense_en;
|
||||
|
||||
//timer methods
|
||||
fm_s32(*init)(struct fm_timer *thiz, void (*timeout)(unsigned long data), unsigned long data, signed long time, fm_s32 flag);
|
||||
fm_s32(*start)(struct fm_timer *thiz);
|
||||
fm_s32(*update)(struct fm_timer *thiz);
|
||||
fm_s32(*stop)(struct fm_timer *thiz);
|
||||
fm_s32(*control)(struct fm_timer *thiz, enum fm_timer_ctrl cmd, void* arg);
|
||||
};
|
||||
|
||||
extern struct fm_timer* fm_timer_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_timer_get(struct fm_timer *thiz);
|
||||
|
||||
extern fm_s32 fm_timer_put(struct fm_timer *thiz);
|
||||
|
||||
/*
|
||||
* FM work thread mechanism
|
||||
*/
|
||||
struct fm_work {
|
||||
fm_s32 ref;
|
||||
fm_s8 name[FM_NAME_MAX+1];
|
||||
void *priv;
|
||||
|
||||
void (*work_func)(unsigned long data);
|
||||
unsigned long data;
|
||||
//work methods
|
||||
fm_s32(*init)(struct fm_work *thiz, void (*work_func)(unsigned long data), unsigned long data);
|
||||
};
|
||||
|
||||
extern struct fm_work* fm_work_create(const fm_s8 *name);
|
||||
|
||||
extern fm_s32 fm_work_get(struct fm_work *thiz);
|
||||
|
||||
extern fm_s32 fm_work_put(struct fm_work *thiz);
|
||||
|
||||
|
||||
struct fm_workthread {
|
||||
fm_s32 ref;
|
||||
fm_s8 name[FM_NAME_MAX+1];
|
||||
void *priv;
|
||||
|
||||
//workthread methods
|
||||
fm_s32(*add_work)(struct fm_workthread *thiz, struct fm_work *work);
|
||||
};
|
||||
|
||||
extern struct fm_workthread* fm_workthread_create(const fm_s8* name);
|
||||
|
||||
extern fm_s32 fm_workthread_get(struct fm_workthread *thiz);
|
||||
|
||||
extern fm_s32 fm_workthread_put(struct fm_workthread *thiz);
|
||||
|
||||
#endif //__FM_UTILS_H__
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/* mt6620_fm.h
|
||||
*
|
||||
* (C) Copyright 2011
|
||||
* MediaTek <www.MediaTek.com>
|
||||
* Hongcheng <hongcheng.xia@MediaTek.com>
|
||||
*
|
||||
* MT6620 FM Radio Driver -- head file
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
#ifndef __MT6620_FM_H__
|
||||
#define __MT6620_FM_H__
|
||||
|
||||
#include "fm_typedef.h"
|
||||
|
||||
//#define FM_PowerOn_with_ShortAntenna
|
||||
#define MT6620_RSSI_TH_LONG 0xFF01 //FM radio long antenna RSSI threshold(11.375dBuV)
|
||||
#define MT6620_RSSI_TH_SHORT 0xFEE0 //FM radio short antenna RSSI threshold(-1dBuV)
|
||||
#define MT6620_CQI_TH 0x00E9 //FM radio Channel quality indicator threshold(0x0000~0x00FF)
|
||||
#define MT6620_SEEK_SPACE 1 //FM radio seek space,1:100KHZ; 2:200KHZ
|
||||
#define MT6620_SCAN_CH_SIZE 40 //FM radio scan max channel size
|
||||
#define MT6620_BAND 1 //FM radio band, 1:87.5MHz~108.0MHz; 2:76.0MHz~90.0MHz; 3:76.0MHz~108.0MHz; 4:special
|
||||
#define MT6620_BAND_FREQ_L 875 //FM radio special band low freq(Default 87.5MHz)
|
||||
#define MT6620_BAND_FREQ_H 1080 //FM radio special band high freq(Default 108.0MHz)
|
||||
#define MT6620_DEEMPHASIS_50us TRUE
|
||||
|
||||
#define MT6620_SLAVE_ADDR 0xE0 //0x70 7-bit address
|
||||
#define MT6620_MAX_COUNT 100
|
||||
#define MT6620_SCANTBL_SIZE 16 //16*uinit16_t
|
||||
|
||||
#define AFC_ON 0x01
|
||||
#if AFC_ON
|
||||
#define FM_MAIN_CTRL_INIT 0x480
|
||||
#else
|
||||
#define FM_MAIN_CTRL_INIT 0x080
|
||||
#endif
|
||||
|
||||
#define ext_clk //if define ext_clk use external reference clock or mask will use internal
|
||||
#define MT6620_DEV "MT6620"
|
||||
|
||||
#endif //end of #ifndef __MT6620_FM_H__
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
#ifndef __MT6620_FM_CMD_H__
|
||||
#define __MT6620_FM_CMD_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
#include "fm_typedef.h"
|
||||
|
||||
/* FM basic-operation's opcode */
|
||||
#define FM_BOP_BASE (0x80)
|
||||
enum {
|
||||
FM_WRITE_BASIC_OP = (FM_BOP_BASE + 0x00),
|
||||
FM_UDELAY_BASIC_OP = (FM_BOP_BASE + 0x01),
|
||||
FM_RD_UNTIL_BASIC_OP = (FM_BOP_BASE + 0x02),
|
||||
FM_MODIFY_BASIC_OP = (FM_BOP_BASE + 0x03),
|
||||
FM_MSLEEP_BASIC_OP = (FM_BOP_BASE + 0x04),
|
||||
FM_MAX_BASIC_OP = (FM_BOP_BASE + 0x05)
|
||||
};
|
||||
|
||||
/* FM BOP's size */
|
||||
#define FM_WRITE_BASIC_OP_SIZE (3)
|
||||
#define FM_UDELAY_BASIC_OP_SIZE (4)
|
||||
#define FM_RD_UNTIL_BASIC_OP_SIZE (5)
|
||||
#define FM_MODIFY_BASIC_OP_SIZE (5)
|
||||
#define FM_MSLEEP_BASIC_OP_SIZE (4)
|
||||
|
||||
fm_s32 mt6620_off_2_longANA_1(fm_u8 *buf, fm_s32 buf_size);
|
||||
fm_s32 mt6620_off_2_longANA_2(fm_u8 *buf, fm_s32 buf_size);
|
||||
|
||||
fm_s32 mt6620_pwrup_digital_init_1(fm_u8 *buf, fm_s32 buf_size);
|
||||
fm_s32 mt6620_pwrup_digital_init_2(fm_u8 *buf, fm_s32 buf_size);
|
||||
fm_s32 mt6620_pwrup_digital_init_3(fm_u8 *buf, fm_s32 buf_size);
|
||||
|
||||
fm_s32 mt6620_pwrdown(fm_u8 *buf, fm_s32 buf_size);
|
||||
fm_s32 mt6620_rampdown(fm_u8 *buf, fm_s32 buf_size);
|
||||
|
||||
fm_s32 mt6620_tune_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
|
||||
fm_s32 mt6620_tune_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
|
||||
fm_s32 mt6620_tune_3(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq);
|
||||
fm_s32 mt6620_fast_tune(fm_u8 *tx_buf, fm_s32 tx_buf_size, fm_u16 freq);
|
||||
fm_s32 mt6620_full_cqi_req(fm_u8 *buf, fm_s32 buf_size, fm_u16 freq, fm_s32 cnt, fm_s32 type);
|
||||
|
||||
fm_s32 mt6620_seek_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, fm_u16 min_freq);
|
||||
fm_s32 mt6620_seek_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 seekdir, fm_u16 space, fm_u16 max_freq, fm_u16 min_freq);
|
||||
|
||||
fm_s32 mt6620_scan_1(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, fm_u16 min_freq);
|
||||
fm_s32 mt6620_scan_2(fm_u8 *buf, fm_s32 buf_size, fm_u16 scandir, fm_u16 space, fm_u16 max_freq, fm_u16 min_freq);
|
||||
|
||||
fm_s32 mt6620_get_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr);
|
||||
fm_s32 mt6620_set_reg(fm_u8 *buf, fm_s32 buf_size, fm_u8 addr, fm_u16 value);
|
||||
fm_s32 mt6620_rampdown_tx(unsigned char *tx_buf, int tx_buf_size);
|
||||
fm_s32 mt6620_tune_txscan(unsigned char *tx_buf, int tx_buf_size, uint16_t freq);
|
||||
fm_s32 mt6620_tune_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t freq);
|
||||
fm_s32 mt6620_rds_rx_enable(unsigned char *tx_buf, int tx_buf_size);
|
||||
fm_s32 mt6620_rds_rx_disable(unsigned char *tx_buf, int tx_buf_size);
|
||||
fm_s32 mt6620_rds_tx(unsigned char *tx_buf, int tx_buf_size, uint16_t pi, uint16_t *ps, uint16_t *other_rds, uint8_t other_rds_cnt);
|
||||
fm_s32 mt6620_off_2_tx_shortANA(fm_u8 *tx_buf, fm_s32 tx_buf_size);
|
||||
fm_s32 mt6620_dig_init(fm_u8 *tx_buf, fm_s32 tx_buf_size);
|
||||
|
||||
extern fm_s32 fm_get_channel_space(int freq);
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user