• Join
  • Sign In with my.TI Login
Texas Instruments
  • Products
  • Applications
  • Tools & Software
  • Support & Community
  • Sample & Buy
  • About TI
Sample & Purchase Cart Sample & Purchase Cart
  • Search
  • Advanced
TI E2E™ Community
  • Support Forums
  • Blogs
  • Groups
  • Videos
  • 简体中文
  • More ...
TI Home » TI E2E Community » Support Forums » OMAP™ Applications Processors » OMAP 4 Forum » PMU with Custom Module
Share
OMAP™ Applications Processors
  • Forums
Options
  • Subscribe via RSS

PMU with Custom Module

PMU with Custom Module

This question is answered
John Demme
Posted by John Demme
on Aug 07 2012 15:46 PM

Hello All,

I'm trying to write a custom module on top of the Android 4.1 kernel to use the OMAP4460's performance counters. Before you ask, no, I cannot use perf or oprofile; they do not yield the information I need. This is rather odd data I'm attempting to collect.

Regardless, I can't get the counters to, well, count. I'm using the v7_pmu.S code from:

http://code.google.com/p/mycodespot/wiki/DirectPMUCodeGCC

Along with my module code, which I've put here:

http://gist.github.com/3289014#file_pmu_sync_sample_main.c

And build it against the Android 3.0.31 kernel ("3.0.31-g6fb96c9-dirty"). I'm then running it on a rooted Samsung Galaxy Nexus. Examples of the dmesg output can be found on the above page.

I'm having two problems:

1) After configuring and enabling the counters, they remain at 0 -- they don't count. The cycle counter, however, seems to work OK. I've looked at a lot of code for using these counters -- from oprofile, perf and the directPMU link above -- and as far as I can tell, I'm doing the same thing. Yet no luck. What am I missing? Is there another bit somewhere that needs to be flipped? Is Linux enabling some oddball security mode (with which I'm not familiar) that has to be disabled?

2) If I sleep for a second before reading the counters, they come up as gibberish. It's like some other process (or part of the kernel) is using them. In addition to disabling all PMU stuff in my kernel's config, I've grepped the kernel code for all writes to the PMU registers and commented them out. I am now running a custom kernel, thought it made no difference. (I only found PMU register writes in some SMC security code and the perf_event code.) So what could be interfering? Are these registers being context swapped? Is there some other code I haven't found that uses them or the PMU?

I've been banging my head against the wall on this for longer than I'd care to admit, so I'd appreciate some help.

Thanks in advance,

John

4460 PMU Linux android
Report Abuse
  • Reply
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
All Replies
  • Magdalena Iovescu
    Posted by Magdalena Iovescu
    on Aug 07 2012 15:58 PM
    Intellectual2480 points

    Hello John,

    Have you seen this thread about a similar issue: http://e2e.ti.com/support/omap/f/849/p/184885/667248.aspx#667248

    Regards,

    Magdalena

     

    Please click the Verify Answer button on this post if it answers your question

    _____________________________________________

    Be sure to read the OMAP4 and OMAP5 Forum Guidelines and FAQ

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 07 2012 16:01 PM
    Intellectual0 points

    Yes I have. Unfortunately, none of the pointers from that response helped.

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Gina Glaser
    Posted by Gina Glaser
    on Aug 08 2012 11:04 AM
    Expert8055 points

    John,

    Something people have run into in the past is that, in order to get to the counters, you need to clock them.  If you are connecting a debugger, then these clocks I believe are automatically enabled.  For example:

            writereg(OMAP4430_CM_EMU_CLKSTCTRL, 0x2);
            writereg(OMAP4430_CM_L3INSTR_L3_3_CLKCTRL, 0x1);
            writereg(OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL, 0x1);
            writereg(OMAP4430_PRM_PRM_PROFILING_CLKCTRL, 0x1);

    Regards,
    Gina 

    Please click the Verify Answer button on this post if it answers your question

    _______________________________________________________

    Be sure to read the OMAP4 and OMAP5 Forum Guidelines and FAQ 

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 08 2012 14:34 PM
    Expert3245 points

    Gina Glaser

    Something people have run into in the past is that, in order to get to the counters, you need to clock them.  If you are connecting a debugger, then these clocks I believe are automatically enabled.  For example:


            writereg(OMAP4430_CM_EMU_CLKSTCTRL, 0x2);
            writereg(OMAP4430_CM_L3INSTR_L3_3_CLKCTRL, 0x1);
            writereg(OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL, 0x1);
            writereg(OMAP4430_PRM_PRM_PROFILING_CLKCTRL, 0x1);

    If you are using an OMAP4460 then only the EMU power domain needs to be enabled to get the PMU counters working. To enable the EMU power domain you just need to turn on the clocks to the EMU power domain by writing 0x2 to OMAP4430_CM_EMU_CLKSTCTRL as Gina mentions above. The other 3 register writes are only necessary for OMAP4430 that does not have dedicated PMU interrupts and PMU events are routed using the cross trigger interface (CTI).

    I have tested PMU with the latest linux kernel with OMAP4460 plus a patch series I am keeping here:

    git@gitorious.org:linux-omap-dev/linux-omap-dev.git -b dev-pmu

    Cheers
    Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 09 2012 14:51 PM
    Expert0 points

    Thanks for the help. I think this has gotten me one step closer, but I'm still missing something. I've added this code:

    __raw_writel(2, OMAP4430_CM_EMU_CLKSTCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_3_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_PRM_PROFILING_CLKCTRL);

    Which seems to have helped a bit. At boot, the register contents were:

    [ 135.988250] State: OMAP4430_PM_EMU_PWRSTCTRL 0x30000
    [ 135.988494] State: OMAP4430_PM_EMU_PWRSTST 0x0
    [ 135.988647] State: OMAP4430_RM_EMU_DEBUGSS_CONTEXT 0x101
    [ 135.988891] State: OMAP4430_CM_EMU_CLKSTCTRL 0x3
    [ 135.989044] State: OMAP4430_CM_EMU_DYNAMICDEP 0x4000040
    [ 135.989288] State: OMAP4430_CM_EMU_DEBUGSS_CLKCTRL 0x9060001
    [ 135.989471] State: OMAP4430_CM_L3INSTR_L3_3_CLKCTRL 0x1
    [ 135.989685] State: OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL 0x1
    [ 135.989868] State: OMAP4430_CM_PRM_PROFILING_CLKCTRL 0x20001

    So the module was definitely disabled. After writing, I get the state to:

    [ 135.990264] State: OMAP4430_PM_EMU_PWRSTCTRL 0x30000
    [ 135.990417] State: OMAP4430_PM_EMU_PWRSTST 0x37
    [ 135.990661] State: OMAP4430_RM_EMU_DEBUGSS_CONTEXT 0x101
    [ 135.990814] State: OMAP4430_CM_EMU_CLKSTCTRL 0x302
    [ 135.991058] State: OMAP4430_CM_EMU_DYNAMICDEP 0x4000040
    [ 135.991210] State: OMAP4430_CM_EMU_DEBUGSS_CLKCTRL 0x9040001
    [ 135.991455] State: OMAP4430_CM_L3INSTR_L3_3_CLKCTRL 0x1
    [ 135.991607] State: OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL 0x1
    [ 135.991851] State: OMAP4430_CM_PRM_PROFILING_CLKCTRL 0x1

    So it appears to be enabled. However, I still have the same problem: the counters still don't increment.

    So, two more questions: (1) If the above registers say that the modules are enabled (as they appear to) are the modules definitely enabled, or could other disabled modules (i.e. disabled clock domains feeding these modules) still cause the module to be disabled? (2) Are there any other common problems?

    As for your kernel branch Jon, thanks for the pointer. I've actually been trying to clone your repo there for about a week (gitorious disconnect problems) and finally succeeded today. I will look further at the patches in that branch to determine what I'm missing. I should probably also use the Linux clock domain management stuff rather than just writing these values, yes? I'm not familiar with that subsystem so I haven't tried to use it yet.

    Thanks again,

    John

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 09 2012 15:19 PM
    Expert3245 points

    John Demme

    Thanks for the help. I think this has gotten me one step closer, but I'm still missing something. I've added this code:

    __raw_writel(2, OMAP4430_CM_EMU_CLKSTCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_3_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_PRM_PROFILING_CLKCTRL);

    Which seems to have helped a bit. At boot, the register contents were:

    [ 135.988250] State: OMAP4430_PM_EMU_PWRSTCTRL 0x30000
    [ 135.988494] State: OMAP4430_PM_EMU_PWRSTST 0x0
    [ 135.988647] State: OMAP4430_RM_EMU_DEBUGSS_CONTEXT 0x101
    [ 135.988891] State: OMAP4430_CM_EMU_CLKSTCTRL 0x3
    [ 135.989044] State: OMAP4430_CM_EMU_DYNAMICDEP 0x4000040
    [ 135.989288] State: OMAP4430_CM_EMU_DEBUGSS_CLKCTRL 0x9060001
    [ 135.989471] State: OMAP4430_CM_L3INSTR_L3_3_CLKCTRL 0x1
    [ 135.989685] State: OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL 0x1
    [ 135.989868] State: OMAP4430_CM_PRM_PROFILING_CLKCTRL 0x20001

    So the module was definitely disabled. After writing, I get the state to:

    [ 135.990264] State: OMAP4430_PM_EMU_PWRSTCTRL 0x30000
    [ 135.990417] State: OMAP4430_PM_EMU_PWRSTST 0x37
    [ 135.990661] State: OMAP4430_RM_EMU_DEBUGSS_CONTEXT 0x101
    [ 135.990814] State: OMAP4430_CM_EMU_CLKSTCTRL 0x302
    [ 135.991058] State: OMAP4430_CM_EMU_DYNAMICDEP 0x4000040
    [ 135.991210] State: OMAP4430_CM_EMU_DEBUGSS_CLKCTRL 0x9040001
    [ 135.991455] State: OMAP4430_CM_L3INSTR_L3_3_CLKCTRL 0x1
    [ 135.991607] State: OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL 0x1
    [ 135.991851] State: OMAP4430_CM_PRM_PROFILING_CLKCTRL 0x1

    So it appears to be enabled. However, I still have the same problem: the counters still don't increment.

    The above registers look good.

    So, two more questions: (1) If the above registers say that the modules are enabled (as they appear to) are the modules definitely enabled, or could other disabled modules (i.e. disabled clock domains feeding these modules) still cause the module to be disabled? (2) Are there any other common problems?

    (1). Yes the MPU power domain. If you are using the Android kernel then most likely the MPU power domain is transitioning in and out of low power. This will definitely cause the PMU to lose its logic state. Right now I am using setting a QoS constraint when PMU is active to prevent the MPU sub-system from hitting low power states. See:

    https://gitorious.org/linux-omap-dev/linux-omap-dev/commit/12cb83b749337a5c2edcdc92e29f22493f7ce94a

    For a test you could also try disabling CPU-idle in the kernel configuration too.

    (2). Not that I can think of. Just MPU and EMU power domains.

    As for your kernel branch Jon, thanks for the pointer. I've actually been trying to clone your repo there for about a week (gitorious disconnect problems) and finally succeeded today. I will look further at the patches in that branch to determine what I'm missing. I should probably also use the Linux clock domain management stuff rather than just writing these values, yes? I'm not familiar with that subsystem so I haven't tried to use it yet.

    Sorry about that I have been having some problems with gitorious myself. The gitorious folks were pushing some fixes to fix some problems, but I may switch over to github if it continues to be a problem.

    Cheers
    Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 10 2012 17:51 PM
    Expert0 points

    Jon Hunter

    (1). Yes the MPU power domain. If you are using the Android kernel then most likely the MPU power domain is transitioning in and out of low power. This will definitely cause the PMU to lose its logic state. Right now I am using setting a QoS constraint when PMU is active to prevent the MPU sub-system from hitting low power states. See:

    https://gitorious.org/linux-omap-dev/linux-omap-dev/commit/12cb83b749337a5c2edcdc92e29f22493f7ce94a

    For a test you could also try disabling CPU-idle in the kernel configuration too.

    OK. This has gotten me one step closer. If I recompile without CPU-idle support, then I no longer ever read gibberish from the counters. So that solves original problem number 2. Thanks!

    Unfortunately, the counters still aren't counting. (I've also switched to turning on the clock/power with calls to the clock subsystem rather than register writes to no avail.) There seems to be one more possible problem: non-invasive debug authentication. According to table c7-3 in the ARM archiecture manual, if non-invasive debug isn't enabled, the event counters won't be enabled. Further, whether or not non-invasive debug is enabled is a combination of DBGEN, NIDEN and secure mode signals. I haven't seen mention of these signals in the OMAP documentation. Is it possible they are set wrong? Does anyone know how they are controlled?

    Jon Hunter

    Sorry about that I have been having some problems with gitorious myself. The gitorious folks were pushing some fixes to fix some problems, but I may switch over to github if it continues to be a problem.

    Personally, I love Github. I've never seen it beat, so vote++.

    Thanks again for the help,

    John

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 10 2012 18:01 PM
    Expert0 points

    John Demme

    Unfortunately, the counters still aren't counting. (I've also switched to turning on the clock/power with calls to the clock subsystem rather than register writes to no avail.) There seems to be one more possible problem: non-invasive debug authentication. According to table c7-3 in the ARM archiecture manual, if non-invasive debug isn't enabled, the event counters won't be enabled. Further, whether or not non-invasive debug is enabled is a combination of DBGEN, NIDEN and secure mode signals. I haven't seen mention of these signals in the OMAP documentation. Is it possible they are set wrong? Does anyone know how they are controlled?

    Sorry, I've posted too quickly. Turns out DBGAUTHSTATUS lets me read these values. In fact bit 2 is "non-secure non-invasive debug enabled" and bit 6 is the secure version. (Table C10.8.7 of the ARM manual). When I read the register on my processor, it's 0xAA. So non-invasive debug is not enabled. This must be why my counters aren't counting. Any clues how to push DBGEN or NIDEN high? (Are they signals exposed to the PCB, software controlled or something else?)

    Thanks,

    John

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Mihai Pricopi
    Posted by Mihai Pricopi
    on Aug 12 2012 07:09 AM
    Prodigy10 points

    Hi John,

     I am facing the same problem here with a OMAP4460. I am not very experienced with the linux kernel. Can I ask where did you call these functions;

    __raw_writel(2, OMAP4430_CM_EMU_CLKSTCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_3_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_PRM_PROFILING_CLKCTRL);

    I tried setting OMAP4430_CM_EMU_CLKSTCTRL inside omap_pm_init() in pm44xx.c but the value was not set. Do I miss something ?

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 13 2012 13:59 PM
    Expert3245 points

    John Demme

    Sorry, I've posted too quickly. Turns out DBGAUTHSTATUS lets me read these values. In fact bit 2 is "non-secure non-invasive debug enabled" and bit 6 is the secure version. (Table C10.8.7 of the ARM manual). When I read the register on my processor, it's 0xAA. So non-invasive debug is not enabled. This must be why my counters aren't counting. Any clues how to push DBGEN or NIDEN high? (Are they signals exposed to the PCB, software controlled or something else?)

    The signals DBGEN and NIDEN are definitely internal signals, so they are nothing that you would be exposed externally and connect to the PCB.

    In my testing, I am using PERF and so the kernel PMU driver is configuring the counters. So may be there is something different in the programming of the PMU between your kernel module and the kernel itself. I am currently out of the office but I can probably take a closer look at this later in the week.

    Cheers
    Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 13 2012 14:01 PM
    Expert0 points

    Mihai Pricopi

    Hi John,

     I am facing the same problem here with a OMAP4460. I am not very experienced with the linux kernel. Can I ask where did you call these functions;

    __raw_writel(2, OMAP4430_CM_EMU_CLKSTCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_3_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL);
    __raw_writel(1, OMAP4430_CM_PRM_PROFILING_CLKCTRL);

    I tried setting OMAP4430_CM_EMU_CLKSTCTRL inside omap_pm_init() in pm44xx.c but the value was not set. Do I miss something ?

    Hi Mihai,

    I'm writing a custom kernel module, so I'm calling them in my own code. If you want to put them in existing kernel code, I'm not sure where an appropriate place would be. However, you probably have to be careful about putting them in initialization code -- Linux could easily override your values shortly after you set them. There's some pretty extensive clock/power domain management code which determines which domains have to be enabled. I should also add that I haven't made them work yet, so you shouldn't necessarily believe what I'm saying.

    ~John

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 16 2012 15:37 PM
    Verified Answer
    Verified by Gina Glaser
    Expert3245 points

    John Demme

    Sorry, I've posted too quickly. Turns out DBGAUTHSTATUS lets me read these values. In fact bit 2 is "non-secure non-invasive debug enabled" and bit 6 is the secure version. (Table C10.8.7 of the ARM manual). When I read the register on my processor, it's 0xAA. So non-invasive debug is not enabled. This must be why my counters aren't counting. Any clues how to push DBGEN or NIDEN high? (Are they signals exposed to the PCB, software controlled or something else?)

    Hi John,

    I did some quick testing today and I found that if I keep the EMU power domain in the off state (by setting CM_EMU_CLKSTCTRL = 0x3), then I also see that DBGAUTHSTATUS = 0xAA. However, once I power up the EMU power domain (by setting CM_EMU_CLKSTCTRL = 0x2), then I see that DBGAUTHSTATUS = 0xAF. So you are definitely on the right lines here. The problem is I am not sure why powering up the EMU power domain is not working for you.

    When you power up the EMU power domain, are you waiting for the EMU power domain to come out of idle? The IDLEST field in the CM_EMU_DEBUGSS_CLKCTRL register will indicate when the power domain is out of idle. The PM_EMU_PWRSTST register should also show the power domain is ON-ACTIVE too.

    Cheers
    Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 16 2012 15:40 PM
    Expert3245 points

    By the way, I am reading the DBGAUTHSTATUS just as the counters are being enabled in the kernel. Cheers Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • Jon Hunter
    Posted by Jon Hunter
    on Aug 16 2012 15:57 PM
    Expert3245 points

    John Demme

    Personally, I love Github. I've never seen it beat, so vote++.

    I have now created a github account and mirrored my pmu branch here:

    https://github.com/jonhunter/linux/tree/dev-pmu

    Cheers
    Jon

     
    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
  • John Demme
    Posted by John Demme
    on Aug 20 2012 14:37 PM
    Expert0 points

    Jon Hunter

    I did some quick testing today and I found that if I keep the EMU power domain in the off state (by setting CM_EMU_CLKSTCTRL = 0x3), then I also see that DBGAUTHSTATUS = 0xAA. However, once I power up the EMU power domain (by setting CM_EMU_CLKSTCTRL = 0x2), then I see that DBGAUTHSTATUS = 0xAF. So you are definitely on the right lines here. The problem is I am not sure why powering up the EMU power domain is not working for you.

    When you power up the EMU power domain, are you waiting for the EMU power domain to come out of idle? The IDLEST field in the CM_EMU_DEBUGSS_CLKCTRL register will indicate when the power domain is out of idle. The PM_EMU_PWRSTST register should also show the power domain is ON-ACTIVE too.

    Hmm. Interesting. I am indeed waiting for the IDLEST field to go to 0 and indeed it does. It seems to happy very quickly. However, I just noticed that the next field, CM_EMU_DEBUGSS_CLKCTRL.STBYST remains as 1, indicating the module is in standby. If I wait on STBYST as well, it freezes, indicating that the module never exits standby. So, what can cause it to remain in standby after I ungate the clock with CM_EMU_CLKSTCTRL = 0x2?

    As for PM_EMU_PWRSTST, I'm finding the documentation a bit confusing. 

    LASTPOWERSTATEENTERED:  " Last low power state entered. Set to 0x3 upon write of the same only. This register is intended for debug purpose only."

    Does this mean I have to set it to 0x3 and see if it stays there or something odd? If I only read from it, it stays at 0x0. This indicates to me that the module isn't powered. However, if I set it to 0x3 then it stays there. 

    Any further suggestions? Thanks a lot for your help

    ~John

    Report Abuse
    • Reply
    You have posted to a forum that requires a moderator to approve posts before they are publicly available.
12
TI E2E™ Community
  • Support Forums
  • Blogs
  • Videos
  • Groups
  • Site Support & Feedback
  • Settings
TI E2E™ Community Groups
  • TI University Program
  • Make the Switch
  • Microcontroller Projects
  • Motor Drive & Control
Other Communities
  • Deyisupport
  • Designsomething.org
  • beagleboard.org
  • TI on Element 14
  • TI on TechXchangeSM
Other Technical & Support Resources
  • WEBENCH® Design Center
  • Product Information Centers
  • Technical Documents
  • TI Design Network
  • TI Technical Articles
  • TI Training

All content and materials on this site are provided "as is". TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with regard to these materials, including but not limited to all implied warranties and conditions of merchantability, fitness for a particular purpose, title and non-infringement of any third party intellectual property right. TI and its respective suppliers and providers of content make no representations about the suitability of these materials for any purpose and disclaim all warranties and conditions with respect to these materials. No license, either express or implied, by estoppel or otherwise, is granted by TI. Use of the information on this site may require a license from a third party, or a license from TI.

Content on this site may contain or be subject to specific guidelines or limitations on use. All postings and use of the content on this site are subject to the Terms of Use of the site; third parties using this content agree to abide by any limitations or guidelines and to comply with the Terms of Use of this site. TI, its suppliers and providers of content reserve the right to make corrections, deletions, modifications, enhancements, improvements and other changes to the content and materials, its products, programs and services at any time or to move or discontinue any content, products, programs, or services without notice.

Follow Us Texas Instruments on Facebook Texas Instruments on Twitter Texas Instruments on LinkedIn Texas Instruments on Google+
TI Worldwide | Contact Us | my.TI Login | Site Map | Corporate Citizenship | mobile m.ti.com (Mobile Version)

TI is a global semiconductor design and manufacturing company. Innovate with 100,000+ analog ICs and
embedded processors, along with software, tools and the industry’s largest sales/support staff.

© Copyright 1995-2013 Texas Instruments Incorporated. All rights reserved.
Trademarks | Privacy Policy | Terms of Use